八、Spring Cloud Config
提供了在分布式系统的外部配置的客户端支持。通过配置服务(Config Server)来为所有的环境和应用提供外部配置的集中管理。这些概念都通过Spring的Environment和PropertySource来抽象,所以它可以适用于各类Spring应用,同时支持任何语言的任何应用。它也能为你支持对应用开发环境、测试环境、生产环境的配置、切换、迁移。默认的配置实现通过git实现,同时也支持其他的扩展(比如svn等)。
1、组件
(1)、配置仓库:为配置中心服务端提供配置信息存储,支持git、svn、valut、native、credhub、composite以及本地文件仓库。在配置服务中需要对配置中心的仓库类型进行显示配置,不配置默认使用git仓库。
(2)、服务端:为配置客户端提供对应的配置信息,配置信息的来源是配置仓库。应用启动时,会从配置仓库拉取配置信息缓存到本地仓库中,对外提供API接口服务。
(3)、客户端:应用启动时从配置服务端拉取配置信息。
2、执行过程
(1)、环境部署之前,将所需的配置信息推送到配置仓库。
(2)、启动配置中心服务端,将配置仓库的配置信息拉取到服务端,配置服务端对外提供REST接口。
(3)、微服务应用(Config Client)启动,根据bootstrap.yml(properties)中配置的应用名(application)、环境名(profile)、分支名(label),向Config Server请求配置信息。
(4)、Config Server根据自己bootstrap/application.yml(properties)中的Git(或SVN)仓库信息加上客户端传来的配置定位信息去查配置信息的路径。
(5)、Config Server执行git clone命令,将配置信息下载到本地Git仓库中,将配置信息加载到Spring的ApplicationContext读取内容返回给客户端(微服务应用)。
(6)、客户端将内容加载到ApplicationContext,配置内容的优先级大于客户端内部的配置内容,进行忽略。
3、注解
(1)、@EnableConfigServer
①、EnableConfigServer
Spring Cloud定义的注解,开启应用服务对配置中心的支持。主要是通过引入某种Configuration类来达到装配某些Bean的目的。此注解引入了ConfigServerConfiguration类。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({ConfigServerConfiguration.class})
public @interface EnableConfigServer {
}
②、ConfigServerConfiguration
但ConfigServerConfiguration类里面并没有实现太多Bean的装配,这里利用一种折中方式,引入需要的自动配置。Marker唯一被引用的地方在ConfigServerAutoConfiguration类。
@Configuration
public class ConfigServerConfiguration {
public ConfigServerConfiguration() {
}
@Bean
public ConfigServerConfiguration.Marker enableConfigServerMarker() {
return new ConfigServerConfiguration.Marker();
}
class Marker {
Marker() {
}
}
}
③、ConfigServerAutoConfiguration
@Configuration
@ConditionalOnBean({Marker.class})
@EnableConfigurationProperties({ConfigServerProperties.class})
@Import({EnvironmentRepositoryConfiguration.class, CompositeConfiguration.class, ResourceRepositoryConfiguration.class, ConfigServerEncryptionConfiguration.class, ConfigServerMvcConfiguration.class})
public class ConfigServerAutoConfiguration {
public ConfigServerAutoConfiguration() {
}
}
a、EnvironmentRepositoryConfiguration:环境变量存储相关的配置类
b、CompositeConfiguration:组合方式的环境仓库配置类
c、ResourceRepositoryConfiguration:资源仓库相关的配置类
d、ConfigServerEncryptionConfiguration:加密断点相关的配置类
e、ConfigServerMvcConfiguration:对外暴露的MVC端点控制器的配置类
(2)、@EnableAutoConfiguration
Spring Boot定义的注解,@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IOC容器。
(3)、@Configuration
Spring定义的注解,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建Bean定义,初始化Spring容器。
①、@Configuation等价于<Beans></Beans>
②、@Bean等价于<Bean></Bean>
③、@ComponentScan等价于<context:component-scan base-package=”com.dxz.demo”/>
注:
@Configuration不可以是final类型;
@Configuration不可以是匿名类;
嵌套的configuration必须是静态类。
4、Sever配置
(1)、新建一个模块,命名为ConfigServer,再pom.xml引入依赖项。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
(2)、添加主类Application,添加@EnableConfigServer注解来开启Spring Config的Server功能。
(3)、修改在resources文件夹下的配置文件。
Spring Cloud Config除了支持username,password认证外,也可以通过公私钥文件进行git认证。
spring:
application:
# 应用名称
name: config-server
cloud:
config:
server:
# 默认使用GIT库
git:
# GIT仓库地址,HTTP方式,多个用逗号“,”分割
uri: https://github.com/demo/SpringCloudlearn
# 仓库搜索路径
search-paths: config_project
username: user
password: 12345
# 如果使用SVN仓库配置
svn:
# SVN仓库地址
uri: http://svn.test.com/svn/project/demo/
username: svn_user
password: 12345
# 如果使用Eureka注册需要配置,否则Client直接指定Server地址获取配置即可
eureka:
client:
service-url:
defaultZone: http://localhost:8777/eureka/
server:
# 访问路径端口号
port: 8888
servlet:
# 访问路径项目名称
context-path: /configServer
(4)、在ConfigServer下创建一个普通目录config-project,在目录下添加几个配置文件。
config-client.yml
config-client-dev.yml
config-client-test.yml
config-client-prod.yml
①、命名规则
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{application}-{profile}.properties
/{application}/{application}-{profile}.yml
/{label}/{application}-{profile}.properties
②、注意事项
a、第一个规则的分支名(label)是可以省略的,默认是master分支。
b、无论你的配置文件是properties,还是yml,只要应用名+环境名能匹配到这个配置文件,就能取到。
c、如果是想直接定位到没有写环境名的默认配置,那么就可以使用default去匹配没有环境名的配置文件。
d、使用第一个规则会匹配到默认配置。
e、如果直接使用应用名来匹配,会出现404错误,此时可以加上分支名匹配到默认配置文件
f、如果配置文件的命名由多个-分隔,此时直接使用这个文件名去匹配的话,会出现直接将内容以源配置文件内容直接返回,内容前可能会有默认配置文件的内容。
5、Client配置
(1)、新建一个模块,命名为ConfigClient,再pom.xml引入依赖项。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
(2)、添加主类Application。
(3)、在resources目录下创建bootstrap.yml
bootstrap.yml的相关配置会先于application.yml,而bootstrap.yml的加载也是先于application.yml。如果需要配置Eureka注册,需要注意的是eureka.client.serviceUrl.defaultZone要配置在bootstrap.yml,不然客户端是无法获取配置中心参数的,会启动失败。
spring:
application:
# 对应config server所获取的配置文件的{application}
name: config-client
cloud:
config:
# 获取配置文件应用的环境
profile: dev
# 获取配置文件的分支,默认是master。如果是从本地获取的话,则不用配置。
label: master
discovery:
# 表示使用服务发现组件中的Config Server,而不自己指定Config Server的uri,默认false
enabled: true
# 指定Config Server在服务发现中的serviceId
service-id: config-server
# 如果使用Eureka注册需要配置,否则Client直接指定Server地址获取配置即可
eureka:
client:
service-url:
defaultZone: http://localhost:8777/eureka/
server:
# 访问路径端口号
port: 9999
servlet:
# 访问路径项目名称
context-path: /configClient