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。。。