概述
什么是消息总线
消息总线是基于消息代理,统一一个唯一的通信入口,负责所有连接到该总线上的应用实例消息的接收,必要的统一处理,路由等操作。
消息总线在微服务中的意义
解耦微服务间通信,屏蔽了内部细节,统一进行了必要的处理逻辑(如给消息加上了服务名称等信息)并根据路由规则路由到对应的组件上去,消息缓存、持久化及一些灾备措施也提高了整个微服务系统的可靠性。
RabbitMQ与Kafka
目前Spring Cloud Bus消息总线仅支持两款消息中间件,RabbitMQ及Kafka
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件,也称为面向消息的中间件。RabitMQ具有高性能,可伸缩的特点。
Kafka是基于消息发布-订阅模式实现的消息系统。具有高吞吐、跨平台、伸缩性等优点。
基于RabbitMQ实现的微服务消息总线
安装RabbitMQ
安装方法请根据主机系统自行查询方法,RabbitMQ 等相关概念同理,此处不赘述
结合Spring Cloud Config 实例改造
此处结合之前Spring Cloud Config笔记中的 config-client及config-server进行改造,请自行在网站内搜索
加依赖
首先给config-client项目加上必要依赖如下:
<!-- 改依赖已对RabbitMQ的使用进行了封装 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<!-- 需要改依赖提供动态刷新配置的端点 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
改配置
给配置文件添加RabbitMQ相关的信息(此处为bootstrap.yml)
Spring:
rabbitmq:
host: localhost
port: 5672
username: springcloud #通过MQ的guest用户创建的新用户
password: 123456 #新用户密码
验证
启动服务注册中心eureka-server,在启动config-server,最后启动两个实例config-client并运行在不同端口上(此处可使用maven命令打包,并在运行jar包时指定端口),之后通过config-client实例的/from
端点获取动态获取的配置信息,之后修改Git服务器中存放的配置文件并提交,之后用Postman触发任意一个config-client实例的/bus/refresh
端点(POST请求),可以看到两个config-client实例的配置信息都重新获取且刷新。
优化
考虑到一个服务有多个实例,经过某个服务的某个实例去刷新该服务的配置信息不可靠,不是最好的方法。可以通过配置中心经由消息总线刷新指定服务配置。同样地给服务中心加入以上config-client依赖及RabbitMQ相关配置信息,即将配置中心纳入到消息总线中。并通过/bus/refresh?destination={service-id}
端点刷新指定服务配置。
基于Kafka实现的微服务消息总线
安装Kafka
官网下载对应的安装包安装即可。
结合Spring Cloud Config 实例改造
此处可以用以上基于RabbtiMQ实现的消息总线应用实例config-client及config-server改造
改依赖
将 spring-cloud-starter-bus-amqp
改为 spring-cloud-starter-bus-kafka
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-kafka</artifactId>
</dependency>
配置
此处由于Kafka是安装在本地的,所以kafka配置可以使用默认设置
验证
方法同RabbitMQ的验证,可以看到配置中心config-server同样可以经由kafka传递刷新消息,动态刷新服务配置信息。