以下部分纯属个人理解,但是结果都是经过demo验证。

一、spring cloud config介绍

  spring cloud是spring家族中的一个微服务工具包,其中包含了很多微服务的工具。偏向于与spring boot类似的配置方式,有许多许多默认配置。spring cloud config是其中的一个工具包,用于配置的拉取更新。

  举一个小小的例子,当我们程序中有一个配置文件需要修改,但是服务已经启动,配置文件中的配置已经读取到内存中,为了修改配置,我们需要重启服务;如果是一台或者几台机器重启,还算容易,但是如果是一个集群,重启就变成一个非常耗时的工作;如果我们使用spring cloud config,就可以在服务运行时,拉取git(svn等,下面以git为例)的配置,修改内存中的配置。

二、spring cloud config逻辑介绍

  config-server:提供对git的连接,配置拉取,这里的拉取是被动拉取。

  config-client:连接config-server,通过URI请求对应的配置文件,获取配置属性

  如图表示client从server拉取配置的过程:

  

  1、client根据配置向server发送配置请求

  2、server根据配置从git拉取所有文件(git clone的过程)

  3、git将整个仓库下发

  4、server解析client的URI请求,返回相应的配置属性或者错误信息(不存在相应的配置属性)

  如图表示client发送刷新配置请求的过程:

  1、client向server发送refresh请求

  2、server向从git更新本地配置(git pull)

  3、git下发更新

  4、server对比更新,发现client需要的配置有更新时,会将更新信息发给client

理解:1、在client第一次向server发送URI请求时,server会根据配置的git地址,拉取对应仓库的所有文件(与git clone@{git adress})(在config-server本地/tmp目录下可以找到git本地仓库);

   2、值得注意的是,在client发送刷新配置请求(refresh)时,server会根据本地仓库的情况处理:

     (1)如果server本地仓库有未提交的commit和未commit的修改时,server就不会从git上拉取更新(不会git pull),只会将本地仓库中对应的配置属性传给client;

     (2)如果server本地仓库没有任何修改和commit,server会从git上拉取更新(git pull),然后将本地仓库对应的配置属性传给client。

   3、还有一个坑点,我在demo测试过程中发现,如果git仓库过大,拉取过程很长,在server拉取的时候会出错(有一个最大等待时长,超过会出现超时错误)。为了实现大的二进制文件的正常拉取,可以切到本地仓库地址,手动拉取一次更新。

     (1)在创建本地仓库时就采用手动拉取的方式:在配置文件application.properties中,设置git的url地址为本地文件地址,初始化时,手动git clone远程仓库地址到设置的本地文件地址。在更新配置的时候,config-server也会自动从远程拉取更新。

     (2)如果是更新的时候有大文件的修改导致不能拉取更新:application.properties配置文件中git的url为远程仓库地址,初始化时能够自动拉取,如果有大文件更新,利用git工具,手动切到本地/tmp目录下,利用git命令手动拉取更新就可以拉取大文件的更新,在之后的小文件更新中,config-server就能够正常自动更新。

总之就是,client向server发送一个URI请求:“我要**属性,你那里有吗?”,然后server根据自身的配置,拉取git仓库,然后去找client需要的那个属性,然后告诉client:“我这里有(没有)这个属性,(有就给client)”;刷新过程就是,client向server发送一个URI请求:“我请求的属性值变了吗?”,然后server处理之后,回复client:“变了,这是新的值。(没变)”。

三、配置文件介绍

1、client配置文件如下:

spring.application.name = test                              1
spring.cloud.config.lable = master 2
spring.cloud.config.profile = dev 3
spring.cloud.config.uri = http://localhost:8881/    4

解释:1和3组成了访问的配置文件名,如test-dev.properties

   2决定了git的分支,此处为master分支

   4表示config-server的地址

请求的URI就是由这个配置决定的,网上关于这点的说明很多,此处不再赘述

2、server配置文件如下:

spring.cloud.config.server.git.uri = https://github.com/lucknot/songxh_scse/    1
spring.cloud.config.server.git.searchPaths = test                    2

解释:1表示git仓库的地址,这里是我的github仓库地址(并没有干货)

   2表示配置搜索的文件夹,在client请求配置时,只会在这个文件夹下进行搜索

事实上将1和2拼接在一起就组成了搜索配置属性的URL地址。

针对配置文件需要说明以下,label表示的分支只与client的配置相关:client中配置的是哪个分支就取哪个分支的配置

ps:在写这篇博客的时候突然想到一个问题,client在像server请求时是否只是请求需要的属性的值,还是请求对应的属性文件。个人感觉是取对应文件名的配置文件,在client拿到配置文件后再将读取对应的属性,与spring boot中从配置文件中读取属性类似(事实上就是两个上下文,spring cloud的上下文有高优先级)。

对spring cloud config的一点理解的更多相关文章

  1. Spring Cloud Config Server 节点迁移引起的问题,请格外注意这一点!

    前言: 虽然强烈推荐选择使用国内开源的配置中心,如携程开源的 Apollo 配置中心.阿里开源的 Nacos 注册&配置中心. 但实际架构选型时,根据实际项目规模.业务复杂性等因素,有的项目还 ...

  2. Spring Cloud Config原码篇(十)

    上篇中说到通过@Value注解获取配置中心的内容进行注入,要想了解这个就要知道spring Environment原理,关于这原理我看了下网上分析的文章:https://blog.csdn.net/t ...

  3. spring cloud config git库文件搜索顺序

    spring.cloud.config.server.git.uri只配置到仓库那一层就行了,需要访问仓库的子目录的话就配置spring.cloud.config.server.git.searchP ...

  4. 【SpringCloud】第七篇: 高可用的分布式配置中心(Spring Cloud Config)

    前言: 必需学会SpringBoot基础知识 简介: spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选. ...

  5. Spring Cloud Config 实现配置中心,看这一篇就够了

    Spring Cloud Config 是 Spring Cloud 家族中最早的配置中心,虽然后来又发布了 Consul 可以代替配置中心功能,但是 Config 依然适用于 Spring Clou ...

  6. Spring Cloud Config 配置中心实践过程中,你需要了解这些细节!

    本文导读: Spring Cloud Config 基本概念 Spring Cloud Config 客户端加载流程 Spring Cloud Config 基于消息总线配置 Spring Cloud ...

  7. Spring Cloud Config(一):聊聊分布式配置中心 Spring Cloud Config

    目录 Spring Cloud Config(一):聊聊分布式配置中心 Spring Cloud Config Spring Cloud Config(二):基于Git搭建配置中心 Spring Cl ...

  8. 使用Spring Cloud Config统一管理配置,别再到处放配置文件了

    1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! 可配置是一个成熟软件系统应该提供的特性,而配置管理对于大型系统就显得十分重要,特别是对于拥有多个应用的微服务系统.可喜的是, ...

  9. Spring Cloud Config应用篇(九)

    一.SpringCloud Config 配置中心 1.1.配置中心说明 SpringCloud Config 服务器以下简称"配置中心". Spring Cloud Config ...

随机推荐

  1. July 10th, Week 29th Sunday, 2016

    Everything is good when new, but friend when old. 老朋友更醇香. When did you meet with your last friends l ...

  2. Ulua对象管理方式

    不管是C++中还是在C#中,在都绕不开一个问题:类对象怎么在Lua中使用的问题,还好Lua提供了Userdata以及ligh Userdata结构类型,通过扩展可以处理这方面的问题.现在的很多框架也大 ...

  3. iOS命名规范(转载)

    转载地址:http://www.cnblogs.com/qiqibo/archive/2012/09/05/2671553.html 正文: • 格式化代码 ◦ 指针“*”号的位置 ▪ 如:NSStr ...

  4. 函数中声明变量不用Var的情况

    我们都知道函数中声明变量不用Var时这个变量会成为全局变量,但是并不是函数一开始执行就会把它变为全局变量,必须执行到这条语句. 看一段代码 function f(){    alert(a);    ...

  5. 「SNOI2019」字符串

    题目 看起来非常一眼啊,我们完全可以\(std::sort\)来解决这歌问题 于是现在的问题转化成了比较函数怎么写 随便画一下就会发现前面的好几位是一样的,后面的好几位也是一样,只需要比较中间的一段子 ...

  6. matlab数字图像处理 入门基础

    本代码基于张铮主编的<数字图像处理与机器视觉>一书. 源图片:lena A = imread ('lena.jpg'); %读入图像lena.jpg,赋给变量A %imwrite(A,'l ...

  7. jquery $("[id$='d']").val();这句话什么意思?

    获得id后缀为d字符的值.应该是属于input标签.谢谢 匹配给定的属性是以某些值结尾的元素,比如<span id="ad">test</span>< ...

  8. Appium——处理混合APP中H5的操作

    https://blog.csdn.net/iiyting/article/details/51887488

  9. 分布式爬虫之elasticsearch基础1

    一:搜索引擎elasticsearch介绍 Elasticsearch 是一个全文搜索引擎,可以快速地储存.搜索和分析海量数据. 二:应用场景 海量数据分析引擎 站内搜索引擎 数据仓库 三:安装 我们 ...

  10. Java并发(三)线程池原理

    Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池.在开发过程中,合理地使用线程池能够带来3个好处. 1. 降低资源消耗.通过重复利用已创建的线程降低线程 ...