1、Config介绍
1.1 微服务面临的问题
每个微服务都需要一个配置文件,并且,如果有几个微服务都需要连接数据库 那么就需要配4次数据库相关配置,并且当数据库发生改动,那么需要同时修改4个微服务的配置文件才可以。
所以就需要SpringConfig配置中心。
1.2 SpringCloud Config介绍
SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。
SpringCloud Config分为服务端和客户端两部分。
- 服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息等访问接口。
- 客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息,配置服务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容。
1.3 SpringCloud Config能干嘛
- 集中管理配置文件。
- 不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release。
- 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心。
- 统一拉取配置自己的信息。
- 当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置。
- 将配置信息以REST就接口的形式暴露:post、curl访问刷新均可…
1.4 与Github整合配置
由于SpringCloud Config默认使用Git来存储配置文件(也有其它方式,比如支持svn和本地文件,但最推荐的还是Git,而且使用的是http/https访问的形式)
2、 使用Config配置中心
2.1 git仓库
首先在GitHub新建一个名为sprincloud-config的Repository,并在本地新建如下文件:
文件内容:sprincloud-config 并将文件上传到github上(或者直接在github仓库上新建并修改文件内容)。
2.2 配置中心模块CloudConfig Center
2.2.1 pom.xml
主要依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.2.2 application.yml
server:
port: 3344
spring:
application:
name: cloud-config-center #注册进Eureka服务器的微服务名
cloud:
config:
server:
git:
uri: https://github.com/kenashiwenziya/sprincloud-config.git #GitHub上面的git仓库名字
####搜索目录
search-paths:
- springcloud-config
####读取分支
label: master
#服务注册到eureka地址
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
2.2.3 主启动类
@SpringBootApplication
@EnableConfigServer
public class ConfigCenterMain3344
{
public static void main(String[] args) {
SpringApplication.run(ConfigCenterMain3344.class, args);
}
}
添加@EnableConfigServer注解
2.2.4 测试
启动微服务3344,并访问http://config-3344.com:3344/master/config-dev.yml(需要在hosts做config-3344.com的映射)。
结果:此时可成功访问到github上面的config-dev.yml。
2.2.5 配置读取规则
有五种形式:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
其中:
- label表示:分支(branch);
- application表示:服务名;
- profile表示:环境(dev/test/prod)
这里介绍其中的三种:
- /{label}/{application}-{profile}.yml(最推荐使用这种方式)
master分支:
http://config-3344.com:3344/master/config-dev.yml
http://config-3344.com:3344/master/config-test.yml
http://config-3344.com:3344/master/config-prod.yml
dev分支:
http://config-3344.com:3344/dev/config-dev.yml
http://config-3344.com:3344/dev/config-test.yml
http://config-3344.com:3344/dev/config-prod.yml
例如读取master分支的config-prod.yml:
- /{application}-{profile}.yml
http://config-3344.com:3344/config-dev.yml
http://config-3344.com:3344/config-test.yml
http://config-3344.com:3344/config-prod.yml
http://config-3344.com:3344/config-xxxx.yml(不存在的配置)
此时由于在application.yml中配置了:
spring:
cloud:
config:
label: master
所以默认会先找master分支下的/config-dev.yml.
当访问不存在的配置的时候会返回{}
- /{application}/{profile}[/{label}]
http://config-3344.com:3344/config/dev/master
http://config-3344.com:3344/config/test/master
http://config-3344.com:3344/config/prod/master
这种方式读取的是json串形式,需要自己解析内容。
3、 Config客户端配置与测试
3.1 pom.xml
主要的依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
服务端是spring-cloud-config-server,客户端是spring-cloud-starter-config
3.2 bootstrap.yml
可能会有疑问:为什么不是application.yml,而变成了bootstrap.yml?
3.2.1 bootstrap.yml是什么
application.yml 是用户级的资源配置项;
bootstrap.yml 是系统级的,优先级要更高。
SpringCloud会创建一个’Bootstrap Context’,作为Spring应用的’Application Context’的父上下文。初始化的时候,‘Bootstrap Context’负责从外部源加载配置属性并解析配置。这两个上下文共享一个从外部获取的’Environment’。
'Bootstrap’属性有高优先级,默认情况下,他们不会被本地配置覆盖。'Bootsrap context’和’Application Context’有着不同的约定,所以新增了一个’bootstrap.yml’文件,保证’Bootstrap Context’和’Application Context’配置的分离。
要将Client模块下的application.yml文件改为bootstrap.yml,这是很关键的,
因为bootstrap.yml是比application.yml先加载的。bootstrap.yml优先级高于application.yml
3.2.2 bootstrap.yml配置
server:
port: 3355
spring:
application:
name: config-client
cloud:
#Config客户端配置
config:
label: master #分支名称
name: config #配置文件名称
profile: dev #读取后缀名称 上述3个综合:master分支上config-dev.yml的配置文件被读取http://config-3344.com:3344/master/config-dev.yml
uri: http://localhost:3344 #配置中心地址k
#服务注册到eureka地址
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
这里是指:
- 客户端会作为微服务注册到eureka;
- 这里3355不会访问github,只会去http://localhost:3344找master分支上叫config-dev的配置文件,读取到本地。
3.3 主启动类
@EnableEurekaClient
@SpringBootApplication
public class ConfigClientMain3355
{
public static void main(String[] args) {
SpringApplication.run(ConfigClientMain3355.class, args);
}
}
3.4 业务类
@RestController
public class ConfigClientController
{
@Value("${config.info}")
private String configInfo;
@GetMapping("/configInfo")
public String getConfigInfo()
{
return configInfo;
}
}
这里注入config.info,如果3355能从3344上读取到config-dev.yml,那么就能将config-dev.yml中的config.info注入进来。
3.5 测试
启动Config配置中心3344微服务并自测:
访问:
http://config-3344.com:3344/master/config-dev.yml
http://config-3344.com:3344/master/config-test.yml
可成功获取配置。
启动3355作为Client准备访问:
http://localhost:3355/configInfo
测试通过。
成功实现了客户端3355访问SpringCloud Config3344通过GitHub获取配置信息。
Happy Learning ~