Spring Cloud刷新配置中心配置——消息总线RabbitMQ

来源:互联网 发布:北极冰川融化数据 编辑:程序博客网 时间:2024/04/26 06:26

在http://blog.csdn.net/a60782885/article/details/69415527的最后,我们提到了配置的刷新,但是这显然是麻烦的,如果多个服务使用了这个配置,当我们修改配置信息的时候,如果我们希望服务的配置也跟着修改,我们就不得不一个一个服务的发送POST请求,或者关闭服务重新打开。这是一件多麻烦的事情。

所以我们在这里使用消息中间件来完成配置的更新问题。


目标:

当我们更新git仓库的配置信息的时候,所有使用了修改的配置的服务都会刷新配置。


使用RabbitMQ中间件来作为消息总线,那么我们首先需要在电脑里面装好RabbitMQ。安装的过程这里就不赘述了。

温馨提示:使用window的小伙伴们,安装过程不能出现中文路径,即使是你电脑用户名是中文也是不能成功的。


准备:

我们首先搭建一个服务注册中心,一个配置中心,和一个获取配置的客户端。配置中心和客户端都在服务注册中心中注册好。

验证:

服务注册中心中可以看到配置中心和客户端。

访问配置中心的url可以得到json格式的返回。见http://blog.csdn.net/a60782885/article/details/69415527。

访问客户端可以得到仓库中某个属性的值。


如果都完成了,正文就开始了。

首先修改配置中心的依赖pom:

增加两个依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId></dependency>
在application.properties配置文件中增加rabbitmq的配置信息。

spring.rabbitmq.host=localhostspring.rabbitmq.port=5672spring.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就需要重新修改了。

而如果使用配置中心作为刷新点的话,就方便许多了。


1 0
原创粉丝点击