spring-cloud-config-server 基本使用
1、依赖jar如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency>
2、启动类
@SpringBootApplication @EnableConfigServer //激活配置中心服务端 public class SpringCloudConfigServerDemoApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudConfigServerDemoApplication.class, args); } }
3、配置中心服务端配置项
spring.cloud.config.server.git.uri=file:///D:/spring-cloud-server-git/config //配置git的地址,默认使用的配置仓储是git,当然还支持jdbc等。 spring.application.name=config-server server.port=9090
4、confgi-server 自动装配原理分析
4.1、config-server 自动装配类是ConfigServerAutoConfiguration:
@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 { }
4.2、条件注解@ConditionalOnBean(ConfigServerConfiguration.Marker.class) 的含义就是需要类型是ConfigServerConfiguration.Marker.class的一个bean在ioc容器中,那么Marker这个bean是什么时候添加到容器的呢????????? 我们来到config-server 的激活器注解 @EnableConfigServer中:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(ConfigServerConfiguration.class) public @interface EnableConfigServer { } @Configuration(proxyBeanMethods = false) public class ConfigServerConfiguration { //在此处添加一个Marker bean然后就能激活config-server 的自动装配类了 @Bean public Marker enableConfigServerMarker() { return new Marker(); } class Marker { } }
4.3、如何自动装配config-server的,我们主要介绍如何自动装配配置项仓储的
@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 { } @Configuration(proxyBeanMethods = false) @EnableConfigurationProperties({ SvnKitEnvironmentProperties.class, CredhubEnvironmentProperties.class, JdbcEnvironmentProperties.class, NativeEnvironmentProperties.class, VaultEnvironmentProperties.class, RedisEnvironmentProperties.class, AwsS3EnvironmentProperties.class }) //导入 仓储配置,有jdbc的实现的,有git实现的,SVN实现的 等等,最后导入默认的实现DefaultRepositoryConfiguration @Import({ CompositeRepositoryConfiguration.class, JdbcRepositoryConfiguration.class, VaultConfiguration.class, VaultRepositoryConfiguration.class, SpringVaultRepositoryConfiguration.class, CredhubConfiguration.class, CredhubRepositoryConfiguration.class, SvnRepositoryConfiguration.class, NativeRepositoryConfiguration.class, GitRepositoryConfiguration.class, RedisRepositoryConfiguration.class, GoogleCloudSourceConfiguration.class, AwsS3RepositoryConfiguration.class, DefaultRepositoryConfiguration.class }) public class EnvironmentRepositoryConfiguration { @Bean @ConditionalOnProperty(value = "spring.cloud.config.server.health.enabled", matchIfMissing = true) public ConfigServerHealthIndicator configServerHealthIndicator( EnvironmentRepository repository) { return new ConfigServerHealthIndicator(repository); } //加载git的配置bean 前缀是spring.cloud.config.server.git @Bean @ConditionalOnMissingBean(search = SearchStrategy.CURRENT) public MultipleJGitEnvironmentProperties multipleJGitEnvironmentProperties() { return new MultipleJGitEnvironmentProperties(); } ... ... } //默认的配置是git 没错,那是因为当容器中没有配置其他的环境仓储EnvironmentRepository才会使用git的实现仓储MultipleJGitEnvironmentRepository @Configuration(proxyBeanMethods = false) @ConditionalOnMissingBean(value = EnvironmentRepository.class, search = SearchStrategy.CURRENT) class DefaultRepositoryConfiguration { //默认在装配其他的仓储情况下,才会使用默认的git仓储MultipleJGitEnvironmentRepository,这个MultipleJGitEnvironmentRepository里面封装了很多git 客户端的操作。 @Bean public MultipleJGitEnvironmentRepository defaultEnvironmentRepository( MultipleJGitEnvironmentRepositoryFactory gitEnvironmentRepositoryFactory, MultipleJGitEnvironmentProperties environmentProperties) throws Exception { return gitEnvironmentRepositoryFactory.build(environmentProperties); } }
5、配置使用jdbc 来进行环境配置项储存
5.1、通过上面config-server的自动装配我们知道了,在没有其他的环境仓储EnvironmentRepository的时候才会使用git来进行配置文件的储存,但是当我们激活了其他的EnvironmentRepository的时候,就会使用我们激活的,接下来我们来激活JdbcRepositoryConfiguration仓储,先来到JdbcRepositoryConfiguration源码中:
@Configuration(proxyBeanMethods = false) @Profile("jdbc") @ConditionalOnClass(JdbcTemplate.class) @ConditionalOnProperty(value = "spring.cloud.config.server.jdbc.enabled", matchIfMissing = true) class JdbcRepositoryConfiguration { @Bean @ConditionalOnBean(JdbcTemplate.class) public JdbcEnvironmentRepository jdbcEnvironmentRepository( JdbcEnvironmentRepositoryFactory factory, JdbcEnvironmentProperties environmentProperties) { return factory.build(environmentProperties); } }
激活的条件有两个,分别如下:
Ⅰ、@Profile("jdbc"),只要我们配置了spring.profiles.active=jdbc 就满足条件。
Ⅱ、@ConditionalOnClass(JdbcTemplate.class),存在依赖JdbcTemplate.class,然后有一个数据源,我们配置如下:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://172.20.30.102:3306/config-server?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8 spring.datasource.username=app spring.datasource.password=app@znyk spring.cloud.config.server.jdbc.sql=SELECT p_name, p_value from PROPERTIES where APPLICATION=? and env=? and LABEL=?
我们只需要依赖如下jar:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
Ⅲ、数据库需要我们自己创建、表结构也需要自己创建,然后自己定义查询的SQL语句,默认的查询的SQL语句如下:
SELECT KEY, VALUE from PROPERTIES where APPLICATION=? and PROFILE=? and LABEL=?;
但是这个SQL语句包含了MYSQL的关键字,因此需要进行修改,所以我们需要进行表结构以及查询SQL语句的修改,表结构如下:
CREATE TABLE properties
( id
int(11) NOT NULL, application
varchar(64) NOT NULL, env
varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, label
varchar(16) NOT NULL, p_name
varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, p_value
varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, PRIMARY KEY (id
) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
这样的话查询的SQL语句就是如下:SELECT p_name, p_value from PROPERTIES where APPLICATION=? and env=? and LABEL=?
添加一条数据进行测试:1 config-client1 dev master name 123
在浏览器中进行测试:http://localhost:9090/config-client1/dev/master 格式:ip:port/application/dev/label
结果如下:
{
"name": "config-client1",
"profiles": [
"dev"
],
"label": "master",
"version": null,
"state": null,
"propertySources": [
{
"name": "config-client1-dev",
"source": {
"name": "123"
}
}
]
}
END。。。