Spring Cloud Config-Bus配置刷新

        Spring Cloud Bus是用轻量级的消息代理将分布式的节点连接起来,可以用来广播配置文件的更改或者服务的监控管理。一个关键的思想就是,消息总线可以为微服务做监控,也可以实现应用程序之间相互通信。Spring Cloud Bus可选的消息代理组件包括RabbitMQ、AMQP和Kafka等。本节讲述的是用RabbitMQ作为Spring Cloud的消息组件去刷新更改微服务的配置文件。

        为什么需要用Spring Cloud Bus去刷新配置呢?

        如果几十个微服务,而每一个服务又有多个实例,当配置更改时,需要重启多个微服务实例,会非常麻烦。Spring Cloud Bus的一个功能就是让这个过程变得简单,当远程Git仓库的配置更改后,只需要向某一个微服务实例发送一个Post请求,通过消息组件通知其他微服务实例重新拉取配置文件。如下图所示,当Git仓库的配置更改后,通过发送“/bus/refresh”Post请求给某一个微服务实例,通过消息组件,通知其他微服务实例,更新配置文件。

改造config-client工程

        首先在pom文件引入RabbitMQ实现的Spring Cloud Bus的起步依赖spring-cloud-starter-bus-amqp。pom文件添加的依赖如下:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

        在工程的配置文件application.yml添加RabbitMQ的相关配置。通过消息总线更改配置,需要经过安全验证,为了方便讲述,先把安全验证屏蔽掉,也就是将managerment.security.enable改为fase。配置文件如下:

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

management:
  security:
    enable: false

        最后需要在更新的配置类加@RefreshScope注解,只有加上了该注解,才会在不重启服务的情况下更新配置,如本例中更新配置文件foo的变量值,代码如下:

@RefreshScope
@Controller
public class TestController {

    @Value("${foo}")
    protected String foo;

    @GetMapping(value = "/foo")
    @ResponseBody
    public String hi()
    {
        return "配置文件远程读取测试:"+foo;
    }
}

        依次启动工程,其中config-client开启了两个实例,端口分别是8762和8763.启动完成后再浏览器输入http://localhost:8762/foo或者http://localhost:8763/foo,浏览器显示:

配置文件远程读取测试:version 1

        更改远程Git仓库,将foo的值改为“version 2”。通过Postman或者其他工具发送一个Post请求http://localhost:8762/bus/refresh,请求发送成功,再访问http://localhost:8762/foo或者http://localhost:8763/foo,浏览器显示:

配置文件远程读取测试:version 1

        可通过8762端口的微服务实例发送Post请求http://localhost:8762/bus/refresh刷新配置,由于使用了Spring Cloud Bus,其他服务实例会接收到刷新配置的消息,也会刷新配置。

        另外“/bus/refresh”接口可以指定服务,即使用“destination”参数,例如“/bus/refresh?destination=eureka-client:**”,即刷新服务名为eureka-client的所有服务实例。

猜你喜欢

转载自blog.csdn.net/u010277958/article/details/88827720
今日推荐