SpringCloud学习系列之五-----配置中心(Config)和消息总线(Bus)完美使用版 (2)

完成上述的代码开发后,我们来进行测试Spring-Config是否可以进行配置实时更新。
首先依次启动springcloud-config-bus-eureka、springcloud-config-bus-server和springcloud-config-bus-client这三个项目。其中9005是服务端springcloud-config-bus-server的端口,9006是第一个客户端springcloud-config-bus-client的端口。
启动成功之后,在浏览器输入:

:9006//hello?name=pancm

界面返回:

pancm,hello world!!

可以正常得到服务端configtest-pro.properties的配置信息。

然后在把configtest-pro.properties的配置更改为:

word=hello

然后我们再浏览器输入:

:9006//hello?name=pancm

界面返回:

pancm,hello world!!

可以发现配置并没有实时的刷新,查阅官方文档得知,需要客户端通过POST方法触发各自的/refresh,所以这里我们就用Postman工具模拟post请求刷新,然后再查看信息。

使用POST请求如下地址:

:9006/actuator/refresh

返回:

[ "word" ]

说明完成了word配置的刷新,我们再浏览器输入:

:9006//hello?name=pancm

界面返回:

pancm,hello

发现已经成功实现配置刷新了!

示例图:

在这里插入图片描述


在这里插入图片描述

SpringCloud Config Bus

上述的示例中,我们客户端发现每次获取最新配置都需要手动进行刷新,如果少的的话还可以使用,但是多的话就比较繁琐了,虽然我们可以使用类似Github的WebHook的工具。

WebHook是当某个事件发生时,通过发送http post请求的方式来通知信息接收方。

但是当客户端越来越多的时候WebHook已经不好使用了,每次新增客户端都需要更改WebHook会显得很麻烦,springcloud官方给出了非常好的解决方案,Spring Cloud Bus。

Spring cloud bus通过轻量消息代理连接各个分布的节点。这会用在广播状态的变化(例如配置变化)或者其他的消息指令。Spring bus的一个核心思想是通过分布式的启动器对spring boot应用进行扩展,也可以用来建立一个多个应用之间的通信频道。目前唯一实现的方式是用AMQP消息代理作为通道,同样特性的设置(有些取决于通道的设置)在更多通道的文档中。

为什么使用Spring Cloud Bus就可以解决这个问题了呢?
我们不一定非要透彻的理解其原理才可以知道,我们只需要知道它的实现步骤,就可以知道了为什么可以解决了。
步骤如下:

首先,在配置中进行更新配置文件信息,它就会自动触发post发送bus/refresh;

然后服务端就会将更新的配置并且发送给Spring Cloud Bus;

继而Spring Cloud bus接到消息之后并通知给使用该配置的客户端;

最后使用该配置的客户端收到通知后,就会获取最新的配置进行更新;

这里我也简单的画了下使用Spring Cloud Bus之前和之后的流程图,方便进行理解。

不使用Spring Cloud Bus获取配置信息流程图:

在这里插入图片描述

使用Spring Cloud Bus获取配置信息流程图:

在这里插入图片描述

开发准备

和上述的环境一样即可。

RabbitMQ 的安装教程可以看我之前写的这篇文章:RabbitMQ的环境安装及配置。

Kafka 的安装教程可以看我之前写的这篇文章:kafka安装使用教程。

服务端

Spring Cloud Bus 主要的使用的MQ主要使用的是,RabbitMQ和Kafka。至于使用的话就可以根据情况来进行选择,主要使用的是哪个MQ就用哪一个就行了。这里我们就用RabbitMQ作为示例来进行讲解,Kafka的使用也差不多,也无在乎配置更改而已。

首先在springcloud-config-bus-server服务端的pom文件添加如下配置:

<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <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> </dependencies>

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyyxpd.html