消息總線Spring Cloud Bus

雖然通過Gogs Git的web hook可以實現(xiàn)自動更新,但是,如果Config Client有很多的話,那么需要在web hook中維護很多地址,這顯然是不現(xiàn)實的做法。

有沒有更好的方案呢? 通過消息實現(xiàn)通知。

Spring Cloud Bus消息總線的簡介

目前Spring Cloud Bus消息總線只是實現(xiàn)了對RabbitMQ以及Kafka的支持。所以,需要按照RabbitMQ。

使用Spring Cloud Bus的架構

實現(xiàn)

在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:itcast123@127.0.0.1:6868/eureka/
spring:
  cloud:
    config:
      name: microservice #對應的配置服務中的應用名稱
      #uri: http://127.0.0.1:6869/
      profile: dev #對應配置服務中的{profile}
      label: master #對應的分支
      discovery: 
        enabled: true #啟用發(fā)現(xiàn)服務功能
        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的地址:(修改或者添加都可以)


啟動測試

查看RabbitMQ中的交換機:


再看隊列:



接著,將itcast-microservice-item的端口改成8182,再啟動一個itcast-microservice-item實例,進行測試。

發(fā)現(xiàn),有2個隊列,分別都綁定到springCloudBus的交換機。

接下里,修改配置文件的內(nèi)容進行測試。



可以看到8181和8182這2個實例查詢到的信息都是一樣的。
接下來,修改配置文件內(nèi)容將6666改成7777:




結果顯示,都是獲取到最新的數(shù)據(jù)。
在測試時,會發(fā)現(xiàn),由于Gogs的web鉤子推送到8181,所以8181的更新快一些,而8182更新就相對慢一些。

流程總結

更新文件到Gogs,Gogs通過web鉤子通知到8181的/bus/refresh,8181的實例將消息發(fā)送到springCloudBus的交換機,由于8181的隊列頁綁定到交換機,所以8081也獲取到了更新的通知,然后去Config Server獲取最新的數(shù)據(jù)。

架構優(yōu)化

在前面實現(xiàn)的架構中,發(fā)現(xiàn)8181這個實例不僅僅是提供了商品查詢的服務,還負責發(fā)送更新的消息到RabbitMQ。
這其實是違反了微服務架構中的職責單一的原則。
其實這個架構是可以改進的,就是將原有的Config Server不僅僅是提供配置查詢的服務,而且還要負責更新消息的發(fā)送。


在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:itcast123@127.0.0.1:6868/eureka/
  instance: 
    prefer-ip-address: true #將自己的ip地址注冊到Eureka服務中
    ipAddress: 127.0.0.1
    
management:
  security:
    enabled: false #是否開啟actuator安全認證

修改Gogs中的web鉤子

重啟測試,測試結果,和之前一樣,可以同步更新到8181和8081。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容