SpringCloudConfig-手动重新获取配置文件内容(单个服务通知+通过消息队列广播)
一、SpringCloudConfig定义
spring cloud config是一个基于http协议的远程配置实现方式。通过统一的配置管理服务器进行配置管理,客户端通过https协议主动的拉取服务的的配置信息,完成配置获取。
二、为什么要使用监听的形式重新获取配置文件内容,而不是重启服务
1、无需重启服务,方便管理
三、使用(注册中心内容不再展示)
1、单个服务通知的形式来更新配置文件内容
(1)、远程gitHub内容(config-client.yml)
spring: profiles: active: dev --- server: port: 8081 spring: profiles: dev application: name: demo-client eureka: client: service-url: defaultZone: http://localhost:8080/eureka/ # 是否将自己注册为服务 register-with-eureka: true # 需要检索检索服务 fetch-registry: true name: test --- server: port: 8082 spring: profiles: test application: name: demo-client eureka: client: service-url: defaultZone: http://localhost:8080/eureka/ # 是否将自己注册为服务 register-with-eureka: true # 需要检索检索服务 fetch-registry: true name: test
(2)、ConfigServer的配置
1、pom.xml的引用如下:
<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-client</artifactId> </dependency>
2、直接上配置文件内容(application.yml)
spring: application: name: demo-config cloud: config: server: git: uri: https://github.com/SweetPiglet/spring-cloud-config.git username: your username password: your password eureka: client: service-url: defaultZone: http://localhost:8080/eureka/ # 是否注册为服务 register-with-eureka: true # 是否进行扫描 fetch-registry: true
(3)、ConfigClient配置内容
1、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-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
2、配置文件的配置(bootstrap.yml)
# 引入ConfigServer的内容
spring:
cloud:
config:
uri: http://localhost:9000/
name: config-client
profile: dev
label: master
# 暴露监控点
management:
endpoints:
web:
exposure:
include: "*"
3、controller层的内容
/** * wsq */ @RestController @RefreshScope public class TestController { # 需要刷新什么属性,就写什么属性 @Value("${name}") private String name; @GetMapping("/test") public String test(){ return name; } }
(4)、运行程序
首先启动eurekaserver,之后启动configserver,最后启动configclient。
之后进行接口的访问:
http://localhost:9000/config-client-dev.yml
http://localhost:8081/test
之后修改配置文件的内容,将name原来的test改成test1
然后在window黑窗口中输入:
curl -X POST '''http://localhost:8081/actuator/refresh'
之后再次访问连接,查看变化,发现没有重启服务依然可以达到刷新配置文件的效果
2、监听+消息队列来实现配置的更新
(1)、出现原因
如果运维工程师修改了很多个配置文件,也就是说需要访问每一个服务,当然可以写一个脚本,但是呢,如果有服务的增加就需要改动脚本,那么有没有一种不需要进行配置的形式呢
(2)、作用
运维工程师直接通知一下configserver,configserver通过消息队列的topic形式,发一个通知,只要是订阅了该通知的,都可以收到通知,进行相应配置的更新
(3)、做法
1、首先,rabbitmq和erlang的安装,不多说自行百度
2、基于上面的代码,进行微调即可
configserver需要添加的内容如下:
pom.yml
<!--监听--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--rabbitmq--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency>
application.yml
# 连接rabbitmq spring: rabbitmq: host: 127.0.0.1 port: 5672 username: guest password: guest # 配置监听 management: endpoints: web: exposure: include: 'bus-refresh'
configclient的变更如下:
pom.xml
<!--rabbitmq--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency>
bootstarp.yml
# 引入rabbitmq
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
# 暴露监控点
management:
endpoints:
web:
exposure:
include: "*"
(4)测试
首先启动eurekaserver,之后启动configserver,最后启动configclient。
之后进行接口的访问:
http://localhost:9000/config-client-dev.yml
http://localhost:8081/test
之后修改配置文件的内容,将name原来的test改成test1
然后在window黑窗口中输入:
curl -X POST '''http://localhost:9000/actuator/bus-refresh'
之后再次访问连接,查看变化,发现没有重启服务依然可以达到刷新配置文件的效果
完工
三、最后提一下定点通知:
curl -X POST '''http://localhost:9000/actuator/bus-refresh/config-client:8081'
也就是后面加上服务名加端口的形式来进行服务的定点刷新
原文地址:https://www.cnblogs.com/mcjhcnblogs/p/13286944.html
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 【JUC】CountDownLatch你真的了解吗?
- mybatis动态sql之foreach补充(一)
- 【LeetCode】把字符串 s 中的每个空格替换成““%20””day02
- bert加载数据代码
- python爬虫--看看虎牙女主播中谁颜值最高
- 基于maven+ssm的增删改查之maven环境的搭建
- (22)Bash环境变量
- maven之在eclipse中创建maven项目
- wiki百科之将词转换为索引表示
- 【LeetCode】找出数组中重复的数字day01
- pytorch实现的transformer代码分析
- 终于搞懂HashMap的源码了!!!
- (21)Bash用户自定义变量
- python实现支持向量机之具体实现
- Spring boot 集成apollo达到配置的热加载