【Spring Cloud】学习和搭建Config分布式配置中心

【学习背景】

    上篇博客学习的是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或在项目中用,是发现不了什么问题的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章