前言
关于阿里云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整合RocketMQ、springboot使用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开源出来