# 统一配置中心
- 官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-config/2.2.3.RELEASE/reference/html/#_spring_cloud_config_server
- config 分为 config server 和 config client。用来统一管理所有微服务的配置
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-config-serverartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-consul-discoveryartifactId>
dependency>
server.port=8555
# 服务名
spring.application.name=CONFIG-SERVER
# consul 注册中心地址
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
# gitee 仓库地址
spring.cloud.config.server.git.uri=https://gitee.com/lwwby/config-center.git
# 指定默认拉取配置信息的分支名
spring.cloud.config.server.default-label=master
# 如果仓库是私有的,需要配置用户名和密码
#spring.cloud.config.username=
#spring.cloud.config.password=
@SpringBootApplication
@EnableDiscoveryClient
@EnableConfigServer
public class ConfigServerApplication {
}
config client也就是一个个具有实际业务含义的微服务,例如order服务,user服务
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-config-clientartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-consul-discoveryartifactId>
dependency>
分别新建 configclient.properties、 configclient-dev.properties、 configclient-test.properties。
在实际开发中,建议以服务名命名,例如order-dev.properties/order-dev.yml
项目中配置文件需要命名为bootstrap.properties/bootstrap.yml,容器启动时bootstrap.properties/bootstrap.yml命名会比application.properties/application.yml命名优先加载(先要去配置中心拉去配置到本地缓存)。
bootstrap.properties 项目本地配置
# 开启配置发现
spring.cloud.config.discovery.enabled=true
# 指定配置中心服务ID,去注册中心获取
spring.cloud.config.discovery.service-id=CONFIG-SERVER
# consul 注册中心地址
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
# 指定拉取配置文件的分支
spring.cloud.config.label=master
# 指定拉取配置文件的名称
spring.cloud.config.name=configclient
# 指定拉取配置文件的环境
spring.cloud.config.profile=test
测试代码
@RestController
public class ConfigController {
@Value("${name}")
private String name;
@GetMapping("/demo")
public String demo() {
return name;
}
}
如果命名为application.properties/application.yml,config client启动会报错,ConfigController无法注入name属性(配置文件信息还未加载到本地)
启动类,引入config-client依赖即可,无需加额外注解
@SpringBootApplication
@EnableDiscoveryClient
public class ConfigClientApplication {
}
config server启动后,可以通过地址获取配置信息,例如:http://localhost:8555/configclient-dev.properties
配置信息= configclient.properties(默认会获取到) + configclient-dev.properties
- 当远端git仓库中配置发生变化时,不需要重启微服务,就可以读取到修改之后的最新配置信息
// 添加注解@RefreshScope,仅作用于当前类ConfigController的配置刷新
@RestController
@RefreshScope
public class ConfigController {
@Value("${name}")
private String name;
@GetMapping("/demo")
public String demo() {
return name;
}
}
# 注意properties格式为*,yml格式为"*"
# /actuator/refresh端点默认是不开启的。"*"代表开启所有端点
management.endpoints.web.exposure.include=*
- 使用post
http://localhost:8655/actuator/refresh
- 命令行终端
curl -X POST http://localhost:8655/actuator/refresh
- 官方文档: https://spring.io/projects/spring-cloud-bus
- spring cloud bus使用轻量级消息代理将分布式系统的节点连接起来。然后可以使用它来广播状态更改(例如配置更改)或其他管理命令。AMQP和kafka broker(中间件)实现包含在项目中。或者,在类路径上找到任何spring cloud stream绑定器都可以作为传输使用。
- bus称之为spring cloud中消息总线,主要用来在微服务系统中实现远端配置更新时,通过广播形式通知所有客户端刷新配置信息,避免手动重启服务来刷新配置
实现配置刷新原理
安装RabbitMQ(todo)