从零学SpringCloud系列(八):分布式配置中心Spring Cloud Config

简介: 从零学SpringCloud系列(八):分布式配置中心Spring Cloud Config

一、快速入门


1.1 项目版本


spring boot:2.2.5.RELEASE

spring cloud:Hoxton.SR3


1.2 项目地址


https://github.com/zhenghaoxiao/spring-cloud-in-action/tree/dev


在搭建配置中心的时候,我们需要注意的一个地方就是,在配置客户端的时候,我们需要使用bootstrap.properties,这样config-server中的配置信息才能被正确的加载。具体搭建过程可以参考下面文章:


https://blog.csdn.net/hao134838/article/details/105339907


二、配置详解

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

上面的url会映射{application}-{profile}.properties对应的配置文件,{label}对应git上不同的分支,默认为master。


所以在上面项目中,我们启动config-server工程后,我们可以访问:


http://localhost:7071/config-client/dev 地址得到下面内容

{
    "name":"config-client",
    "profiles":[
        "dev"
    ],
    "label":null,
    "version":"40af4c2ef1ad8ac9a394b8a244396fa303c3e665",
    "state":null,
    "propertySources":[
        {
            "name":"https://github.com/zhenghaoxiao/springcloudconfig/rpo/config-client-dev.properties",
            "source":{
                "from":"jack-cloud"
            }
        }
    ]
}

客户端配置详和git中存储文件中各个部分的对应关系

spring.application.name:对应配置文件规则中的{application}部分
spring.cloud.config.label:对应配置文件规则中{profile}部分
spring.cloud.config.profile:对应配置文件规则中{label}部分
spring.cloud.config.uri=http:对应配置文件规则中config-server的地址

三、服务端详解


3.1 基础架构


20200512101728793.png


3.2 执行流程


1、应用启动时,根据bootstrap.properties中配置的应用名{application}、环境名{profile}、分支名{label},向Config Server请求获取配置信息。


2、Config Server根据自己维护的Git仓库信息和客户端传递过来的配置定位信息去查找配置信息


3、通过 git clone命令将找到的配置信息下载到Config Server的文件系统中。


4、Config Server创建Spring 的ApplicationContext实例,并从Git本地仓库中加载配置文件,最后将这些配置内容读取出来返回给客户端应用。


5、客户端应用在获得外部配置文件后加载到客户端的ApplicationContext实例,该配置内容的优先级高于客户端jar包内部的配置内容,所以在jar中重复内容将不再被加载。


Config Server巧妙的通过 git clone将配置信息存于本地,起到了缓存的作用,即使当git服务端无法访问的时候,依然可以读取C onfig Server中缓存内容进行使用。


3.3 仓库 配置


对于仓库配置config默认采用了git。git非常使用存储配置内容,他可以非常方法的利用各种第三方工具对配置内容进行修改,并且它的Hook功能还可以帮助我们实时监控配置内容的修改。同时,它也支持SVN、本地文件系统等方式进行存储配置内容。


下面我们主要介绍一下使用git作为配置仓库的内容

spring.cloud.config.server.git.uri=https://github.com/zhenghaoxiao/springcloudconfig
spring.cloud.config.server.git.searchPaths=rpo
spring.cloud.config.server.git.username=jack
spring.cloud.config.server.git.password=******


如果我们将uri的值通过file://前缀来设置为一个文件地址,那么它将以本地 仓库的方式运行,这样我们就可以脱离git服务端来快速进行调试与开发,比如:


spring.cloud.config.server.git.uri=file://${user.home}/config-repo


其中{user.home}代表当前用户所属目录。


3.3.1 占位符配置URI


{application}、{profile}、{label}这些 占位符除了用于标识配置文件的规则之外,还可以用于Config Server中对git 仓库地址的URI配置,比如,我们可以通过{application}占位符来实现一个 应用对一个一个git仓库目录的配置效果,具体配置如下:

spring.cloud.config.server.git.uri=https://github.com/zhenghaoxiao/springcloudconfig/{application}
spring.cloud.config.server.git.searchPaths=rpo
spring.cloud.config.server.git.username=jack
spring.cloud.config.server.git.password=******

其中,{application}代表了应用名,所以当客户端应用向Config Server发起获取配置的要求时,Config Server会根据客户端的spring.application.name信息来填充{application}占位符以定位配置 资源的存储位置,从而实现根据微服务应用的属性动态获取不同位置的配置。另外,在这些占位符中,{label}参数较为特别,如果git的分支和标签名包含了“/”,那么{label}参数在http的URL中应该使用“(_)”来代替,以避免改变了uri含义,指向到其他的URI资源。


3.3.2 子目录存储


除了支持占位符配置外,config server还可以将配置文件定位到git仓库的子目录中,我们在快速入门项目中的的配置中有一个配置是

spring.cloud.config.server.git.searchPaths=rpo

对于这个参数的配置也支持使用{application}、{profile}、{label}占位符


3.4 属性覆盖


config server还有一个“属性覆盖”的 特性,他可以让开发人员为所有的应用提供配置属性,只需要通过spring.cloud.config.server.overrides.name属性来设置键值对的参数,这些参数会以map的方式 加载到客户端。

spring.cloud.config.server.overrides.name=didi

通过 该属性配置的参数,不会被spring cloud的客户端修改,并且spring cloud中获取配置的信息时,都会取得这些配置信息。


3.5  服务化配置


服务化配置就是将config server作为一个服务单元纳入到服务中心管理之中,然后通过服务发现来访问config server。这样我们服务端和客户端都需要依赖eureka,加入到eurka服务治理体系,在上面项目中应配置了,大家可以参考一下项目中的配置。


spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.service-id=config-server


四、动态刷新配置


4.1 手动刷新配置


手动刷新是指,我们修改了git仓库中的配置内容以后, 客户端获取到的内容并不是最新的, 需要我们手动调用一个接口来触发 刷新。我们需要修改客户端项目:


pom 依赖:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>


配置文件增加:


management.endpoints.web.exposure.include= health,info,refresh


在需要获得配置文件的类上增加注解:@RefreshScope

@RestController
@RefreshScope
public class TestController {
    @Value("${from}")
    private String from;
    @GetMapping("/test")
    public String getFrom() {
        return from;
    }
}

这样我们修改完远程仓库中的内容手动调用接口:http://localhost:7072/actuator/refresh 即可


4.2 利用git 的webhooks实现自动刷新


1、进入 github 仓库配置页面,选择 Webhooks ,并点击 add webhook;


aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMjczMzY0LzIwMTkwNy8yNzMzNjQtMjAxOTA3MjUwOTA1NTk5NzAtOTMxNTAwNTU3LnBuZw.png

2、之后填上回调的地址,也就是上面提到的 actuator/refresh 这个地址,但是必须保证这个地址是可以被 github 访问到的。如果是内网就没办法了。这也仅仅是个演示,一般公司内的项目都会有自己的代码管理工具,例如自建的 gitlab,gitlab 也有 webhook 的功能,这样就可以调用到内网的地址了。



aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMjczMzY0LzIwMTkwNy8yNzMzNjQtMjAxOTA3MjUwOTA2MTQyMjktMzkwNDAxNzA3LnBuZw.png

五、小结


对于一些简单的项目来说,我们一般都是直接把相关配置放在单独的配置文件中,以 properties 或者 yml 的格式出现,更省事儿的方式是直接放到 application.properties 或 application.yml 中。但是这样的方式有个明显的问题,那就是,当修改了配置之后,必须重启服务,否则配置无法生效。


目前有一些用的比较多的开源的配置中心,比如携程的 Apollo、蚂蚁金服的 disconf 等,对比 Spring Cloud Config,这些配置中心功能更加强大。有兴趣的可以拿来试一试。


在spring cloud 家族中 config也是 足够好用了。。


后续。。。。。


续我们会利用消息总线 Spring Cloud Bus 来实现动态刷新。

目录
相关文章
|
1月前
|
SpringCloudAlibaba Java 持续交付
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
131 0
|
1月前
|
SpringCloudAlibaba 负载均衡 Java
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(目录大纲)
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(目录大纲)
61 1
|
1月前
|
Java Nacos Sentinel
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(九)Nacos+Sentinel+Seata
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(九)Nacos+Sentinel+Seata
185 0
|
1月前
|
Java 数据库连接 开发工具
web后端-SpringCloud-Config分布配置
web后端-SpringCloud-Config分布配置
|
2月前
|
API
在vite.config.js 配置代理
在vite.config.js 配置代理
64 2
|
4月前
|
API
vite.config.js 的一些常用配置
vite.config.js 的一些常用配置
105 1
|
3天前
|
JavaScript
vue.config.ts配置环境变量
vue.config.ts配置环境变量
10 0
|
28天前
|
移动开发 监控 小程序
mPaaS常见问题之uniapp ios端云打包的配置config文件如何解决
mPaaS(移动平台即服务,Mobile Platform as a Service)是阿里巴巴集团提供的一套移动开发解决方案,它包含了一系列移动开发、测试、监控和运营的工具和服务。以下是mPaaS常见问题的汇总,旨在帮助开发者和企业用户解决在使用mPaaS产品过程中遇到的各种挑战
22 0
|
1月前
|
消息中间件 SpringCloudAlibaba Java
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
778 0
|
1月前
|
开发工具 git 微服务
【二十三】搭建SpringCloud项目六(Config)配置中心动态刷新
【二十三】搭建SpringCloud项目六(Config)配置中心动态刷新
19 0