JAVA整合阿里云ONS(RocketMQ)

本文主要讨论如何整合阿里云ONS和RocketMQ客户端,以适应不同环境的需求。作者指出ONS的API消耗问题,并提出在测试和开发环境中使用RocketMQ来降低成本。通过自动注入和配置文件映射,实现了根据环境自动切换客户端的功能。在生产者和消费者端,都设计了相应的接口和实现,使得开发者能够无缝切换使用。项目源码中包含了核心依赖及自动注入配置,未来计划开源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

关于阿里云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开源出来

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员劝退师-TAO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值