Spring Cloud Config是⼀个分布式配置管理⽅案,包含了 Server端和 Client端两个部分
Config简介
- Server 端:提供配置⽂件的存储、以接口的形式将配置⽂件的内容提供出去,通过使用
@EnableConfigServer
注解在 Spring boot 应用中嵌⼊
- 命名规则如下:
{application}-{profile}.yml
或者{application}-{profile}.properties
其中,
application为应⽤名称,profile指的是环境(⽤于区分开发环境,测试环境、⽣产环境等)
- Client 端:通过接口获取配置数据并初始化自己的应用
构建config-server
- gitee 产品上新建公开仓库新建配置文件
m-service-resume-dev.yml
server:
port: 8080
spring:
application:
name: m-service-resume
#注册发现
eureka:
client:
service-url:
defaultZone: http://CloudEurekaServerA:8761/eureka,http://CloudEurekaServerB:8762/eureka
# 每隔多久拉取⼀次服务列表
registry-fetch-interval-seconds: 30
instance:
#显示ip
prefer-ip-address: true
# 192.168.28.22:m-service-autodeliver:8090:1.0-SNAPSHOT
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}:@project.version@
#元数据
metadata-map:
A: A1
B: A1
# 租约续约间隔时间,默认30秒
lease-renewal-interval-in-seconds: 30
# 租约到期,服务时效时间,默认值90秒,服务超过90秒没有发⽣⼼跳,EurekaServer会将服务从列表移除
lease-expiration-duration-in-seconds: 90
my:
test:
num: 100
- 构建module
m-cloud-config-server
- 导入依赖
<!--eureka client 客户端依赖引⼊-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--config配置中⼼服务端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
- 启动类
@SpringBootApplication
@EnableDiscoveryClient
@EnableConfigServer //开启Config配置
public class McloudConfigServer {
public static void main(String[] args) {
SpringApplication.run(McloudConfigServer.class,args);
}
}
- 配置文件 application.yml
- 添加config配置
spring:
cloud:
config:
server:
git:
uri: https://gitee.com/vipMygz/m-cloud-config-server.git
username: XXXXXX
password: XXXXXX
search-paths:
- m-cloud-config-server
label: master
server:
port: 9006
spring:
application:
name: m-cloud-config-server
cloud:
config:
server:
git:
uri: https://gitee.com/vipMygz/m-cloud-config-server.git
username: XXXXXX
password: XXXXXX
search-paths:
- m-cloud-config-server
label: master
#注册发现
eureka:
client:
service-url:
defaultZone: http://CloudEurekaServerA:8761/eureka,http://CloudEurekaServerB:8762/eureka
# 每隔多久拉取⼀次服务列表
registry-fetch-interval-seconds: 30
instance:
prefer-ip-address: true
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}:@project.version@
# 租约续约间隔时间,默认30秒
lease-renewal-interval-in-seconds: 30
# 租约到期,服务时效时间,默认值90秒,服务超过90秒没有发⽣⼼跳,EurekaServer会将服务从列表移除
lease-expiration-duration-in-seconds: 90
-
启动config 服务
客户端改造
???既然是配置中心我们把客户端的服务注册到Eureka中心,那部分配置放到配置中心。看下效果。
- 改造
m-service-resume-8080
- 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
- Config 客户端配置
spring:
cloud:
config:
uri: http://localhost:9006/
name: m-service-resume
profile: dev
label: master
- application.yml修改为bootstrap.yml配置⽂件
server:
port: 8080
spring:
application:
name: m-service-resume
cloud:
config:
uri: http://localhost:9006/
name: m-service-resume
profile: dev
label: master
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8 &serverTimezone=UTC
username: root
password: root
jpa:
database: MySQL
show-sql: true
hibernate:
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl #避免将驼峰命名转换为下划线命名
- 启动
m-service-resume-8080
,观察注册中心
- 观察注册中心
注册成功,但是有点问题,我们的部分配置没有生效。没有显示IP.,发现配置我们是
而config配置服务获取的结果是,按照ABCD首字母排序的。
这不是问题重点,问题应该是,部分配置没有生效
Config配置手动刷新
问题
- 客户端服务添加contrller 获取my.test.num
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
@Value("${my.test.num}")
private String myTest;
@GetMapping("/viewconfig")
public String viewconfig() {
return "msg==>" + myTest + " num=>" + myTest;
}
}
- 修改gitee 的配置 num 为200,发现客户端并
没有获取到最新的配置
配置手动刷新
- 添加配置
management:
endpoints:
web:
exposure:
include: refresh
##### 或者
management:
endpoints:
web:
exposure:
include: "*"
-
Client客户端使⽤到配置信息的类上添加
@RefreshScope
-
⼿动向Client客户端发起POST请求,http://localhost:8080/actuator/refresh,刷新配置信息
-
重启服务,访问接口
注意:动刷新⽅式避免了服务重启(流程:Git改配置—>for循环脚本⼿动刷新每个微服务)
Config配置自动更新
在微服务架构中,我们可以结合消息总线(Bus)实现分布式配置的⾃动更新(Spring CloudConfig+Spring Cloud Bus)实现⼀次通知处处⽣效
Spring Cloud Bus(基于MQ的,支持RabbitMq/Kafka) 是Spring Cloud中的消息总线方案,Spring
Cloud Config + Spring Cloud Bus 结合可以实现配置信息的自动更新。
- Config Server服务端添加消息总线支持
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
- ConfigServer添加配置
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
- 微服务暴露端口
management:
endpoints:
web:
exposure:
include: bus-refresh
# 暴露端口
management:
endpoints:
web:
exposure:
include: "*"
- 重启各个服务,更改配置之后,向配置中心服务端发送post请求
http://localhost:9003/actuator/bus-refresh //各个客户端配置即可⾃动刷新
http://localhost:9006/actuator/bus-refresh/m-service-resume:8081 //定向刷新