SpringCloud Config分布式配置中心
概述
提供集中化的外部配置攴持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的配置,Spring Cloud Config分为服务端和客户端两部分
-
服务端也称为分布式配置中心,它是独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密解密信息等访问接口
-
客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息,配置服务器默认采用 git 来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过 git 客户端工具来方便的管理和访问配置内容
即:
-
Server 端:提供配置文件的存储、以接口的形式将配置文件的内容提供出去,通过使用@EnableConfigServer注解在 Spring boot 应用中非常简单的嵌⼊
-
Client 端:通过接口获取配置数据并初始化自己的应用
Config作用
不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release
运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息
当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置
将配置信息以REST接口的形式暴露(post、curl访问刷新均可......)
主要分支
-
集中管理配置文件
-
不同环境不同配置,动态化的配置更新,分环境部署比如 dev/test/prod/beta/release
-
运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息
-
当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置
-
将配置信息以REST接口的形式暴露
-
Github整合配置:由于 Spring Cloud Config默认使用Git来存储配置文件(也有其它方式比如支持SVN和本地文件),但最推荐的还是Git,而且使用的是http/https访问的形式
说明:由于SpringCloud Config默认使用Git来存储配置文件(也有其它方式,比如支持SVN和本地文件),Config Server是集中式的配置服务,用于集中管理应用程序各个环境下的配置。 默认使用Git存储配置文件内容,也可以SVN。
但最推荐的还是Git,而且使用的是http/https访问的形式
官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-config/2.2.1.RELEASE/reference/html/
#### Config服务端配置与测试
用你自己的账号在GitHub、Gitee上新建一个名为springcloud-config的新Repository
gitee地址:https://gitee.com/xxxxxx/springcloud-config.git
git clone https://gitee.com/xxxx/springcloud-config.git //ssh方式访问
##### 用你自己的账号在GitHub或gitee上新建一个名为springcloud-config的新Repository
##### 由上一步获得刚新建的git地址
##### 本地硬盘目录上新建git仓库并clone
git命令
git clone git@github.com:zzyybs/springcloud-config.gi
此时在本地D盘符下D:\44\SpringCloud2020\springcloud-config
git add .
git commit -m "init yml"
git push origin master
新建Module模块cloud-config-center-3344 即为Cloud的配置中心模块cloudConfig Center
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud-parent</artifactId>
<groupId>cn.spring.cloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-config-center-3344</artifactId>
<packaging>jar</packaging>
<name>cloud-config-center-3344</name>
<description>cloud-config-center-3344</description>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.12.RELEASE</version>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
<finalName>cloud-config-center-3344</finalName>
</build>
</project>
application.yaml
server
port3344
spring
application
name cloud-config-center #注册进Eureka服务器的微服务名
cloud
config
server
git
#uri: git@github.com:zzyybs/springcloud-config.git #GitHub上面的git仓库名字
####搜索目录
uri https //gitee.com/xxxx/springcloud-config.git
force-pulltrue
usernamexxxxx
password xxxxx
search-paths
D:\springcloud-config\springcloud-config\springcloud-config\springcloud-config
####读取分支
label master
#服务注册到eureka地址
eureka
client
service-url
defaultZone http //eureka7001.com 7001/eureka,http //eureka7002.com 7002/eureka
修改config-dev.yml配置并提交到GitHub中,比如加个变量age或者版本号version
主启动
//开启配置服务
public class ConfigCenterMain3344
{
public static void main(String[] args) {
SpringApplication.run(ConfigCenterMain3344.class, args);
}
}
windows下修改hosts文件,增加映射
127.0.0.1 config-3344.com
测试通过Config微服务是否可以从GitHub上获取配置内容
配置读取规则
/{label}/{application}-{profile}.yml
master分支
http://config-3344.com:3344/master/config-dev.yml
http://config-3344.com:3344/master/config-test.yml
http://config-3344.com:3344/master/config-prod.yml
dev分支
http://config-3344.com:3344/dev/config-dev.yml
http://config-3344.com:3344/dev/config-test.yml
http://config-3344.com:3344/dev/config-prod.yml
/{application}-{profile}.yml
/{application}/{profile}[/{label}]
重要配置细节总结
/{name}-{profiles}.yml
/{label}-{name}-{profiles}.yml
label:分支(branch) name :服务名 profiles:环境(dev/test/prod)
Config客户端配置与测试
新建cloud-config-client-3355
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud-parent</artifactId>
<groupId>cn.spring.cloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-config-client-3355</artifactId>
<packaging>jar</packaging>
<name>cloud-config-client-3355</name>
<description>cloud-config-client-3355</description>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.12.RELEASE</version>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
<finalName>cloud-config-client-3355</finalName>
</build>
</project>
bootstrap.yml
applicaiton.yml是用户级的资源配置项 bootstrap.yml是系统级的,优先级更加高
Spring Cloud会创建一个“Bootstrap Context”,作为Spring应用的Application Context
的父上下文。初始化的时候,Bootstrap Context
负责从外部源加载配置属性并解析配置。这两个上下文共享一个从外部获取的Environment
。
Bootstrap
属性有高优先级,默认情况下,它们不会被本地配置覆盖。 Bootstrap context
和Application Context
有着不同的约定,所以新增了一个bootstrap.yml
文件,保证Bootstrap Context
和Application Context
配置的分离。
要将Client模块下的application.yml文件改为bootstrap.yml,这是很关键的, 因为bootstrap.yml是比application.yml先加载的。bootstrap.yml优先级高于application.yml
server
port3355
spring
application
name config-client
cloud
#Config客户端配置
config
label master #分支名称
name config #配置文件名称
profile dev #读取后缀名称 上述3个综合:master分支上config-dev.yml的配置文件被读取http://config-3344.com:3344/master/config-dev.yml
uri http //localhost 3344 #配置中心地址k
#服务注册到eureka地址
eureka
client
service-url
defaultZone http //eureka7001.com 7001/eureka,http //eureka7002.com 7002/eureka
修改config-dev.yml配置并提交到GitHub中,比如加个变量age或者版本号version
主启动
public class ConfigClientMain3355
{
public static void main(String[] args)
{
SpringApplication.run(ConfigClientMain3355.class,args);
}
}
业务类
public class ConfigClientController
{
("${config.info}")
private String configInfo;
("/configInfo")
public String getConfigInfo()
{
return configInfo;
}
}
测试
启动Config配置中心3344微服务并自测
http://config-3344.com:3344/master/config-prod.yml
http://config-3344.com:3344/master/config-dev.yml
启动3355作为Client准备访问
http://localhost:3355/configInfo
成功实现了客户端3355访问SpringCloud Config3344通过GitHub获取配置信息
问题:
Linux运维修改GitHub上的配置文件内容做调整
刷新3344,发现ConfigServer配置中心立刻响应
刷新3355,发现ConfigClient客户端没有任何响应
3355没有变化除非自己重启或者重新加载
难到每次运维修改配置文件,客户端都需要重启??噩梦
Config客户端之动态刷新
避免每次更新配置都要重启客户端微服务3355
动态刷新
步骤
POM引入actuator监控
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
修改YML,暴露监控端口
management:
endpoints:
web:
exposure:
include: "*"
@RefreshScope业务类Controller修改
public class ConfigClientController
{
("${config.info}")
private String configInfo;
("/configInfo")
public String getConfigInfo() {
return configInfo;
}
}
此时修改github---> 3344 ---->3355
需要运维人员发送Post请求刷新3355
curl -X POST "http://localhost:3355/actuator/refresh"
再次访问: http://localhost:3355/configInfo
成功实现了客户端3355刷新到最新配置内容