目录
Spring Cloud Config
Spring Cloud Config为分布式系统管理配置文件提供配置文件管理中心支持,以及访问该配置文件管理中心的客户端支持。Spring Cloud Config支持子目录(能够支持多个项目的配置管理),并且支持按环境区分配置文件(不同环境访问不同的配置文件)。服务端提供http接口返回配置文件的内容,客户端将这些配置信息解析并抽象成Environment和PropertySource,如果Spring Cloud Config客户端是基于Spring框架搭建的应用,那么这些配置信息会被Spring框架中的Environment和PropertySource统一管理(既然里本引用的配置信息,同时也管理Config Server获取的配置信息)。但这不意味着Spring Cloud Config只适合基于Spring搭建的应用。由于Config Server提供协议接口访问配置文件,所以任意支持http请求的应用都能访问Config Server的配置内容。
Config Server存储配置文件支持使用git仓库是现实,支持访问不同git分支下的配置文件。
Spring Cloud Config Server的功能:
- 提供HTTP接口访问配置信息(健值对)。
- 支持加解密配置信息
- Spring Boot通过@EnableConfigServer可以快速搭建服务
Spring Cloud Config Client的功能:
- 将读取到远程服务上的配置信息推到本地Spring Environment中,便于配置信息的统一管理
- 加解密配置信息
启动Config服务
Spring cloud Config主要依赖 spring-cloud-config-server,快速启动可以配置如下:
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR4</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
项目资源文件的配置文件bootstrap.yml或者application.properties的配置如下:
server:
port: 8888
spring:
application:
name: config server
cloud:
config:
server:
git:
# 本机上用户目录下的config-repo文件夹
uri: file:///${user.home}/config-repo
项目添加启动入口:
@EnableConfigServer
@SpringBootApplication
public class ConfigserverApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigserverApplication.class, args);
}
}
在用户目录下创建config-repo文件夹,在该文件夹下创建application-dev1.properties文件,存储配置信息:
info:
env: dev1
application: application
database: dbuser
password: '{cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ'
以上配置完毕后,启动项目。服务位于8888端口号上。通过http://localhost:8888/application/dev1 可以applicatio-dev1.properties。通过curl访问的结果如下:
{"name":"application","profiles":["dev1"],"label":null,"version":"3d3168009afea0aeb187ed03f8f1612a1c2d79ae","state":null,"propertySources":[{"name":"file:Users/${user.home}/config-repo/application-dev1.yml","source":{"info.env":"dev1","info.application":"application","info.database":"dbuser","info.password":"FKSAJDFGYOS8F7GLHAKERGFHLSAJ"}}]}
配置文件的的名字有项目名称加上横杠链接符,加上环境名称组成,比如application-dev1.properties,其中application表示项目名称,dev1表示环境名称,存储的是application在dev1环境下的配置信息。
本地文件夹只是用来测试,Spring Cloud Config通常通过git来管理配置文件,所以正式环境下,修改成正式的git仓库地址。如果git仓库需要账号密码才能访问,那么需要在配置中增加账号密码的配置:
cloud:
config:
server:
git:
username: username
password: password
处理账号密码认证外,还支持ssh方式访问git仓库:
hostKey: someHostKey
hostKeyAlgorithm: ssh-rsa
privateKey:privateKey
通常情况下,我们需要Spring Cloud Config托管多个项目的配置文件,需要用到它的Search Paths功能:
cloud:
config:
server:
git:
searchPaths: '{application}'
我们在git项目中创建test1和test2文件夹,并在这两个文件夹下创建test1-dev1.yml,test1-dev2.yml,test2-dev1,test2-dev2.yml文件。通过http://localhost:8888/test1/dev1/master, http://localhost:8888/test1/dev2/master,http://localhost:8888/test2/dev1/master, http://localhost:8888/test2/dev2/master 分别访问这四个文件。
当我们访问http://localhost:8888/test1/dev1/master 时,Spring Cloud Config服务会将git仓库中的资源下载到本地,一遍下次快速获取配置信息。但是在部分服务器上该路径是临时目录,会被服务器定期清理导致无法访问到配置信息。我们可以配置Force pull属性为true(默认false),那么配置服务发现本地文件已经不存在,则会从git仓库中拉取配置信息。配置如下:
cloud:
config:
server:
git:
force-pull: true
获取配置信息
Spring Cloud支持将从配置信息服务上获取到的配置信息添加到org.springframework.core.env.Environment中。以下是客户端配置配置服务地址并获取配置信息的相关配置
spring:
cloud:
config:
discovery:
enabled: true
service-id: config-service
name: test1
profile: dev1
username: username
password: password
由于是通过Eureka服务获取配置服务的服务地址,所以以上配置还需要Eureka客户端的支持。