消息总线Spring Cloud Bus

虽然通过Gogs Git的web hook可以实现自动更新,但是,如果Config Client有很多的话,那么需要在web hook中维护很多地址,这显然是不现实的做法。

有没有更好的方案呢? 通过消息实现通知。

Spring Cloud Bus消息总线的简介

11345146-e1cda387d45a3044.png

目前Spring Cloud Bus消息总线只是实现了对RabbitMQ以及Kafka的支持。所以,需要按照RabbitMQ。

使用Spring Cloud Bus的架构

11345146-b184d981c18d1dd4.png

实现

在itcast-microservice-item添加依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>

在bootstrap.yml添加rabbitmq的配置

eureka:
  client:
    serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址
      defaultZone: http://itcast:[email protected]:6868/eureka/
spring:
  cloud:
    config:
      name: microservice #对应的配置服务中的应用名称
      #uri: http://127.0.0.1:6869/
      profile: dev #对应配置服务中的{profile}
      label: master #对应的分支
      discovery: 
        enabled: true #启用发现服务功能
        service-id: itcasst-microservice-config-server #指定服务名称
  rabbitmq: #RabbitMQ相关的配置
    host: 127.0.0.1
    port: 5672
    username: guest
password: guest

修改web hook的地址

在启动后会看到这样的日志:

o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/bus/refresh],methods=[POST]}" onto public void org.springframework.cloud.bus.endpoint.RefreshBusEndpoint.refresh(java.lang.String)

说明刷新的地址/bus/refresh是有Spring Cloud Bus来处理,之前的/refresh依然是由以前的逻辑处理。
所以要修改Gogs中的web hook的地址:(修改或者添加都可以)


11345146-02ce5e029037ae72.png

启动测试

查看RabbitMQ中的交换机:


11345146-01dfab000cfd3931.png

再看队列:


11345146-483bfa0d43bccb7f.png

11345146-95ba7efd06cb14cc.png

接着,将itcast-microservice-item的端口改成8182,再启动一个itcast-microservice-item实例,进行测试。

11345146-5f4c114f8a47c94b.png

发现,有2个队列,分别都绑定到springCloudBus的交换机。

接下里,修改配置文件的内容进行测试。


11345146-232669937691d8be.png

11345146-706d1285e7dee9db.png

可以看到8181和8182这2个实例查询到的信息都是一样的。
接下来,修改配置文件内容将6666改成7777:


11345146-63f45cc5e551d918.png

11345146-b9651a14976a4bc5.png

11345146-7d594a177f76ce0e.png

结果显示,都是获取到最新的数据。
在测试时,会发现,由于Gogs的web钩子推送到8181,所以8181的更新快一些,而8182更新就相对慢一些。

流程总结

更新文件到Gogs,Gogs通过web钩子通知到8181的/bus/refresh,8181的实例将消息发送到springCloudBus的交换机,由于8181的队列页绑定到交换机,所以8081也获取到了更新的通知,然后去Config Server获取最新的数据。

架构优化

在前面实现的架构中,发现8181这个实例不仅仅是提供了商品查询的服务,还负责发送更新的消息到RabbitMQ。
这其实是违反了微服务架构中的职责单一的原则。
其实这个架构是可以改进的,就是将原有的Config Server不仅仅是提供配置查询的服务,而且还要负责更新消息的发送。


11345146-f5d6120970d468e7.png

在itcast-microservice-config-server中导入依赖

                <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>

修改application.yml配置文件

server:
  port: 6869 #服务端口

spring: 
  application:  
    name: itcasst-microservice-config-server #指定服务名
  cloud:  
    config:
      server:
        git: #配置git仓库地址
          uri: http://172.16.55.138:10080/zhangzhijun/itcast-config-server.git
          #username: zhangzhijun
          #password: 123456
  rabbitmq: #RabbitMQ相关的配置
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
    
eureka: 
  client:
    registerWithEureka: true #是否将自己注册到Eureka服务中,默认为true
    fetchRegistry: true #是否从Eureka中获取注册信息,默认为true
    serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址
      defaultZone: http://itcast:[email protected]:6868/eureka/
  instance: 
    prefer-ip-address: true #将自己的ip地址注册到Eureka服务中
    ipAddress: 127.0.0.1
    
management:
  security:
    enabled: false #是否开启actuator安全认证

修改Gogs中的web钩子

11345146-e9ec646737e035aa.png

重启测试,测试结果,和之前一样,可以同步更新到8181和8081。

猜你喜欢

转载自blog.csdn.net/weixin_34087301/article/details/87158455