SpringCloud系列之Config自动刷新

作者 胡萝虎 日期 2018-05-07
SpringCloud系列之Config自动刷新

在上一篇SpringCloud系列之Config中,我们介绍了如何使用Spring Cloud Config来搭建一套配置管理系统。通过Spring Cloud Config的Server和Client组件,可以完成配置的管理、获取和刷新。在处理配置刷新时,需要先修改配置,然后再手工发送POST请求到Client端的刷新端点上,这种方式虽然可以实现不停机变更配置的目的,但是在微服务架构下的生产环境中却并不优雅。

当生产环境中部署了大量应用时,如果还是通过人工的方式,一台台的去刷新显然不太合理。没有人愿意做这种费力又容易出错的事情!那么,在Spring Cloud Config下如何实现自动刷新配置呢?答案是Spring Cloud Bus

Spring Cloud Bus

Spring Cloud Bus 是Spring Cloud对事件、消息总线的封装,它将分布式系统中的各个节点使用轻量级的消息代理连接起来,用于在集群(例如,配置变化事件)中传播状态变化,可与Spring Cloud Config联合实现热部署。

Spring Cloud Bus需要利用MQ进行事件、消息的传播与处理,目前常用的是RabbitMQ和Kafka,本文中涉及的MQ为RabbitMQ。所以,在开始之前,读者需要先安装RabbitMQ,由于不是本文的重点,在此不多赘述。

自动刷新原理

image-20180507164059085

使用Spring Cloud Bus完成配置自动刷新的大致流程如下:

  1. 修改并PUSH配置,触发web hook,POST请求到Config Server的 bus/refresh端点
  2. Config Server向MQ发送配置变更消息
  3. Client集群中的实例订阅并接收到MQ投递的消息
  4. Client集群中的实例消费消息,从Config Server获取新配置,并刷新本地配置

实战

准备RabbitMQ

建议读者使用Docker进行安装,方便快捷,此处不深入介绍。

$ docker run -d --name rabbitmq -p 4369:4369 -p 5671:5671 -p 15672:15671 -p 16572:15672 rabbitmq:3-management 

配置Config Server

Config Server不需要做太多修改,仅需要增加必要的依赖和配置即可。

pom.xml增加依赖:

<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.yml增加RabbitMQ和security配置:

server:
port: 8888
spring:
application:
name: config-server
rabbitmq:
host: rabbitmq.huluohu.com #rabbitmq的地址(IP、域名、host等)
port: 32602 #端口
username: guest #用户名
password: guest #密码
management:
security:
enabled: false #需要设置为false

配置Client应用

与Config Server类似,进行添加必要的依赖和配置。

pom.xml增加依赖

<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.yml增加RabbitMQ和security配置:

server:
port: 8088
spring:
rabbitmq:
host: rabbitmq.huluohu.com
port: 32602
username: guest
password: guest
management:
security:
enabled: false

配置webhook

github和gitlab都支持webhook,这里我使用的是gitlab。如果读者手头没有webhook环境,也可以使用Postman工具模拟。

image-20180507180948522

⚠️10.242.14.174是我的机器IP,这里设置的是Config Server端端点,在gitlab中需要进行一点设置才可以访问局域网IP。

  • 使用root账户登录
  • 点击Admin area—>Settings,在 Outbound requests下将Allow request to the local network from hooks and services勾选

image-20180507181230600

测试

  • 启动Config Server应用

  • 启动Config Client应用(config-example以local profile启动)

  • 修改spring-cloud-config-repo下config-example目录中的application-local.properties文件,修改完push到git仓库

  • 浏览器中访问http://localhost:8088/test/config,可以看到配置已变更。

你可能会喜欢

“扫一扫接着看”