Tim

一枚野生程序员~

  • 主页
  • 分类
  • 标签
  • 归档
  • 关于
所有文章 工具

Tim

一枚野生程序员~

  • 主页
  • 分类
  • 标签
  • 归档
  • 关于

Spring Cloud Bus自动刷新配置

阅读数:次 2020-06-17
字数统计: 1.1k字   |   阅读时长≈ 4分

在之前的文章中,我讲述了统一配置中心(服务端和客户端)的基本使用,并且演示了从配置Git仓库到拉取配置的整个流程,请见《统一配置中心》这篇博客。在该博客中我们说到了,统一配置中心还有个好处就是动态更新配置文件,而无需手动重启服务,但是并没有演示或者实现。本文将记述如何通过Spring Cloud Bus自动刷新配置,以及自动刷新的原理。

自动刷新配置原理

实现配置的自动刷新是很有必要的,先看看使用Spring Cloud Bus实现配置的自动刷新的原理,如下图:

mark

Spring Cloud Bus提供了批量刷新配置的机制,它使用轻量级的消息代理(例如RabbitMQ、Kafka等)连接分布式系统的节点,这样就可以通过Spring Cloud Bus广播配置的变化或者其他的管理指令。shop服务的所有实例通过消息总线连接到了一起,每个实例都会订阅配置更新事件。当其中一个微服务节点的/bus/refresh端点被请求时,该实例就会向消息总线发送一个配置更新事件,其他实例获得该事件后也会更新配置。

实现配置自动刷新

1、引入相关依赖和配置

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

因为Spring Cloud Bus是需要通过消息队列来完成自动刷新配置的功能的,所以需要开启一个消息队列,并且在配置文件中配置一下消息队列,我这里采用的是RabbitMQ:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
spring:
application:
name: config
cloud:
config:
server:
git:
uri: https://gitee.com/zouchanglin/config-repo
username: zouchanglin
password: 00001010101
basedir: /root/config
rabbitmq:
host: 192.168.79.128
port: 5672
username: guest
password: guest

eureka:
instance:
appname: config
client:
service-url:
defaultZone: http://localhost:8762/eureka

统一配置中心和Client启动后可以看到对应的消息队列:

mark

2、暴露更新接口

1
POST http://localhost:8080/actuator/bus-refresh

使用POST方式请求该接口,统一配置中心才知道Git仓库中的配置发生了变化,才会主动去拉取最新的配置,然后把配置更新的消息发送到消息队列,Config Client消费消息从而主动去配置中心拉取最新的配置,才完成了配置自动更新。但是actuator/bus-refresh 这个接口需要暴露出去,Git的WebHook才能访问到这个接口,所以还需要在统一配置中心的配置文件中加入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
spring:
application:
name: config
cloud:
config:
server:
git:
uri: https://gitee.com/zouchanglin/config-repo
username: zouchanglin
password: 00101010101
basedir: /root/config
rabbitmq:
host: 192.168.79.128
port: 5672
username: guest
password: guest

# 把actuator/bus-refresh接口暴露出去
management:
endpoints:
web:
exposure:
include: "*"

eureka:
instance:
appname: config
client:
service-url:
defaultZone: http://localhost:8762/eureka

更新完配置文件后,重启一下统一配置中心。

3、声明配置自动更新范围

shop-dev.yml配置如下,它的env属性是dev

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server:
port: 8090

eureka:
client:
service-url:
defaultZone: http://localhost:8762/eureka/

spring:
application:
name: shop
rabbitmq:
host: 192.168.79.128
port: 5672
username: guest
password: guest
env: dev

我们在测试拿到的配置文件的内容的时候,写了这样的Controller,现在需要新加一个@RefreshScope注解,其实就是声明了配置自动更新的生效范围,所以需要加上@RefreshScope注解:

1
2
3
4
5
6
7
8
9
10
11
12
13
@RestController
@RequestMapping("/env")
@RefreshScope
public class EnvController {

@Value("${env}")
private String env;

@GetMapping("print")
public String printEnv(){
return env;
}
}

但是通常不这样使用,我们往往是把配置集中到一起,然后在配置类上面声明,假设现在Git仓库的shop-dev.yml配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
server:
port: 8090

eureka:
client:
service-url:
defaultZone: http://localhost:8762/eureka/

spring:
application:
name: shop
rabbitmq:
host: 192.168.79.128
port: 5672
username: guest
password: guest
env: dev

boy:
name: Tim
age: 18

于是在config目录下新建一个JavaBean,叫做Boy,这时对这个Boy加上@RefreshScope:

1
2
3
4
5
6
7
8
9
10
package xpu.edu.shop_service.config;

@Data
@Component
@ConfigurationProperties(prefix = "boy")
@RefreshScope
public class Boy {
private String name;
private int age;
}

此时Controller修改为如下:

1
2
3
4
5
6
7
8
9
10
11
12
@RestController
@RequestMapping("/env")
public class EnvController {

@Autowired
private Boy boy;

@GetMapping("print")
public String printEnv(){
return "name:" + boy.getName() + " age:" + boy.getAge();
}
}

通过手动访问/actuator/bus-refresh 接口,已经实现了刷新,如下图所示:

mark

现在自动刷新就只差一步了,那就是配置Git的WebHook,只要发生更新或者是其他事件,Git托管平台便会自动访问我们的/actuator/bus-refresh 接口,从而自动刷新配置文件就完成了!

mark

赏

谢谢你请我喝咖啡

支付宝
微信
  • 本文作者: Tim
  • 本文链接: https://zouchanglin.cn/3723627023.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 许可协议。转载请注明出处!
  • SpringCloud
  • 配置中心
  • 微服务架构

扫一扫,分享到微信

RabbitMQ学习
统一配置中心
  1. 1. 自动刷新配置原理
  2. 2. 实现配置自动刷新
    1. 2.1. 1、引入相关依赖和配置
    2. 2.2. 2、暴露更新接口
    3. 2.3. 3、声明配置自动更新范围
© 2017-2021 Tim
本站总访问量次 | 本站访客数人
  • 所有文章
  • 工具

tag:

  • 生活
  • Android
  • 索引
  • MySQL
  • 组件通信
  • Nginx
  • JavaSE
  • JUC
  • JavaWeb
  • 模板引擎
  • 前端
  • Linux
  • 计算机网络
  • Docker
  • C/C++
  • JVM
  • 上传下载
  • JavaEE
  • SpringCloud
  • Golang
  • Gradle
  • 网络安全
  • 非对称加密
  • IDEA
  • SpringBoot
  • Jenkins
  • 字符串
  • vim
  • 存储
  • 文件下载
  • Mac
  • Windows
  • NIO
  • RPC
  • 集群
  • 微服务
  • SSH
  • 配置中心
  • XML
  • Chrome
  • 压力测试
  • Git
  • 博客
  • 概率论
  • 排序算法
  • 分布式
  • 异常处理
  • 文件系统
  • 哈希
  • openCV
  • 栈
  • 回溯
  • SpringCore
  • 流媒体
  • rtmp
  • 面向对象
  • Vue
  • ElementUI
  • 软件工程
  • 异步
  • 自定义UI
  • ORM框架
  • 模块化
  • 交互式
  • Jsoup
  • Http Client
  • LRUCache
  • RabbitMQ
  • 消息通信
  • 服务解耦
  • 负载均衡
  • 权限
  • 多线程
  • 单例模式
  • Protobuf
  • 序列化
  • Python
  • m3u8
  • 堆
  • 二叉树
  • 自定义View
  • 观察者模式
  • 设计模式
  • 线程池
  • 动态扩容
  • 高可用
  • GC
  • ffmpeg
  • SpringMVC
  • REST
  • Redis
  • 缓存中间件
  • UML
  • Maven
  • Netty
  • 高性能网络
  • IPC通信
  • IO
  • Stream
  • 发布订阅
  • SQLite
  • Hash
  • 集合框架
  • 链表
  • Lambda
  • 汇编语言
  • 组件化
  • Router
  • 开发工具

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia-plus根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 思维导图
  • PDF工具
  • 无损放大
  • 代码转图
  • HTTPS证书