壹
本篇结合上篇学习使用SpringCloud Bus结合MQ来实现自动刷新
上篇有远端git码云,本地git,config统一配置中心服务,order服务,product服务
过程: 启动服务时,config服务将远端git的配置拉取到本地git,order服务读取config服务的配置; 启动后再修改git的配置,order中读取的配置则不变,为启动时的配置,所以需要重启,重新读取,因为没有应用通知order服务配置已经被改动了
消息队列有很多,本次使用RabbitMQ,就像JPA来操作数据库,SpringCloud Bus来操作RabbitMQ
config服务,order服务会通过RabbitMQ来传递信息,通知他配置已经被改动
这边还需要使用到docker容器技术,并且在docker中已经下了镜像RibbonMQ,如果不熟悉的小伙伴可以先学习一下docker,还是比较简单入手,另外docker对于现在的技术人员来说,也必须要知道,熟悉的一个技术工具,不然就落后了,比如在下,也是刚刚之前才知道这玩意
也粗糙的记录了一篇win7的docker安装 : https://my.oschina.net/u/3829444/blog/1829032
贰
config 服务
第一步老套路,maven引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency>
第二步yml配置,在原来的基础上加rabbitmq配置
spring:
application:
name: config
cloud:
config:
server:
git:
uri: https://gitee.com/daxia/spring-cloud-config
username: daxia@foxmail.com
password: 123456
basedir: E:\MyCloud\config\basedir
rabbitmq:
host: 192.168.99.100
port: 5672
username: guest
password: guest
virtual-host: /
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
docker 容器
启动RabbitMQ命令 : docker run -d --hostname myrabbitmq -p 5672:5672 -p 15672:15672 hub.c.163.com/library/rabbitmq:management
第一个5672端口是rabbitmq,第二个15672端口是管理界面
外部浏览器访问 如下:
order 服务
order服务同config服务一样,引入依赖,然后yml配置,贴出来
spring: application: name: order cloud: config: discovery: enabled: true service-id: CONFIG profile: dev rabbitmq: host: 192.168.99.100 port: 5672 username: guest password: guest virtual-host: / eureka: client: service-url: defaultZone: http://localhost:8761/eureka/
然后rabbitmq management访问,如下 就出现两个队列,一个是config,一个是order:
当关闭一个服务的时候,这边立刻少一个queues,可以试试
下面来测试测试 改变Git仓库的配置来自动更新服务
在Git仓库的order-dev.yml中 追加点东西:
hello:
tom
在config服务中,需要在yml配置中加入监控设置(这个设置是SpringBoot2有改动部分)
spring:
application:
name: config
cloud:
config:
server:
git:
uri: https://gitee.com/daxia/spring-cloud-config
username: daxia@foxmail.com
password: 123456
basedir: E:\MyCloud\config\basedir
rabbitmq:
host: 192.168.99.100
port: 5672
username: guest
password: guest
virtual-host: /
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
#本次追加
management:
endpoints:
web:
exposure:
include: "bus-refresh"
接下来,在order服务中,写一个Controller中获取该配置,需要@RefreshScope注解刷新
@RestController @RefreshScope public class HelloController { @Value("${hello}") private String hello; @GetMapping("/hello") public String hello() { return hello; } }
启动服务 浏览器访问 上面的接口,
接下来, 去改动Git仓库的配置,将tom改成jerry,然后再访问浏览器的时候,发现没有变,在这里需要用到上面设置的监控,在config服务控制台中可以找到访问方式http://localhost:8000/actuator/bus-refresh
是post的请求,使用postman访问一次以后,再来刷新浏览器hello的请求,就更新了配置信息
学到这里,我觉得有点尴尬,配置自动刷新了,那每次还要自己请求一个post,肯定有方法,从Git仓库入手,
那git上应该有做了修改自动响应的功能的应用(码云)WebHooks
其他的Git仓库应该都有,可能名字叫法不一样
上面的解释说的很清楚,push代码,可以post一个请求,刚好可以满足需求
访问的地址是: http://localhost:8000/actuator/bus-refresh
localhost肯定是写不上去的,如果写上去了就说明你超神了,这边需要一个公网的地址
需要内网穿透的小工具,来完成这次测试,映射url到本地,(分享natapp.cn,根据自己的系统下载)
用其他穿透工具的也可以,比如花生壳...百度搜内网穿透,就一大堆了
最后测试的时候,发现开源中国的码云和SpringCloud似乎不太兼容,失败了, 换成github就可以了.
在使用github的时候,cloud专用的一个访问/monitor 比如url: http://hello.natappfree.cc/monitor
换成github的时候,需要将之前conifg服务中的basebir文件夹删除,不然测试的时候,会很坑
-----------------------------------------------------------