在微服务架构的系统中,我们通常会使用轻量级的消息代理来构建一个公用的消息主题让系统中所有微服务实例都连接上来,由于该主题中产生的消息会被所有实例监听和消费,所以我们称它为消息总线。在总线上的各个实例都可以方便地广播一些需要让其他连接在该主题上的实例都知道的消息,例如配置信息的变更或者其他一些管理操作等。
由于消息总线在微服务架构系统中被广泛使用,所以它同配置中心一样,几乎是微服务架构中的必备组件。Spring Cloud作为微服务架构综合性的解决方案,对此自然也有自己的实现,这就是本章我们将要具体介绍的Spring Cloud Bus。通过使用Spring Cloud Bus,可以非常容易地搭建起消息总线,同时实现了一些消息总线中的常用功能,比如,配合Spring Cloud Config实现微服务应用配置信息的动态更新等。
目前Spring Cloud Bus消息总线只是实现了对RabbitMQ以及Kafka的支持。
11.1、使用Spring Cloud Bus的架构
11.2、实现
11.2.1、在springcloud-demo-item添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
11.2.1、在bootStrap.properties添加rabbitmq的配置
#RabbitMQ相关的配置
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
11.2.2、修改web hook的地址
修改bithub中的web hook的地址为:http://ip:18200/bus/refresh
11.2.3、启动测试
查看RabbitMQ中的交换机:
11.3、架构优化
在前面实现的架构中,发现item这个实例不仅仅是提供了商品查询服务,还负责发送更新消息到RabbitMQ。
这其实是违反了微服务架构中的职责单一原则。
其实这个架构是可以改进的,就是将原有的Config Server不仅仅是提供配置查询的服务,而且还要负责更新消息的发送。
11.3.1、在springcloud-demo-config中导入依赖(同11.2.1)
11.3.2、在application.properties文件中添加rabbitMQ配置并关闭actuator安全认证
#RabbitMQ相关的配置
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
#是否开启actuator认证
management.security.enabled=false
11.3.3、修改github webhook钩子
11.3.4、重启测试
测试结果与上面一样。
Spring Cloud—一、微服务架构
Spring Cloud—二、Spring Cloud简介
Spring Cloud—三、使用Spring Cloud实现微服务
Spring Cloud—四、Spring Cloud快速入门
Spring Cloud—五、注册中心Eureka
Spring Cloud—六、使用Ribbon实现负载均衡
Spring Cloud—七、容错保护:Hystrix
Spring Cloud—八、使用Feign实现声明式的Rest调用
Spring Cloud—九、服务网关Spring Cloud Zuul
Spring Cloud—十、使用Spring Cloud Config统一管理微服务
Spring Cloud—十一、使用Spring Cloud Bus(消息总线)实现自动更新