雖然通過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。