spring cloud config 运用与原理
spring cloud config 应用场景
作为一个开发而言,知道每个项目都有其需要维护的配置文件,如果项目量小而言,以人力尚可以接受。项目量一但增多,传统的维护方式就变的困难,所以需要一个统一的配置中心来维护所有服务的配置文件。再言,传统的项目配置文件配置数据发生改变,需要重启服务使其生效,spring cloud config 可以不需要进行重启对应的服务。
多样化仓库
spring cloud config 支持配置文件库除了大家所知的git,svn外,spring cloud config还支持valut,credhub,composite以及本地文件仓库。当你在配置服务中需要可以对配置中心的仓库进行显示配置,不对其配置的话默认仓库是git。
实例搭建
接下来给大家介绍一些spring cloud config 的实例搭建。当前笔者使用的spring boot版本为2.1.3.RELEASE, spring cloud 版本为Greenwich.SR1,与目前多数文章使用的spring boot1.x版本还是有些许不同的。
config-server 模块的构建
pom引入的依赖
<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>
只需引入web和config-server的依赖就可以,如果是通过idea进行搭建的话,可以通过spring initializr ,勾选web ,以及spring cloud config 模块自动导入pom依赖
application.properties其中字段的配置
# 服务名称
spring.application.name=config-server
# 启动端口
server.port=7001
# 仓库地址,HTTP方式
spring.cloud.config.server.git.uri=***
# 仓库搜索路径
spring.cloud.config.server.git.search-paths=***
# 访问仓库的用户名
spring.cloud.config.server.git.username=****
# 访问仓库的密码
spring.cloud.config.server.git.password=***
大部分配置大家都熟悉,主要介绍几个重要配置,一个是spring.cloud.config.server.git.uri,这个指定了你的git仓库地址,属于必填值,不填的话或者地址错误的话启动失败会报错。username, password根据你的git仓库而言,如果是公共仓库不需要用户及密码不填也可以。其他不填的话也会报错。spring cloud config 除了支持username, password 认证外,也可以通过公私钥文件进行git认证。
spring.cloud.config.server.git.ignore-local-ssh-settings=true
spring.cloud.config.server.git.host-key=someHostKey
spring.cloud.config.server.git.host-key-algorithm=ssh-rsa
spring.cloud.config.server.git.private-key=***
使用私钥来代替用户名密码的安全验证,配置案例由官网提供的,不过大部分开发更优先于使用用户名密码配置。
启动类注解
启动一个spring cloud config server端项目只需要加入一个@EnableConfigServer注解就可以了
@EnableConfigServer
@SpringBootApplication
public class SpringCloudConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudConfigServerApplication.class, args);
}
}
接下来研究一下@EnableConfigServer这个注解做了什么操作
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({ConfigServerConfiguration.class})
public @interface EnableConfigServer {
}
进入到这个EnableConfigServer类,发现引入了ConfigServerConfiguration类。
@Configuration
public class ConfigServerConfiguration {
public ConfigServerConfiguration() {
}
@Bean
public ConfigServerConfiguration.Marker enableConfigServerMarker() {
return new ConfigServerConfiguration.Marker();
}
class Marker {
Marker() {
}
}
}
进入ConfigServerConfiguration类,发现创建了一个内部类Marker,并将其注解成一个bean注入到spring容器。
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.config.server.config.ConfigServerConfiguration.Marker;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@ConditionalOnBean({Marker.class})
@EnableConfigurationProperties({ConfigServerProperties.class})
@Import({EnvironmentRepositoryConfiguration.class, CompositeConfiguration.class, ResourceRepositoryConfiguration.class, ConfigServerEncryptionConfiguration.class, ConfigServerMvcConfiguration.class})
public class ConfigServerAutoConfiguration {
public ConfigServerAutoConfiguration() {
}
}
在ConfigServerAutoConfiguration类里发现maker这个bean被注入进来,并引进了更多文件,简单的介绍一下各类的作用。
- EnvironmentRepositoryConfiguration: 环境变量存储相关的配置类
- CompositeConfiguration:组合方式的环境仓库配置类
- ResourceRepositoryConfiguration:资源仓库相关的配置类
- ConfigServerEncryptionConfiguration:加密断点相关的配置类
- ConfigServerMvcConfiguration:对外暴露的MVC端点控制器的配置类
现在主要研究一下EnvironmentRepositoryConfiguration这个类,官方文档中也标明Environment相关为核心类。
@Configuration
@EnableConfigurationProperties({SvnKitEnvironmentProperties.class, CredhubEnvironmentProperties.class, JdbcEnvironmentProperties.class, NativeEnvironmentProperties.class, VaultEnvironmentProperties.class})
@Import({CompositeRepositoryConfiguration.class, JdbcRepositoryConfiguration.class, VaultRepositoryConfiguration.class, CredhubConfiguration.class, CredhubRepositoryConfiguration.class, SvnRepositoryConfiguration.class, NativeRepositoryConfiguration.class, GitRepositoryConfiguration.class, DefaultRepositoryConfiguration.class})
public class EnvironmentRepositoryConfiguration {
public EnvironmentRepositoryConfiguration() {
}
@Bean