前言

关于阿里云ONS我这里不多介绍,用的话直接去看官网,这里提几个实际对接的问题
问题一:
TCP版的不支持本地调试,只支持公网链接
在这里插入图片描述

问题二:
ONS不支持批量消息
在这里插入图片描述
问题三:
ONS延迟消息的时间是可以自定义的,其内部实现和RocketMQ是不同的,这个可以查看往期文章RocketMQ-延迟消息

整合

关于ONS的API使用,其实并不是本文的重点,这个看看官方文档就行了阿里云ONS
在这里插入图片描述
那么本文的重点在于整合,阿里云的ONS其实收费还是挺高的,有一条收费条款是API消耗,这个有点划不来,我们知道消费者需要拉消息消费,那么按道理来说有消息就算消息么,这也没问题,但是ONS既然把没有消息是consumer的长轮询(ONS是15S一次),这个也算API消耗,而且Topic越多,消费者越多,消耗是成指数级别增长的,那么为了降低成本,我们可以在测试环境,开发环境上不适用ONS,测试、开发环境我们可以自己搭建RocketMQ,那么这样我们就可以降低一些成本,这里ONS对接使用的是ons-client,而RocketMQ使用的是(rocketmq-client或者rocketmq-spring-boot-starter)那么这里就是两套API了,其API的实现,调用,配置,是有很大的区别,所以这里要在不同的环境使用不同的client工具,生产环境使用ONS,测试环境、开发环境使用RocketMQ,根据不同的环境自动切换client对接API,那么这里就需要对这两套client工具进行整合。首先我们整合需要先了解ocketmq-client和rocketmq-spring-boot-starter有哪些API,其内部实现是怎么样的,过去关于这里已经写好文章,做好铺垫了见往期文章JAVA使用rocketmq-client整合RocketMQspringboot使用rocketmq-spring-boot-starter整合RocketMQ,这里整合的思路是按照rocketmq-spring-boot-starter的设计思路,产考rocketmq-spring-boot-starter的API实现,这里就是为了方便使用者在会使用rocketmq-spring-boot-starter的前提下,无序太多看文档,就能使用这套整合好的客户端工具,在生产者这方面,和rocketmq-spring-boot-starter是大相径庭的,消费者方面也是大相径庭的!

源码讲解

项目目录
在这里插入图片描述

核心依赖

		<dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-client</artifactId>
            <version>4.7.1</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun.openservices</groupId>
            <artifactId>ons-client</artifactId>
            <version>1.8.0.Final</version>
        </dependency>

自动注入
在这里插入图片描述
配置文件映射
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
配置文件,这里有两个,一个是ONS另一个是RocketMQ的,那么这里就可以根据type根据启动环境自动切换

消费者端

/**
 * @description: NbMq-Producer自动注入
 * @author TAO
 * @date 2021/12/20 7:03 下午
 */

@Configuration
@EnableConfigurationProperties(NbMqProperties.class)
public class NbAutoProducerConfiguration {


    /**
     * 根据type初始化对应的Producer
     * @param properties
     * @return
     */
    @Bean
    @ConditionalOnProperty(prefix = "rmq.producer", name = "producerId")
    public NbMqProducer nbMqProducer(NbMqProperties properties) throws MQClientException {
        String type = properties.getType();
        if ("rocket".equals(type)){
            return new RocketMqProducer(properties);
        }else if ("ons".equals(type)){
            return new OnsMqProducer(properties);
        }else{
            throw new RuntimeException("请提供正确的MQ客户端类型 , 如 : rocket / ons");
        }
    }


}

更具type创建不同的client,以下是RocketMQ
在这里插入图片描述
生产者其实特别简单的,就是顶层抽象出一个NbMqProducer接口,然后根据不同的type创建不同的client

生产者调用
在这里插入图片描述
消费者端
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
消费者注解
在这里插入图片描述
消费者监听接口
在这里插入图片描述

消费者调用
在这里插入图片描述

消费者生产者自动注入

在这里插入图片描述
后续更加完善后会将这个starter开源出来

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐