配置中心:Spring Cloud Config

声明:
1.本节将会把配置中心集成在Eureka的服务中心里,所以将会使用Spring Cloud Netflix Eureka + Spring Cloud Config来完成本节内容
2.入门级文档,更多内容会持续更新,不足之处,望不吝指点


一、简介

Spring Cloud ConfigNacos不同,它虽然也支持自身发布配置,但是其主要的配置来源还是其他的存储类应用,比如Git、SVN、Valut、数据库等等,Spring Cloud Config的作用就是提供一个抽象,不用让用户得知配置的具体来源,具体的操作细节等等。它就像是一个代理人,由它帮我们将配置从目标地方取出来,然后按照我们设置的策略分享给需要这些配置的服务。Spring Cloud Config的默认配置仓库是Git,这也是使用得最多得一种方案,故本节也将使用Git来进行讲解和演示。


二、配置中心(服务端,配置发布者)
  • 依赖(不显示Eureka相关依赖)
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>
  • 配置(基于Git)
    • 端口号
      Spring Cloud Config Client默认会从8888端口获取配置,所以你可以为了图个方便将配置中心的端口号也改为8888,本节示例使用的端口号是8089
    • 关闭Spirng Cloud Config Client
      服务端不需要
    spring.cloud.config.enabled=false
    
    • (可选)配置的发布路径前缀
      默认为空字符串,即从根目录下直接访问就可以了,但是本节为了和Eureka服务中心的相关的配置不冲突,我修改了前缀为config-mtk,这样所有的配置将会发布在/config-mtk/
    spring.cloud.config.server.prefix=/config-mtk
    
    • Git仓库的路径
      • 可以使用本地的Git仓库,如果仓库路径的开头是file://的话,就代表启用本地的Git仓库作为配置来源,注意Windows下应当是以file:///开头
      • 可以在路径名中使用特殊的占位符,具体可看Placeholders in Git URI
    spring.cloud.config.server.git.uri=https://xxx/shiinamutsuki/config-center
    
    • Git仓库用户名及密码
    spring.cloud.config.server.git.username=
    spring.cloud.config.server.git.password=
    
    • (极其重要)SSL验证
      如果你想通过SSL来保证访问的安全性,那请跳过这段。如果你不知道SSL验证是啥,我建议这里关闭SSL验证,否则你将会陷入PKIX path building failed: sun.security.provider .certpath.SunCertPathBuilderException: unable to find valid certifi cation path to requested target的错误,而为此痛苦不已,当然你也可以选择直接面对它,这时你需要下载对应网站的证书,并将其添加到你jre的证书库中,然后稍等一会儿。
    spring.cloud.config.server.git.skip-ssl-validation=true
    
    • (可选)配置默认分支
      如果客户端没有指定从哪个分支获取配置,将会从默认分支中提取
    spring.cloud.config.server.git.default-label=<分支名>
    
    • (可选)配置配置获取的超时时间,默认5s
    spring.cloud.config.server.git.timeout=5
    
    • (可选)强制拉取更新
      Spring Cloud Config会在本地保存一个克隆的仓库,但是如果因为意外导致这个克隆的仓库文件发生了变化,那么Spring Cloud Config将无法把克隆的仓库进行更新,这时如果配置了强制拉取更新,那么这个问题就会得以解决。
    spring.cloud.config.server.git.force-pull=true
    
    • (可选)强制删除未匹配到的分支
      Spring Cloud Config默认不会删除任何本地仓库的任何分支,即使远程仓库中的对应分支已经删除,除非重启配置中心,这样将会新建一个本地仓库。你可能不太清楚这会产生什么问题,让我举个例子,假设远端仓库有两个分支一个是test,另外一个是master,你在你的客户端中配置了spring.cloud.config.label=test,master,想达到我无需改动配置,只要将远端仓库的test分支删除,就可以实现从测试环境到正式环境的转换的目的。这时你会发现就算你删除了test分支,但是你的应用依旧在测试环境中,因为本地的仓库压根就没有删除test分支。
    spring.cloud.config.server.git.delete-untracked-branches=true
    
    • (可选)缓存配置的持续的时间
      由于有本地仓库的存在,所以如果你的应用配置更新不频繁,且对在配置做出变化时需要应用立刻进行响应的要求不高,那么你可以进行这项配置,Spring Cloud Config将会每隔一段时间将本地仓库更新,而不是在每次请求配置的时候更新
    # 默认是0
    spring.cloud.config.server.git.refresh-rate=5
    
    • (可选)如果你想使用SSH的链接,你可以参照Authentication
      Git SSH configuration using properties
    • (可选)配置多个Git仓库,可以参照Pattern Matching and Multiple Repositories
    • (可选)全局配置
      Spring Cloud Config也支持像Nacos那样自己发布配置,不过这个配置是全局配置,对所有从配置中心获取配置的人都会返回额外返回一份这个全局配置。附加说一点,全局配置不仅仅只可以配置在配置中心本身里,也可以配置在远端仓库中,当你的远端仓库存在一个application.yaml或者是application.properties文件时,该配置文件的内容也将额外作为全局配置一起呗返回。这两种全局配置的方式可以一起使用。下列例子中,我将Eureka Client的配置作为全局配置设置在了配置中心中。
    spring
      cloud:
        config:
          server:
            overrides:
              eureka.client.service-url.defaultZone: http://mtk:123456@localhost:8089/eureka/
              eureka.instance.prefer-ip-address: true
              eureka.instance.instance-id: $\{spring.application.name}:$\{spring.cloud.client.ip-address}:$\{server.port}
    

    $\{}将会被解析为${},如果直接使用${}你会发现有趣的现象

  • 使能配置中心@EnableConfigServer
@SpringBootApplication
@EnableConfigServer
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}
  • 验证
    • 启动配置中心
    • 访问配置
    $ curl localhost:8089/config-mtk/eureka-test/eureka-test-provider.properties
    cn.mtk.hello: hello
    eureka.client.service-url.defaultZone: http://mtk:123456@localhost:8089/eureka/
    eureka.instance.instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
    eureka.instance.prefer-ip-address: true
    

    需要说明的是,即使没有找到对应的配置,全局配置也会被返回。附加:支持的访问url格式可以参照:
    {prefix}/{application}/{profile}[/{label}]
    {prefix}/{application}-{profile}.yml
    {prefix}/{label}/{application}-{profile}.yml
    {prefix}/{application}-{profile}.properties
    {prefix}/{label}/{application}-{profile}.properties


三、配置客户端(客户端,配置接收者)
  • 依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
  • 配置
    注意:客户端由于要在接受本地配置要前先接受远端配置,故需要将Spring Cloud Config相关的配置配置在启动配置文件中bootstrap.yaml
    • 服务名
      服务名将会作为配置获取路径的组成部分之一,所以需要配置好
    • 配置中心地址
      注意配置到访问前缀为止
    spring.cloud.config.uri=http://localhost:8089/config-mtk
    
    • 访问的配置分支
    spring.cloud.config.label=eureka-test
    
    • (可选)快速失败操作
      如果你需要客户端在没有接收到配置时抛出异常并中止服务,你可以进行该项配置
    spring.cloud.config.fail-fast=true
    
    • (可选)(承接快速失败操作)如果你不想单纯一次就判定为失败,你可以尝试使用spring.cloud.config.retry.*系列的配置来进行失败重试的相关配置,不过你得添加额外的依赖spring-retryspring-boot-starter-aop,具体请看Config Client Retry
    • (可选)超时相关配置
    spring.cloud.config.request-read-timeout=
    spring.cloud.config.request-connect-timeout=
    
  • 启动
  • 额外说明
    • ConfigServicePropertySourceLocator这个Bean包含了许多配置文件中不能配置的配置,比如RestTemplate实例等等,如果需要可以尝试对该Bean进行自定义,具体操作可查Providing A Custom RestTemplate
    • 你会发现本节是将服务发现相关的配置放在了配置中心中,而每个客户端都只配置了配置中心的配置,那么你会想,如果配置中心发生了变更,要一个个客户端去更改配置不是太过麻烦,能不能让服务中心运行在配置中心之前呢,答案是可以的,但是那样同样会造成几个问题,每个客户端需要配置服务中心的地址了,且启动阶段时间将会大大延长,因为需要在启动期间进行服务发现的配置,然后获取配置中心的服务,然后获取配置,然后进行配置。关于这部分内容你可以参考Discovery First Bootstrap

参考文档:
[1] Spring Cloud Config官方文档2.2.2.RELEASE

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