【学习背景】
上篇博客学习的是Spring Cloud的Hystrix组件,从而保证在高并发情况下,在使用服务熔断、服务降级、服务隔离等方法,避免服务雪崩效应。本篇博客学习的组件是Config,分布式配置中心。
【学习内容】
一. 为什么要使用分布式配置中心?
在微服务中,如果使用传统方式管理配置文件,配置文件管理器非常复杂。
现在的应用大多是分布式系统,部署在N台服务器上,一台台重启机器不靠谱,维护成本很高,所以配置中心应运而生。
二. 什么是分布式配置中心?
配置中心被用作集中管理不同环境(Dev、Pre、Pro)和不同集群配置,以及在修改配置后将实时动态推送到应用上进行刷新。
三. 配置中心应具备的功能?
四. Spring Cloud Config
1. 概述
Spring Cloud Config是一个集中化外部配置的分布式系统,由服务端和客户端组成。它不依赖于注册中心,是一个独立的配置中心。
Spring Cloud Config支持多种存储配置信息的形式,目前主要有jdbc、Vault、Native、svn、git,默认为git。
2. git版工作原理
配置客户端启动时会向服务端发起请求,服务端接收到客户端的请求后,根据配置的仓库地址,将git上的文件克隆到本地的一个临时目录中,这个目录是一个git的本地仓库目录,然后服务端再读取本地文件返回给客户端。这样做的好处是,当git服务器故障或者网络请求异常时,保证服务端仍然可以正常工作。
3. Config Server配置
Config Server即配置服务器,为配置客户端提供其对应的配置信息,配置信息的来源为配置仓库,启动时需要拉取配置仓库的信息,缓存到本地仓库中。
- 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
- 启动注解
/**
* @EnableConfigServer注解开启Spring Cloud Config服务功能
*/
@SpringBootApplication
@EnableConfigServer
public class SpringCloudConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudConfigServerApplication.class, args);
}
}
- 配置信息
### 配置文件git地址
spring.cloud.config.server.git.uri=https://github.com/huzhiting/spring-cloud-config.git
### git用户名和密码(公开访问权限可不需要设置,私有访问权限需要设置)
spring.cloud.config.server.git.username=****
spring.cloud.config.server.git.password=****
### 查找配置文件的路径(因为直接在根目录下新建了配置文件,所以不需要单独设置)
### spring.cloud.config.server.git.search-paths=config
### 代码分支(默认master)
spring.cloud.config.label=master
### 应用名称
spring.application.name=config-server
### 应用端口号
server.port=8888
- 读取验证
访问本地配置服务器,http://127.0.0.1:8888/config-server-dev.properties
可读取到对应的配置文件信息:env: is dev
4. Config Client配置
Config Client即配置客户端,只会在本地配置必要的信息,如指定获取配置的Config Server地址,启动时从配置服务器获取配置信息,并支持动态刷新配置仓库中的属性值。
- 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.23</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
- 配置信息
### Config Server地址
spring.cloud.config.uri=http://localhost:8888
### 代码分支
spring.cloud.config.label=master
### 配置Config Server中对应的配置文件名
spring.cloud.config.name=config-server
### 指定环境
spring.cloud.config.profile=dev
### Config Server中对应的配置文件名
spring.application.name=config-client
### 应用端口
server.port=9091
- 接口访问
@RestController
public class ConfigClientController {
@Value("${env}") // git配置文件里的key
String configEnv;
@RequestMapping("/getConfigInfo")
public String getConfigInfo(){
return "获取环境配置:" + configEnv;
}
}
访问本项目中对应的接口,http://localhost:9091/getConfigInfo
可读取到Config Server中对应的配置信息
‘获取环境配置:hello dev’
五. 遇到的问题
1. Config Server 配置文件位置
Config Server中我们会配置一个git地址,而对应的配置文件是从根目录下开始搜索的,而我自认为从resources文件夹下读取,所以将配置文件信息放在了resources文件夹下,一直读取不到。
如下图,如果访问配置信息接口,可以得到配置文件中的信息,则表明是没有问题的。
2. Config Client 启动报错
- 启动Spring-Cloud-Config-Client时,控制台报错:Attempted to load applicationConfig: [classpath:/bootstrap.yml] but snakeyaml was not found on the classpath
原因缺少snakeyaml jar,添加依赖即可:
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.23</version>
</dependency>
- 启动Spring-Cloud-Config-Client时,控制台报错:
原因就是未读取到Config Server项目中的配置文件,首先修改了Config Server中配置文件的位置,其次读取配置文件的规则是根据Config Client中的配置来的。
两种情况如下:
1)在Config Client中,若配置了spring.cloud.config.name=config-server属性及spring.cloud.config.profile=dev,则会去Config Server项目中去对应查找config-server-dev.yml/config-server-dev.properties文件,文件不存在的话则会启动失败。
2)在Config Client中,若没有配置spring.cloud.config.name=config-server属性,配置了spring.application.name=config-client及spring.cloud.config.profile=dev,则会去Config Server项目中去对应查找config-client-dev.yml/config-client-dev.properties文件,文件不存在的话则会启动失败。
六. demo地址
自己搭建的demo已上传到github,地址:
https://github.com/huzhiting/spring-cloud-config
【学习总结】
学习的过程中,遇到问题是收获最多的。看了很多书中的理论,不去自己搭建demo或在项目中用,是发现不了什么问题的。