Chapter Eight《SpringCloud微服务实战》

分布式配置中心: Spring Cloud Config

Spring Cloud Config 是一种用来动态获取Git、SVN、本地的配置文件的一种工具

1.为何统一管理微服务配置

对于Spring Boot应用,我们可以将配置内容写入 application.yml,设置多个profile,也可以用多个application-{profile}.properties文件配置,并在启动时指定spring.profiles.active={profile}来加载不同环境下的配置。
在Spring Cloud微服务架构中,这种方式未必适用,微服务架构对配置管理有着更高的要求,如:

集中管理:成百上千(可能没这么多)个微服务需要集中管理配置,否则维护困难、容易出错;
运行期动态调整:某些参数需要在应用运行时动态调整(如连接池大小、熔断阈值等),并且调整时不停止服务;
自动更新配置:微服务能够在配置发生变化是自动更新配置。

以上这些要求,传统方式是无法实现的,所以有必要借助一个通用的配置管理机制,通常使用配置服务器来管理配置。

2.Sping Cloud Config 介绍

Spring Cloud Config分为Config ServerConfig Client两部分,为分布式系统外部化配置提供了支持。 Spring Cloud Config非常适合Spring应用程序,也能与其他编程语言编写的应用组合使用。
微服务在启动时,通过Config Client请求Config Server以获取配置内容,同时会缓存这些内容。

config-server 配置服务端,服务管理配置信息

config-client 客户端,客户端调用server端暴露接口获取配置信息

上图:


image.png

3.Config Server

Config Server是一个集中式、可扩展的配置服务器,它可以集中管理应用程序各个环境下的配置,默认使用Git存储配置内容。

3.1 创建Config Server

3.1.1 创建用于存放配置文件的git仓库,添加配置文件

service1.properties

profile=default-1.0

service1-dev.properties

profile=dev-1.0

service1-test.properties

profile=test-1.0

service1-pro.properties

  profile=pro-1.0
3.1.2 创建一个Spring Boot应用config-server,添加spring-cloud-config-server依赖
dependencies {
compile('org.springframework.cloud:spring-cloud-config-server:1.4.1.RELEASE')

}

3.1.3 在启动类添加@EnableConfigServer注解
@EnableConfigServer
@SpringBootApplication
public class Application {

  public static void main(String[] args) {
    SpringApplication.run(Application.class,args);
  }

}
3.1.4 在application.yml中配置Git仓库地址
server:
  port: 8181
spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/Lessismoreputin/spring-cloud-config-repository
          username:
          password:

3.2 Config Server文件映射

3.2.1 配置文件映射关系

Config Server启动以后,我们可以通过它暴露的端点获取配置文件内容,http请求地址与配置文件映射关系如下:

# 映射{application}-{profile}.properties文件
/{application}/{profile}/[{label}]
/{label}/{application}-{profile}.properties
/{application}-{profile}.properties
/{label}/{application}-{profile}.yml
/{application}-{profile}.yml

{application}通常使用微服务名称,对应Git仓库中文件名的前缀;
{profile}对应{application}-后面的dev、pro、test等;
{label}对应Git仓库的分支名,默认为master。

4.Config Client

Config Client是Config Server的客户端,用于操作存储在Config Server中的配置内容。

4.1 创建Config Client

4.1.1 创建一个Spring Boot项目config-client,添加依赖
  dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.springframework.boot:spring-boot-starter-actuator')
    compile('org.springframework.cloud:spring-cloud-starter-config:1.4.1.RELEASE')
  }
4.1.2 创建配置文件application.yml

通常情况下,Config Client作为微服务的一部分,微服务的spring.application.name属性值决定了Git仓库中配置文件的的文件名前缀,需要为哪个微服务提供配置文件,配置文件的文件名就需要以spring.application.name属性值作为前缀。

server:
  port: 8282
spring:
  application:
    name: service1 # 对应config-server获取的配置文件的{application}
4.1.3 创建配置文件bootstrap.yml

Spring Boot应用程序启动时加载application.yml/application.properties。Spring Cloud中有“引导上下文”的概念,引导上下文加载bootstrap.yml/bootstrap.properties,而且具有更高的优先级,默认情况下bootstrap.yml/bootstrap.properties中的属性不能被覆盖。

spring:
  application:
    name: service1 # 对应config-server获取的配置文件的{application}
  cloud:
    config:
      uri: http://localhost:8181 # 对应config-server地址,默认值http://localhost:8888
      profile: pro  # 对应config-server获取的配置文件的{profile}
      label: master # 对应config-server获取的配置文件的{label},即Git仓库分支
4.1.4 编写测试用的Controller
@RestController
public class ConfigController {

    @Value("${profile}")
    private String profile;

    @GetMapping("/profile")
    public String profile(){
        return this.profile;
    }

}

4.2 测试验证

依次启动config-server:8181和config-client:8282,访问http://localhost:8282/profile,返回如下结果

pro-1.0

Config Client能够正常通过Config Server获取Git仓库中指定环境的配置内容。

5.Git仓库配置

Config Server的application.yml配置文件中,通过spring.cloud.config.server.git.uri指定Git仓库地址,实际上该属性的配置方式非常灵活,支持多种方式。

5.1 占位符

{application}、{profile}、{label}等占位符可以用于映射配置文件,还可以用于Config Server中配置Git仓库地址。

5.1.1 使用{application}指定Git仓库地址

Step 1:在Config Server中用{application}占位符的形式指定Git仓库地址

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/Lessismoreputin/{application}

Step 2:在Config Client中修改spring.application.name=spring-cloud-config-repository,因为建了一个Git仓库,这里简单起见,就不再创建新的Git仓库了。

spring:
  application:
    name: spring-cloud-config-repository

Step 3:在Git仓库中创建一个application-dev.yml的文件

profile: application-test

特别注意:用占位符的形式定义Git仓库地址时,配置文件的文件名必须为application*.ymlapplication*.properties

Step 4:依次启动Config Server和Config Client,访问http://localhost:8282/profile,结果如下

application-test

6 配置规则详解

Config Client从Config Server中获取配置数据的流程:

1.Config Client 启动时,根据 bootstrap.properties 中配置的应用名称(application)、环境名(profile)和分支名(label),向 Config Server 请求获取配置数据;
2.Config Server 根据 Config Client 的请求及配置,从Git仓库(这里以Git为例)中查找符合的配置文件;
3.Config Server 将匹配到的Git仓库拉取到本地,并建立本地缓存;
4.Config Server 创建Spring的 ApplicationContext 实例,并根据拉取的配置文件, 填充配置信息,然后将该配置信息返回给 Config Client ;
5.Config Client 获取到 Config Server 返回的配置数据后,将这些配置数据加载到自己的上下文中。同时,因为这些配置数据的优先级高于本地Jar包中的配置,因此将不再加载本地的配置。

image.png

那么, Config Server 又是如何与Git仓库中的配置文件进行匹配的呢?通常,我们会为一个项目建立类似如下的配置文件:

mallweb.properties : 基础配置文件;
mallweb-dev.properties : 开发使用的配置文件;
mallweb-test.properties : 测试使用的配置文件;
mallweb-prod.properties : 生产环境使用的配置文件;

当我们访问 Config Server 的端点时,就会按照如下映射关系来匹配相应的配置文件:

/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties

上面的Url将会映射为格式为:{application}-{profile}.properties(yml)的配置文件。另外, label 则对应Git上分支名称,是一个可选参数,如果没有则为默认的 master 分支。

而 Config-Client 的 bootstrap.properties 配置对应如下:

spring.application.name application;
spring.cloud.config.profile profile;
spring.cloud.config.label label.

7.Config Server健康状况

Config Server自带了健康状况指示器,暴露的endpoint为/health,用于检查配置的仓库是否可用。

对于文中的Config Server,请求http://localhost:8181/health返回如下结果

{
    "status": "UP"
}


Less is more.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容