Spring-cloud-bus-rocketmq入门与实践
1. 创建资源
开始实验之前,您需要先创建ECS实例资源。
- 在实验室页面,单击创建资源。
- (可选)在实验室页面左侧导航栏中,单击云产品资源列表,可查看本次实验资源相关信息(例如IP地址、用户信息等)。
说明 资源创建过程需要1~3分钟。
2. 启动名称服务器和代理
- 本步骤指导您如何在已搭建好RocketMQ实例中启动名称服务器和代理。
- 执行如下命令,切换目录至rocketmq-4.9.3/bin下。
cd /root/rocketmq-4.9.3/bin
- 执行如下命令,启动服务器。
说明 按CTRL+C可结束当前进程。
nohup sh mqnamesrv &
tail -f ~/logs/rocketmqlogs/namesrv.log
若启动代理失败,解决方案如下。
- 执行如下命令,查看 mqnamesrv 进程。
ps -ef |grep mqnamesrv
- 执行如下命令,清除掉该进程(该命令进程编号以上图示例)。
kill -9 6987
- 执行如下命令,清除Java进程。
sh mqshutdown namesrv sh mqshutdown broker
- 执行如下命令,启动代理。
说明 按CTRL+C可结束当前进程。
nohup sh mqbroker -n localhost:9876 &
tail -f ~/logs/rocketmqlogs/broker.log
- 执行如下命令,创建topic。
cd /root/rocketmq-4.9.3/bin ./mqadmin updateTopic -n localhost:9876 -b localhost:10911 -t springCloudBus
3. 启动 java 工程
本步骤指导您如何启动java工程。
- 执行如下命令,启动Java工程。
说明 首次运行可能要花费3分钟左右的编译时间。
cd /root/spring-mq-bus-demo mvn install -Dmaven.test.skip java -jar target/demo-0.0.1-SNAPSHOT.jar
启动成功,返回信息如下。
- 单击当前页面右上角,再开启一个会话窗口,进行响应测试。
4. 访问并测试执行效果
本步骤指导您如何进行测试,并查看其相应效果。
- 测试一。
执行如下命令,向刚才启动的程序发送一条简单的请求,以观察响应。
wget 127.0.0.1:8888/bus/event/publish/user?name=RocketMQ2
再观察会话1中的日志,会观察到如下的输出。
- 测试二。
执行如下命令,向刚才启动的程序发送一条简单的请求,以观察响应。
wget 127.0.0.1:8888/bus/event/publish/user?name=RocketMQ&destination=bus
再观察会话1中的日志,会观察到如下的输出。
说明 第二次测试没有触发回调,原因是传递destination参数。至于为什么没有触发这里不详细说明。有兴趣的请看org.springframework.cloud.bus.ServiceMatcher.isForSelf方法与AntPathMatcher类。
5. 代码详解
本步骤将对所使用的代码进行讲解。
- maven配置。
说明 下面的配置代码,都可以在pom.xml中找到。
通过引入 spring-cloud-alibaba 的 pom 依赖来解决所有版本声明工作。
然后,再引入 spring-cloud-starter-bus-rocketmq 。
- 配置文件。
在application.properties中,各个配置介绍如下。
- server.port=8080(web服务端口)。
- spring.cloud.bus.trace.enabled=true(启动trace级别日志)。
- pring.cloud.bus.id=${spring.application.name}-{IP}:${server.port}(spring.cloud.bus.id 是设定这个实例的在进群唯一标识符。建议使用下面的规则。${项目名}:${服务端口},也可以使用dubbo的端口,最好是本机ip地址)。
- spring.cloud.stream.rocketmq.binder.name-server=127.0.0.1:9876(配置spring-cloud-bus需要的stream实现,使用了rocketmq)。
- 使用RemoteApplicationEventScan注解启动bus。
在 spring 的启动类中,加入 RemoteApplicationEventScan 注解,其目的是帮助 spring 可以自动扫描到各个配置类。
说明 "com.alibaba.cloud.examples.rocketmq" 是事件类所在的上级包名。
样例代码如下。
说明 或者,也可以参考实例工程的 RocketMQBusApplication 类
- 创建消息总线事件类。
注意 创建的事件必须继承RemoteApplicationEvent。
参考 UserRemoteApplicationEvent 类。
- 发送事件。
使用ApplicationEventPublisher对象发送事件。直接调用publishEvent方法传递需要广播的事件参见代码 RocketMQBusApplication。
- 接收事件。
- 在方法上使用EventListener注解,方法形参是接收的事件就行了。
- class上必须加上Component注解或者它的子注解(Controller,Service,Repository,RestController)。
- AckRemoteApplicationEvent事件触发点是发送事件的服务收到消息总线广播的广播就会触发AckRemoteApplicationEvent事件,建议大家处理AckRemoteApplicationEvent事件,实现重复机制。
6. 源码及本地测试
您可以通过 https://gitee.com/theonefx/spring-mq-bus-demo.git 这个git 地址来获得当前实验所用到的工程
请直接打开RocketMQBusApplication.java。并且执行RocketMQBusApplication的main方法来执行。
实验链接:https://developer.aliyun.com/adc/scenario/482711a72ec146ed9dd2ea7f4221dd43