在http://blog.csdn.net/a60782885/article/details/69415527的最后,我们提到了配置的刷新,但是这显然是麻烦的,如果多个服务使用了这个配置,当我们修改配置信息的时候,如果我们希望服务的配置也跟着修改,我们就不得不一个一个服务的发送POST请求,或者关闭服务重新打开。这是一件多麻烦的事情。
所以我们在这里使用消息中间件来完成配置的更新问题。
目标:
当我们更新git仓库的配置信息的时候,所有使用了修改的配置的服务都会刷新配置。
使用RabbitMQ中间件来作为消息总线,那么我们首先需要在电脑里面装好RabbitMQ。安装的过程这里就不赘述了。
温馨提示:使用window的小伙伴们,安装过程不能出现中文路径,即使是你电脑用户名是中文也是不能成功的。
准备:
我们首先搭建一个服务注册中心,一个配置中心,和一个获取配置的客户端。配置中心和客户端都在服务注册中心中注册好。
验证:
服务注册中心中可以看到配置中心和客户端。
访问配置中心的url可以得到json格式的返回。见http://blog.csdn.net/a60782885/article/details/69415527。
访问客户端可以得到仓库中某个属性的值。
如果都完成了,正文就开始了。
首先修改配置中心的依赖pom:
增加两个依赖:
org.springframework.boot
spring-boot-starter-actuator
org.springframework.cloud
spring-cloud-starter-bus-amqp
在application.properties配置文件中增加rabbitmq的配置信息。
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=用户名
spring.rabbitmq.password=密码
没有使用过rabbitmq的朋友,这里需要先创建好用户名和密码,并且将permission配置完成才可以使用。
配置中心的修改就完成了。
接下来是客户端的修改:
和配置中心的修改一样,增加两个依赖,并且在application配置文件中增加rabbitmq信息就ok了。
接下来怎么验证我们是否成功了呢?
1.首先我们先访问客户端,查看修改之前的git仓库的信息。
2.确认了之前的值之后,我们修改git仓库的信息,再访问一次客户端,会发现,信息并没有改变。
3.然后我们向配置中心的/bus/refresh发送一个POST请求。
这里7001就是配置中心的端口了。
4.再次访问客户端,就发现信息已经得到修改。
分析原理:
因为我们引入了消息总线,所以Server和Service都连接到了RabbitMQ队列当中。
当Config Server启动的时候,它会向git仓库拿到配置信息。
而当Service启动的时候,会向Config Server拿配置信息。
而我们修改git仓库的时候,服务客户端是无法刷新配置信息的。
当我们向Server的/bus/refresh中发送POST请求时,此时,Config Server会将这个刷新请求发送到消息总线中,当我们的客户端从消息总线中获取到刷新请求的时候,就会重新从Config Server中获取配置信息。
这样子,其实我们还是没有达到目的,虽然配置的刷新变得很快了,但是我们依然没有达到只需要修改git仓库,所有服务就自动刷新的这么一件事,我们还需要向Config Server发送POST请求呢。
这个时候,我们可以通过远程仓库的webhook来达到目的。webhook有什么用呢?
webhook会在我们向仓库发送push请求的时候,对指定的url发送一个POST请求。这下就懂了吧。当我们向配置中心的配置仓库发送push请求,他就会向我们的配置中心的/bus/refresh发送一个POST请求,那么就达到了服务刷新的目的了。
创建webhook,以github为例:
某个仓库->settings->Webhooks.
只需要在payload url中填上配置中心的/bus/refresh就可以达到目的了。
当然,这里的地址要是公网地址,localhost什么的是不行的。
其实我们也可以通过向服务客户端发送POST请求来达到所有服务都刷新的目的,但我们选向配置中心发送POST请求。为什么呢?
因为我们最后要设置webhook。如果我们使用某个服务作为刷新点的话,其实是很麻烦的一件事,如果服务需要迁移,那么我们的webhook就需要重新修改了。
而如果使用配置中心作为刷新点的话,就方便许多了。