虽然通过Gogs Git的web hook可以实现自动更新,但是,如果Config Client有很多的话,那么需要在web hook中维护很多地址,这显然是不现实的做法。
有没有更好的方案呢? 通过消息实现通知。
Spring Cloud Bus消息总线的简介
![](https://img.haomeiwen.com/i11345146/e1cda387d45a3044.png)
目前Spring Cloud Bus消息总线只是实现了对RabbitMQ以及Kafka的支持。所以,需要按照RabbitMQ。
使用Spring Cloud Bus的架构
![](https://img.haomeiwen.com/i11345146/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: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 #启用发现服务功能
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的地址:(修改或者添加都可以)
![](https://img.haomeiwen.com/i11345146/02ce5e029037ae72.png)
启动测试
查看RabbitMQ中的交换机:
![](https://img.haomeiwen.com/i11345146/01dfab000cfd3931.png)
再看队列:
![](https://img.haomeiwen.com/i11345146/483bfa0d43bccb7f.png)
![](https://img.haomeiwen.com/i11345146/95ba7efd06cb14cc.png)
接着,将itcast-microservice-item的端口改成8182,再启动一个itcast-microservice-item实例,进行测试。
![](https://img.haomeiwen.com/i11345146/5f4c114f8a47c94b.png)
发现,有2个队列,分别都绑定到springCloudBus的交换机。
接下里,修改配置文件的内容进行测试。
![](https://img.haomeiwen.com/i11345146/232669937691d8be.png)
![](https://img.haomeiwen.com/i11345146/706d1285e7dee9db.png)
可以看到8181和8182这2个实例查询到的信息都是一样的。
接下来,修改配置文件内容将6666改成7777:
![](https://img.haomeiwen.com/i11345146/63f45cc5e551d918.png)
![](https://img.haomeiwen.com/i11345146/b9651a14976a4bc5.png)
![](https://img.haomeiwen.com/i11345146/7d594a177f76ce0e.png)
结果显示,都是获取到最新的数据。
在测试时,会发现,由于Gogs的web钩子推送到8181,所以8181的更新快一些,而8182更新就相对慢一些。
流程总结
更新文件到Gogs,Gogs通过web钩子通知到8181的/bus/refresh,8181的实例将消息发送到springCloudBus的交换机,由于8181的队列页绑定到交换机,所以8081也获取到了更新的通知,然后去Config Server获取最新的数据。
架构优化
在前面实现的架构中,发现8181这个实例不仅仅是提供了商品查询的服务,还负责发送更新的消息到RabbitMQ。
这其实是违反了微服务架构中的职责单一的原则。
其实这个架构是可以改进的,就是将原有的Config Server不仅仅是提供配置查询的服务,而且还要负责更新消息的发送。
![](https://img.haomeiwen.com/i11345146/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: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钩子
![](https://img.haomeiwen.com/i11345146/e9ec646737e035aa.png)
重启测试,测试结果,和之前一样,可以同步更新到8181和8081。
网友评论