作者:jiangzz
电话:15652034180
微信:jiangzz_wx
微信公众账号:jiangzz_wy
Spring Cloud Config 是 Spring Cloud 团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持, 它分为服务端与客户端两个部分。服务端称为分布式配置中心, 它是一个独立的微服务应用, 用来连接配置仓库并为客户端提供获取配置信息、 加密/解密信息等访问接口;客户端微服务架构中的各个微服务应用或基础设施, 它们通过指定的配置中心来管理应用资源与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。
Spring Cloud Config 实现了对服务端和客户端中环境变量和属性配置的抽象映射, 所以它除了适用于 Spring 构建的应用程序之外,也可以在任何其他语言运行的应用程序中使用。 由于 Spring Cloud Config 实现的配置中心默认采用 Git 来存储配置信息, 所以使用 Spring Cloud Config 构建的配置服务器,天然就支持对微服务应用配置信息的版本管理, 并且可以通过 Git 客户端工具来方便地管理和访问配置内容。 当然它也提供了对其他存储方式的支持, 比如 SVN 仓库、 本地化文件系统。
快速入门
配置服务端
- pom.xml
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
- application.propertoes
server.port = 8080
# 连接远程git读取配置信息
spring.cloud.config.server.git.uri = file:///D:/config
management.endpoints.web.exposure.include=*
- SpringBootConfigServer
@SpringBootApplication
@EnableConfigServer
public class SpringBootConfigServer {
public static void main(String[] args) {
SpringApplication.run(SpringBootConfigServer.class,args);
}
}
在本地系统D盘创建git配置文件,这种方式一般用于本地测试,正常情况下需要将配置文件上传到git远程仓库。
Administrator@PC-201610211330 MINGW64 /d/config (master)
$ ls -l
total 3
-rw-r--r-- 1 Administrator 197121 15 五月 31 10:01 SpringCloudConfigServer.properties
-rw-r--r-- 1 Administrator 197121 24 五月 31 10:02 SpringCloudConfigServer-dev.properties
-rw-r--r-- 1 Administrator 197121 20 五月 31 10:02 SpringCloudConfigServer-test.properties
其中:
SpringCloudConfigServer.properties
server.port=6060
SpringCloudConfigServer-dev.properties
server.port=8080
SpringCloudConfigServer-test.properties
server.port=7070
SpringCloud的configServer会启动一个web服务,用于提供配置信息给其他机器。一般提供的访问格式如下
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
其中application
表示应用名字,profile
表示运行的环境参数、label
可以理解为git分支选配,默认值是master
访问地址:http://localhost:8080/SpringCloudConfigServer/test/master
{
"name": "SpringCloudConfigServer",
"profiles": [
"dev"
],
"label": "master",
"version": "6f95be091e7ba209ab17a9cb6a181bb9e045ea2d",
"state": null,
"propertySources": [
{
"name": "file:///D:/config//SpringCloudConfigServer-dev.properties",
"source": {
"server.port": "7070"
}
},
{
"name": "file:///D:/config//SpringCloudConfigServer.properties",
"source": {
"server.port": "6060"
}
}
]
}
配置客户端
- pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<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.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
- ConfigClientApplication
@SpringBootApplication
public class ConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class,args);
}
}
- application.properties
server.servlet.context-path= /SpringCloudConfigClient
- bootstrap.properties
# 指定连接的配置服务名字
spring.application.name=app1
spring.cloud.config.profile=test
spring.cloud.config.label=master
spring.cloud.config.name= SpringCloudConfigServer
spring.cloud.config.uri=http://localhost:8080
# 开启所有的健康检查
management.endpoints.web.exposure.include=*
启动该web应用查看效果
Fetching config from server at : http://localhost:8080
...
Tomcat started on port(s): 7070 (http) with context path '/SpringCloudConfigClient'
...
注意: 上面这些属性必须配置在 bootstrap.properties 中, 这样配置服务器中的配置信息才能被正确加载。
远程git仓库
只需要修改配置服务端的application.properties如下
server.port = 8080
# 连接远程git读取配置信息
spring.cloud.config.server.git.uri = https://github.com/jiangzz/applicationconfig.git
management.endpoints.web.exposure.include=*
在远程的git服务器上创建一个项目applicationconfig,然后在上述测试文件上传到git服务器
$ git remote add origin https://github.com/jiangzz/applicationconfig.git
$ git push --set-upstream origin master
模式匹配 & 多仓库
Spring Cloud Config 也通过对application和profile的模式匹配以支持更加复杂的业务场景。该匹配格式是通过逗号分隔的{application}/profile
命名的通配符:
server.port = 8080
# 连接远程git读取配置信息
spring.cloud.config.server.git.uri = https://github.com/jiangzz/applicationconfig.git
spring.cloud.config.server.git.clone-on-start=true
spring.cloud.config.server.git.refresh-rate=5
spring.cloud.config.server.git.repos.aa.search-paths=app1
spring.cloud.config.server.git.repos.aa.clone-on-start=true
spring.cloud.config.server.git.repos.aa.pattern=app*
spring.cloud.config.server.git.repos.aa.uri=https://github.com/jiangzz/applicationconfig.git
spring.cloud.config.server.git.repos.aa.refresh-rate=5
management.endpoints.web.exposure.include=*
客户端刷新RefreshScope
@RefreshScope
@RestController
public class TestController {
@Value("${server.port}")
private int port;
@RequestMapping
public int test(){
return port;
}
}
执行以下shell
bin>curl.exe -X POST http://localhost:7070/SpringCloudConfigClient/actuator/refresh
下载window版本的curl连接https://curl.haxx.se/windows/dl-7.65.0_1/curl-7.65.0_1-win64-mingw.zip
配置服务器和Eureka集成
在原有的pom文件中添加eureka
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
在application.properties添加Eureka依赖
spring.application.name=CONFIG-SERVICE
eureka.instance.instance-id=001
eureka.instance.prefer-ip-address=true
eureka.instance.lease-expiration-duration-in-seconds=20
eureka.instance.lease-renewal-interval-in-seconds=10
eureka.client.register-with-eureka=true
eureka.client.healthcheck.enabled=true
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://jiangzz:123456@localhost:8761/eureka/
查看Eureka注册中心可以看到刚刚注册上去的服务
配置客户端和Eureka集成
在原有的pom文件中添加eureka
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
在bootstrap.properties添加Eureka依赖
# 指定连接的配置服务名字
spring.application.name=app1
spring.cloud.config.profile=test
spring.cloud.config.label=master
spring.cloud.config.name= SpringCloudConfigServer
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.service-id=CONFIG-SERVICE
# 开启所有的健康检查
management.endpoints.web.exposure.include=*
## 配置Eureka
eureka.client.fetch-registry=true
eureka.client.register-with-eureka=false
eureka.client.service-url.defaultZone=http://jiangzz:123456@localhost:8761/eureka/