从零学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 来实现动态刷新。

目录
相关文章
|
2月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
489 3
|
9天前
|
负载均衡 Java API
《深入理解Spring》Spring Cloud 构建分布式系统的微服务全家桶
Spring Cloud为微服务架构提供一站式解决方案,涵盖服务注册、配置管理、负载均衡、熔断限流等核心功能,助力开发者构建高可用、易扩展的分布式系统,并持续向云原生演进。
|
7月前
|
负载均衡 Dubbo Java
Spring Cloud Alibaba与Spring Cloud区别和联系?
Spring Cloud Alibaba与Spring Cloud区别和联系?
|
Java 测试技术 开发工具
|
3月前
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
790 0
|
17天前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
147 3
|
17天前
|
Java 测试技术 数据库连接
【SpringBoot(四)】还不懂文件上传?JUnit使用?本文带你了解SpringBoot的文件上传、异常处理、组件注入等知识!并且带你领悟JUnit单元测试的使用!
Spring专栏第四章,本文带你上手 SpringBoot 的文件上传、异常处理、组件注入等功能 并且为你演示Junit5的基础上手体验
490 2
|
4月前
|
人工智能 Java 测试技术
Spring Boot 集成 JUnit 单元测试
本文介绍了在Spring Boot中使用JUnit 5进行单元测试的常用方法与技巧,包括添加依赖、编写测试类、使用@SpringBootTest参数、自动装配测试模块(如JSON、MVC、WebFlux、JDBC等),以及@MockBean和@SpyBean的应用。内容实用,适合Java开发者参考学习。
498 0
|
6天前
|
XML 前端开发 Java
一文搞懂 Spring Boot 自动配置原理
Spring Boot 自动配置原理揭秘:通过 `@EnableAutoConfiguration` 加载 `META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports` 中的配置类,结合 `@Conditional` 按条件注入 Bean,实现“开箱即用”。核心在于约定大于配置,简化开发。
151 0