Spring Cloud配置中心
- Environment 抽象
- 基于git实现配置中心
Spring Cloud配置中心
版本信息
Spring Cloud : Hoxton.SR1
Spring Boot : 2.2.2.RELEASE
Environment 抽象
org.springframework.core.env.Environment
关注于读取profileorg.springframework.core.env.PropertyResolver
关注于读取配置
org.springframework.core.env.ConfigurableEnvironment
关注于存储profileorg.springframework.core.env.ConfigurablePropertyResolver
关注于类型转换
默认实现:
org.springframework.core.env.StandardEnvironment
配置资源
org.springframework.core.env.PropertySource
单个读资源的抽象,对应注解@org.springframework.context.annotation.PropertySource
org.springframework.core.env.PropertySources
多个读资源的抽象,对应注解@org.springframework.context.annotation.PropertySource
org.springframework.core.env.MutablePropertySources
关注于存储资源
默认实现:
org.springframework.core.env.CompositePropertySource
Spring Boot 外部化配置
Devtools global settings properties on your home directory (~/.spring-bootdevtools.
properties when devtools is active).@TestPropertySource annotations on your tests.
properties attribute on your tests. Available on @SpringBootTest and the test annotations for
testing a particular slice of your application.Command line arguments.
commandLineArgs
–>org.springframework.core.env.CommandLinePropertySource
Properties from SPRING_APPLICATION_JSON (inline JSON embedded in an environment variable
or system property).
spring.application.json
–>org.springframework.boot.env.SpringApplicationJsonEnvironmentPostProcessor.JsonPropertySource
ServletConfig init parameters.
servletConfigInitParams
–>org.springframework.core.env.PropertySource.StubPropertySource
占位–>
org.springframework.web.context.support.ServletConfigPropertySource
ServletContext init parameters.
servletContextInitParams
–>org.springframework.core.env.PropertySource.StubPropertySource
占位–>
org.springframework.web.context.support.ServletContextPropertySource
JNDI attributes from java:comp/env.
jndiProperties
–>org.springframework.jndi.JndiPropertySource
Java System properties (System.getProperties()).
systemProperties
–>org.springframework.core.env.PropertiesPropertySource
- OS environment variables.
systemEnvironment
–>org.springframework.core.env.SystemEnvironmentPropertySource
- A RandomValuePropertySource that has properties only in random.*.
random
–>org.springframework.boot.env.RandomValuePropertySource
Profile-specific application properties outside of your packaged jar (application-{profile}.properties and YAML variants).
Profile-specific application properties packaged inside your jar (application-{profile}.properties and YAML variants).
Application properties outside of your packaged jar (application.properties and YAML variants).
Application properties packaged inside your jar (application.properties and YAML variants).
12-15类型
applicationConfig: [${location"]
–>org.springframework.boot.env.OriginTrackedMapPropertySource
@PropertySource annotations on your @Configuration classes.
Default properties (specified by setting SpringApplication.setDefaultProperties).
类型转换
org.springframework.core.convert.ConversionService
类型转换服务org.springframework.core.convert.converter.Converter
类型转换接口org.springframework.core.convert.converter.GenericConverter
普通的类型转换接口org.springframework.core.convert.converter.ConditionalConverter
适配(条件)的类型转换org.springframework.core.convert.converter.ConverterRegistry
类型转换的注册中心org.springframework.core.convert.converter.ConverterFactory
类型转的注册工厂org.springframework.core.convert.support.ConfigurableConversionService
可配置的类型转换服务
默认实现:
org.springframework.core.convert.support.DefaultConversionService
配置文件加载
org.springframework.boot.env.PropertySourceLoader
配置资源加载org.springframework.boot.env.PropertiesPropertySourceLoader
properties(xml)配置文件加载org.springframework.boot.env.YamlPropertySourceLoader
yml(yaml)配置文件加载
org.springframework.cloud.bootstrap.config.PropertySourceLocator
Spring Cloud中配置资源加载org.springframework.cloud.config.client.ConfigServicePropertySourceLocator
配置服务资源实现org.springframework.cloud.config.server.environment.EnvironmentRepositoryPropertySourceLocator
环境仓库配置服务资源实现
Environment与PropertySource的关系
Spring
- ``org.springframework.core.env.Environment`
org.springframework.core.env.ConfigurableEnvironment
org.springframework.core.env.MutablePropertySources
org.springframework.core.env.PropertySource
Spring Cloud
org.springframework.cloud.config.environment.Environment
org.springframework.cloud.config.environment.PropertySource
基于git实现配置中心
服务端
应用
创建git的配置目录文件,以E:/GitHub/properties文件夹为例,使用的是git客户端
1
2cd /e/GitHub/properties
git init创建配置文件configserver.yml以及configserver-dev.yml,配置文件内容如下
1
2
3
4
5
6
7
8management:
endpoints:
web:
exposure:
include: health,info,beans,env
spring:
application:
name: application-name配置文件命名规则:
{application}/{profile}[/{label}]
{application}-{profile}.yml
{label}/{application}-{profile}.yml
{application}-{profile}.properties
{label}/{application}-{profile}.properties- {application} 为配置文件名称,对应
spring.cloud.config.name
- {profile} 为配置文件激活环境,对应
spring.cloud.config.profile
,没有默认为default - {label} 为配置文件标签(git中为分支版本),对应
spring.cloud.config.label
- {application} 为配置文件名称,对应
添加pom的依赖
1
2
3
4<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>启动类添加
@EnableConfigServer
1
2
3
4
5
6
7
8
9
10
11
12
13
14/**
* 配置服务启动类
*
* @author FelixFly <chenglinxu@yeah.net>
* @date 2020/1/29
*/
@SpringBootApplication
@EnableConfigServer
public class SpringCloudConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudConfigServerApplication.class, args);
}
}配置文件bootstrap.yml
1
2
3
4
5
6
7
8
9
10
11
12
13management:
endpoints:
web:
exposure:
include: health,info,beans,env
server:
port: 8090
spring:
cloud:
config:
server:
git:
uri: file:///E:/GitHub/properties启动
SpringCloudConfigServerApplication
,验证配置文件访问路径为http://127.0.0.1:8090/{application}/{profile}
,若是有{label},后面再加上/{label}{label}若是存在”/“,使用“(_)”进行替换,实现类
org.springframework.cloud.config.server.environment.EnvironmentController
示例访问地址:
http://127.0.0.1:8090/configserver/default
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17{
"name": "configserver",
"profiles": [
"default"
],
"label": null,
"version": "f6cb3fcb36ae0ea085d0342ebe5e68811b9098a5",
"state": null,
"propertySources": [{
"name": "file:///E:/GitHub/properties/configserver.yml",
"source": {
"management.endpoints.web.exposure.include": "health,info,beans,env",
"spring.application.name": "application-name"
}
}
]
}示例访问地址:
http://127.0.0.1:8090/configserver/dev
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23{
"name": "configserver",
"profiles": [
"dev"
],
"label": null,
"version": "f6cb3fcb36ae0ea085d0342ebe5e68811b9098a5",
"state": null,
"propertySources": [{
"name": "file:///E:/GitHub/properties/configserver-dev.yml",
"source": {
"management.endpoints.web.exposure.include": "health,info,beans,env",
"spring.application.name": "application-name"
}
}, {
"name": "file:///E:/GitHub/properties/configserver.yml",
"source": {
"management.endpoints.web.exposure.include": "health,info,beans,env",
"spring.application.name": "application-name"
}
}
]
}
源码分析
@EnableConfigServer
注解1
2
3
4
5
6
7@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(ConfigServerConfiguration.class)
public @interface EnableConfigServer {
}就是导入了
ConfigServerConfiguration
的配置Bean1
2
3
4
5
6
7
8
9
10
11
12@Configuration(proxyBeanMethods = false)
public class ConfigServerConfiguration {
@Bean
public Marker enableConfigServerMarker() {
return new Marker();
}
class Marker {
}
}这个
ConfigServerConfiguration
配置Bean就配置了一个Marker的Bean,猜想这个Marker的Bean是不是某个配置的自动装配条件ConfigServerAutoConfiguration
服务配置自动装配1
2
3
4
5
6
7
8
9@Configuration(proxyBeanMethods = false)
@ConditionalOnBean(ConfigServerConfiguration.Marker.class)
@EnableConfigurationProperties(ConfigServerProperties.class)
@Import({ EnvironmentRepositoryConfiguration.class, CompositeConfiguration.class,
ResourceRepositoryConfiguration.class, ConfigServerEncryptionConfiguration.class,
ConfigServerMvcConfiguration.class, ResourceEncryptorConfiguration.class })
public class ConfigServerAutoConfiguration {
}这个
ConfigServerAutoConfiguration
自动装配条件是ConfigServerConfiguration.Marker.class
这个类型的Bean存在- 启用了
ConfigServerProperties
配置信息 - 导入了一些配置信息,如
EnvironmentRepositoryConfiguration
- 启用了
默认启用git的实现代码
1 |
|
DefaultRepositoryConfiguration
在不存在EnvironmentRepository.class
类型的Bean下自动装配,MultipleJGitEnvironmentRepository
–>JGitEnvironmentRepository
git仓储的实现
自定义环境仓储的实现
从上面可得知,默认的git环境仓储实现只有在不存在
EnvironmentRepository.class
类型的Bean下自动装配,我们只需要自定义一个EnvironmentRepository
的Bean就行了1
2
3
4
5
6
7
8
9
10
11
12@Bean
public EnvironmentRepository defaultEnvironmentRepository(){
return (application, profile, label) -> {
Environment environment = new Environment("custom-default");
List<PropertySource> propertySources = environment.getPropertySources();
Map<String, String> sourceMap = new HashMap<>();
sourceMap.put("application", "custom-application");
PropertySource propertySource = new PropertySource("map", sourceMap);
propertySources.add(propertySource);
return environment;
};
}访问地址:
http://127.0.0.1:8090/{application}/{profile}
,若是有{label},后面再加上/{label}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16{
"name": "config",// {application}
"profiles": [
"default" // {profile}
],
"label": null, // {label}
"version": null,
"state": null,
"propertySources": [{
"name": "map",
"source": {
"application": "custom-application"
}
}
]
}
客户端
应用
添加pom的依赖
1
2
3
4<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>配置文件bootstrap.yml
1
2
3
4
5
6
7spring:
cloud:
config:
uri: http://127.0.0.1:8090
name: configserver
application:
name: config-client服务启动类
1
2
3
4
5
6
7
8
9
10
11
12
13/**
* 配置客户端启动类
*
* @author FelixFly <chenglinxu@yeah.net>
* @date 2020/1/29
*/
@SpringBootApplication
public class SpringCloudConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudConfigClientApplication.class, args);
}
}启动服务,查看/actuator/env
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32{
"activeProfiles": [],
"propertySources": [{
"name": "server.ports",
"properties": {}
}, {
"name": "bootstrapProperties-configClient",
"properties": {}
}, {
"name": "bootstrapProperties-file:///E:/GitHub/properties/configserver.yml",
"properties": {}
}, {
"name": "servletContextInitParams",
"properties": {}
}, {
"name": "systemProperties",
"properties": {}
}, {
"name": "systemEnvironment",
"properties": {}
}, {
"name": "springCloudClientHostInfo",
"properties": {}
}, {
"name": "applicationConfig: [classpath:/bootstrap.yml]",
"properties": {}
}, {
"name": "springCloudDefaultProperties",
"properties": {}
}
]
}从上得知配置信息
bootstrapProperties-file:///E:/GitHub/properties/configserver.yml
具有高优先级,从先前的知识得知,自定义的bootstrap具有高优先级,实现类实现了PropertySourceLocator
自定义配置加载类
org.springframework.cloud.config.client.ConfigServicePropertySourceLocator
源码分析
ConfigServicePropertySourceLocator
加载配置资源
1 |
|