1.为什么需要配置中心
在微服务架构中,每一个微服务都有自己的配置文件,如果每个服务自行配置,就会面临以下问题:
1.维护成本高:每次配置修改,都需要重新部署服务。
2.版本问题:同一个应用的不同实例,需要使用同一个版本,逐一部署,可能会导致版本不一致的问题。
3.安全问题:一些敏感的配置(如数据库密码)可能会泄露,缺乏安全的管理手段。
......
所有就有了配置中心,对我们项目中的配置进行统一的管理。
2.SpringCloudConfig的核心概念

1.Config Server(配置服务器)
Config Server是一个配置管理服务器,负责从各种后端存储(如Git、SVN、本地文件系统)中拉取配置信息,并提供REST API供客户端使用。
2.Config Client(配置客户端)
Config Client是应用程序中一个组件,它允许应用程序通过ConfigClient连接到ConfigServer并动态获取配置信息,客户端可以根据环境,服务名等动态选择对应的配置文件。
3.版本控制集成
Spring Cloud Config,默认使用Git作为配置存储的后端,利用Git管理配置文件的版本,通过切换版本号来获取对应环境下的配置。
3.搭建ConfigServer
1.创建项目
2.添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
3.启用ConfigServer

4.完善配置
server:
port: 7071
spring:
application:
name: config-server # 应⽤名称
cloud:
config:
server:
git:
uri: https://gitee.com/wanghao86/config-server.git #配置⽂件Git 地址
default-label: master #配置⽂件分⽀
search-paths: config #配置⽂件所在根⽬录
5.初始化Git仓库
4.Config Client
1.配置管理(配置中心去配置信息)
2.添加Config的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- bootstrap代表从外部获取配置信息就需要加-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
3.应用程序中配置 服务器的信息(服务器的地址,环境)
spring:
profiles:
active: prod #与下面的profile同时存在,以当前配置下的环境为准
application:
name: product-service
cloud:
config:
uri: http://127.0.0.1:7071
# profile: dev
4.测试:读取配置
@RestController
@RequestMapping("/config")
public class ConfigController {
@Value("${data.env}")
private String env;
@RequestMapping("/getEnv")
public String getEnv() {
return env;
}
}
5.多平台配置
spring:
profiles:
active: prod #与下面的profile同时存在,以当前配置下的环境为准
application:
name: product-service
# cloud:
# config:
# uri: http://127.0.0.1:7071
# profile: dev
#配置多平台
---
spring:
config:
activate:
on-profile: dev
cloud:
config:
uri: http://127.0.0.1:7071
---
spring:
config:
activate:
on-profile: prod
cloud:
config:
uri: http://127.0.0.1:7071
自动刷新
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
添加注解
@RefreshScope //自动刷新
@RestController
@RequestMapping("/config")
public class ConfigController {
@Value("${data.env}")
private String env;
@RequestMapping("/getEnv")
public String getEnv() {
return env;
}
}
开启端点
#需要开启的端点, 这⾥主要⽤到的是refresh端点, 只开启这⼀个就可以, 为了⽅便, 可以开启所有端点, 除了shutdown端点
management:
endpoint:
shutdown:
enabled: false
endpoints:
web:
exposure:
include: "*"
修改配置后, 发现配置并不能⽴即⽣效
需要⼿动调⽤⼀下接⼝ http://127.0.0.1:9090/actuator/refresh (POST请求)动态刷新 Spring Cloud
Config 客⼾端的配置 (客⼾端服务接⼝)
多服务实例同时刷新
如果服务⽐较多, 需要每个服务都调⽤⼀次才能⽣效,可以借助SpringCloudBus来解决.
Spring Cloud Bus 是Spring Cloud体系中的⼀个组件, 主要⽤于在集群环境中传播分布式系统的配置变更, 以及提供事件驱动的通信机制. Spring Cloud Bus 核⼼原理其实就是利⽤消息队列做⼴播,所以要先有个消息队列, ⽬前Spring Cloud Bus ⽀持两种消息代理:RabbitMQ和Kafka.
我们采⽤RabbitMQ实现.
修改配置
spring:
rabbitmq:
addresses: amqp://study:study@47.108.157.13:5672/bite
添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
加密
在微服务开发中, 配置⽂件可能包含⼀些敏感信息, ⽐如数据库密码, API密码等, 直接明⽂存储这些信息,在配置⽂件中是⾮常危险的, 尤其是当配置⽂件存储在版本控制系统(如Git)中时. 这时候我们就需要对这些敏感信息进⾏加密。
针对这个问题, Spring Cloud Config提供了对属性进⾏加密解密的功能, 以保护配置⽂件中的敏感数据不被泄露。
data:
password: '{cipher}edf62f27bc6dbc7655f1acb810003eef2004d0e4bc0a3bc193b451cdd7b5648d'
对称加密
1.下载jar包


2.添加配置,设置秘钥(Config server)

3.添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
4.测试


使用:
在gitee修改密码的值

此处password的这个字符串的引号不能省略,加上{cipher}后面跟上原密码经过加密后的数据。


非对称加密
1.生成密钥对
keytool -genkeypair -keystore D:/config-server.keystore -alias config-server -keyalg RSA -keypass config -storepass config

2.将生成的文件放到配置文件目录下


3.修改bootstrap配置文件


4.使用cmd进行加解密

5.修改gitee配置

6.测试
