前言
随着系统的微服务化,将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,导致配置文件也随着服务的增加而不断的增加,很难统一维护管理。此时配置中心是必不可少的。
什么是Spring Cloud Config?
SpringCloud Config
是微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。
SpringCloud Config分为 服务端和客户端两部分 。
服务端也称为 分布式配置中心,它是一个独立的微服务应用 ,用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息等访问接口 。
客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息配置服务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容。
在搭建server
端前我们先在项目下面新建一个名称为config
目录用来存放配置文件,然后在目录里面新建三个配置文件,并提交到GitHub
上,如下所示:
application-dev.yml
文件内容:profiles: this is dev
application-test.yml
文件内容:profiles: this is test
application-prod.yml
文件内容:profiles: this is prod
配置文件新建好了,下面我们来搭建服务端。
server端
新建一个子模块spring-cloud-config-server
,然后在此模块下新建一个模块spring-cloud-config-server
,整体结构如下:
修改pom文件,引入spring cloud config server端依赖:
<?xml version="1.0" encoding="UTF-8"?>
<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>spring-cloud-config</artifactId>
<groupId>com.chaytech</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>spring-cloud-config-server</artifactId>
<packaging>jar</packaging>
<dependencies>
<!--spring cloud config-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
</dependencies>
</project>
新增application.yml
配置文件:
server:
port: 9002
spring:
application:
name: spring-cloud-config-server
cloud:
config:
server:
git:
uri: https://github.com/chencytech/spring-cloud-examples.git # 配置git仓库的地址
search-paths: config # git仓库地址下的相对地址(如何直接使用仓库根目录的话,就不用配置此路径),可以配置多个,用,分割。
# username: # git仓库的账号
# password: # git仓库的密码
Spring Cloud Config
也支持直接使用本地存储的配置文件,只需使用此配置即可spring.profiles.active=native
,Spring Cloud Config
会默认从应用的src/main/resource
目录下检索配置文件。也可以通过spring.cloud.config.server.native.searchLocations=file:/Users/chency/Documents/workspace_idea/spring-cloud-examples/config
属性来指定配置文件的位置。虽然Spring Cloud Config
提供了这样的功能,但是为了能够有版本控制,建议使用Git来管理。
新建启动类,在启动类上增加@EnableConfigServer
注解,开启配置中文服务支持:
@SpringBootApplication
@EnableConfigServer
public class SpringCloudConfig9002_Application {
public static void main(String[] args) {
SpringApplication.run(SpringCloudConfig9002_Application.class, args);
}
}
到此server端相关配置已经完成,下面我们来测试。
请求:http://127.0.0.1:9002/application-dev.yml
可以看到返回了配置文件的内容,说明Spring Cloud Config
获取到了GitHub
上的配置文件内容。
修改配置文件内容,提交到GitHub
,再次请求此地址:http://127.0.0.1:9002/application-dev.yml
可以看到获取到的配置也是最新的,说明Spring Cloud Config
会自动从GitHub
上获取最新的配置数据。
Spring Cloud Config
会将配置文件转换成可以直接通过URL访问的地址,前面我们演示的时候,是直接在后面拼的配置文件名称,Spring Cloud Config
还支持如下几种访问规则:
- /{application}/{profile}[/{label}]:http://127.0.0.1:9002/application/dev/master
- /{application}-{profile}.yml:http://127.0.0.1:9002/application-dev.yml
- /{label}/{application}-{profile}.yml:http://127.0.0.1:9002/master/application-dev.yml
ok,服务端搭建好了,下面我们来演示客户端如何从服务端获取配置信息。
client端
在spring-cloud-config-server
模块下新建一个子模块spring-cloud-config-client
:
修改pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<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>spring-cloud-config</artifactId>
<groupId>com.chaytech</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>spring-cloud-config-client</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--spring cloud config client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
</dependencies>
</project>
新增application.yml
配置文件:
server:
port: 9003
spring:
application:
name: spring-cloud-config-client
新增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
配置的分离。
因为配置中心的配置优先级要高于applicaiton.yml
,所以配置中心的相关配置都配置在此文件内:
spring:
cloud:
config:
name: application # 对应{application}部分
profile: dev # 对应{profile}部分
label: master # 对应git的分支
uri: http://localhost:9002 # 配置中心服务端地址
新增ClientController
,用于后面测试获取配置文件内容:
@RestController
public class ClientController {
@Value("${profiles}")
private String profiles;
@GetMapping("/profiles")
public String profiles() {
return this.profiles;
}
}
启动类,因为是客户端所以无需增加@EnableConfigServer
注解:
@SpringBootApplication
public class SpringCloudConfigClient_Applicaiton {
public static void main(String[] args) {
SpringApplication.run(SpringCloudConfigClient_Applicaiton.class, args);
}
}
OK,客户端配置好了,启动配置中文服务端和客户端,我们来测试一下,:
请求:http://127.0.0.1:9003/profiles
可以看到,返回了配置信息,说明客户端从服务端拿到了信息。
我们再将配置信息修改一下,提交到GitHub:
再次请求:http://127.0.0.1:9003/profiles
发现获取到的配置信息还是修改前的,这是为什么呢?是因为客户端只有在启动的时候才会获取配置文件的值,修改配置文件后,客户端并没有再次去获取最新的,这个怎么解决呢?我们放到后面来讲。