SpringCloud之Config
SpringCloud之Config
推荐网站:https://www.springcloud.cc/spring-cloud-dalston.html#_spring_cloud_config
1. 什么是 Spring Cloud Config
Spring Cloud Config 是 Spring 官方提供的 分布式配置中心 组件,用来 集中管理、动态下发、版本控制 所有微服务的配置文件,支持 Git、文件系统、Vault(什么是Vault ?) 等多种后端存储。
2. 核心作用
.
痛点 | 没有 Config 的情况 | 有 Config 的解决方式 |
---|---|---|
配置分散 | 每个微服务自己维护 application.yml ,修改要重启所有服务 | 集中存储(Git),一处修改,全部生效 |
环境差异 | 开发、测试、生产配置混杂,容易出错 | 多环境隔离(application-dev.yml 、application-prod.yml ) |
敏感信息 | 数据库密码明文写在代码里 | 加密存储(对称/非对称加密,集成 Vault) |
动态刷新 | 修改配置必须重启服务 | @RefreshScope 实现 热更新(无需重启) |
版本回滚 | 配置改错了无法回退 | Git 版本控制,一键回滚 |
3. 工作流程
工作流程(标准模式):
- 开发者将配置文件上传到 Git 仓库(如 GitHub、GitLab)。
- Config Server 启动后连接 Git 仓库,将配置缓存到本地。
- 微服务(Config Client)启动时,通过 HTTP 请求 Config Server 拉取配置。
- 支持动态刷新:通过 POST /actuator/refresh 或 Spring Cloud Bus + MQ(如 RabbitMQ/Kafka)实现批量刷新
架构图:
┌────────────────────────────────────────────┐
│ Git 仓库(远程) │
│ application.yml │
│ application-dev.yml │
│ application-prod.yml │
└─────────────┬──────────────────────────────┘│ 1. 拉取配置▼
┌────────────────────────────────────────────┐
│ Config Server(配置中心) │
│ - 暴露 REST API │
│ - 支持 Git、本地文件、数据库等存储 │
│ - 支持加密/解密 │
└─────────────┬──────────────────────────────┘│ 2. HTTP 拉取配置▼
┌────────────────────────────────────────────┐
│ Config Client(微服务) │
│ - 启动时从 Config Server 获取配置 │
│ - 支持 @RefreshScope 热刷新 │
│ - 可注册到 Eureka/Nacos 等服务发现 │
└────────────────────────────────────────────┘
4. 代码示例(模拟3中的架构流程:client -> server -> gitee)
(1)先在远程仓库建立配置文件
这里使用gitee仓库,一样可以支持:
远程仓库具体配置代码,我们配置两套信息,dev, test, 仅供参考:
spring:profiles: active: dev
---
server:port: 8201spring:profiles: devapplication:name: springcloud-config-deveureka:client:server-url:defaultZone: http://localhost:7001/eureka
---
server:port: 8202spring:profiles: testapplication:name: springcloud-config-testeureka:client:server-url:defaultZone: http://localhost:7001/eureka
(2) 创建config-server服务
使用config-server服务连接远程仓库:
- 创建config-server服务模块,导入pom依赖:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.3.5.RELEASE</version></dependency><!--config--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId><version>2.1.1.RELEASE</version></dependency>
- 对应resources目录下编写yml文件:
server:port: 9001
spring:application:name: springcloud-config-server# 连接远程仓库cloud:config:server:git:# 注意是https的而不是sshuri: https://gitee.com/LiDaBao0829/test123.git# 通过 config-server可以连接到gitee,去访问刚才的资源配置
- 添加主启动类
@SpringBootApplication
@EnableConfigServer
public class ConfigServer_9001 {public static void main(String[] args) {SpringApplication.run(ConfigServer_9001.class, args);}
}
(3)创建config-client服务
使用config-client服务去连接调用config-server服务,获取远程仓库配置信息
- 创建config-client模块,导入pom依赖:
<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId><version>2.1.1.RELEASE</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId><version>2.3.5.RELEASE</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.3.5.RELEASE</version></dependency></dependencies>
- 对应resources下创建 application.yml 和 bootstrap.yml 配置文件:
注:优先级:远程配置 > 本地 bootstrap.yml > application.yml
bootstrap.yml :
# 系统级别的配置
spring:cloud:config:name: config-client # 对应gitee上需要读取的资源名称,不要后缀profile: test #读取哪个环境,这里选择testlabel: master #远程仓库分支uri: http://localhost:9001 #读取配置的路径,这里选择我们的config-server模块地址
application.yml:
# 用户级别的配置
spring:application:name: springcloud-config-client
- 创建一个controller类,用于测试我们获取到的配置信息:
@RestController
public class ConfigClientController {//获取微服务名称@Value("${spring.application.name}")private String applicationName;//获取Eureka服务@Value("${eureka.client.server-url.defaultZone}")private String eurekaServer;//获取服务端的端口号@Value("${server.port}")private String port;@RequestMapping("/config")public String getConfig(){return "applicationName: " + applicationName + "\n"+ " eurekaServer: " + eurekaServer + "\n"+ " port:" + port;}
- 创建主启动类:
@SpringBootApplication
public class ConfigClient {public static void main(String[] args) {SpringApplication.run(ConfigClient.class, args);}
}
(4)调用测试
先启动 config-server 服务,再启动 config-client 服务,访问 config-client 服务的 getConfig 接口,测试是否可以获取到远程配置信息,我们在 config-client服务 中的 bootstrap.yml 配置的是获取 test 环境,期望结果是获取到对应远程仓库的test配置信息。
测试结果:
成功!
5. 总结
Spring Cloud Config = 远程仓库 + Config Server(服务端)+ Config Client(客户端),实现集中管理、版本控制、动态刷新的微服务配置中心。