SpringCloud基础(四)Spring Cloud Config:配置中心

2022年10月6日12:15:35

1、简介

Spring Cloud Config是一个分布式配置中心的解决方案,它为分布式系统提供了外部画的集中式管理功能,包含Config Server和Config Client

简单来说,就是Spring Cloud Config利用git仓库进行配置维护。当有请求到达Config Server时,Config Server就会向git请求,拉取配置,让所有服务感知到配置文件。

2、简单使用

根据上一篇内容的项目构建,继续本次项目编写。

新建项目,选择config server

 选择eureka client,完成构建

 在配置文件中,进行对应的配置

spring.application.name=spring-cloud-config-server
server.port=8085

eureka.client.service-url.defaultZone=http://localhost:8081/eureka

 配置完成后,还没有配置对应的git,因为Spring Cloud Config需要从git获取到配置,所以需要对git地址进行配置,在此就不放出用户名和密码了:

spring.cloud.config.server.git.uri=https://gitee.com/amidst_the_sun/spring-cloud-my-config-server.git
spring.cloud.config.server.git.username=
spring.cloud.config.server.git.password=

连接完成后,需要在git仓库中构建一个配置文件,如user.properties,内容如下:

spring.application.name=spring-cloud-user-provide
server.port=8083
eureka.client.service-url.defaultZone=http://localhost:8081/eureka

可以对一个固定的url进行访问:http://localhost:8085/test/user-a.properties

或者:http://localhost:8085/test/user-a.json

为什么可以这样访问呢?

这个配置文件的数据格式是可以在url的访问方式上进行定义,显示在网页上的数据格式也会呈现出对应的变化。

定义的文件叫做user.properties,名字是user,但是直接用user作为名称是无法访问的,因为这有一种对应的映射关系。

url和配置文件的映射关系,可以有以下几种访问方式:

  1. /{application}/{profile}/{lable}
  2. /{application}-{profile}.properties
  3. /{lable}/{application}-{profile}

*application 应用

*profile 环境(dev,prd,test)

*label git仓库的分支名称,可以不写,默认为master

因此,需要在user后面增加profile文件名作为访问路径,如果没有就随意定义一个就可以访问。

再定义一个新的文件user-prd.properties

spring.application.name: spring-cloud-user-provide
server.port: 8083
eureka.client.service-url.defaultZone: http://localhost:8081/eureka
profile: prd

访问地址:http://localhost:8085/user-prd.properties

可以建立新的分支test,创建文件user.properties,进行访问:http://localhost:8085/test/user-a.properties

这样就验证完成了。

除了指定文件,也可以指定文件的搜索范围,进行配置文件的分区隔离:

#相对搜索路径
spring.cloud.config.server.native.search-paths=

除了在git上进行定义,也可以在本地进行定义,配置为:

spring.profiles.active=native
spring.cloud.config.server.native.search-locations=file:f:/properties/

3、配置生效

3.1、服务配置

简单的配置好config server肯定是不足以让其他服务读取到对应的git配置文件,想要做到这一点,还需要对各个服务进行配置。

在一个需要进行统一配置管理的服务中,增加在git上的文件:spring-cloud-user-provide-prd.properties

spring.application.name=spring-cloud-user-provide
server.port=8083
eureka.client.service-url.defaultZone=http://localhost:8081/eureka
profile=prd

在对应的pom文件中,增加:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-client</artifactId>
</dependency>

修改配置文件,去掉端口号,留下Eureka配置和服务名称,
spring.cloud.config.discovery.service-id是config在eureka服务中的名称:

spring.application.name=spring-cloud-user-provide

spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.service-id=SPRING-CLOUD-CONFIG-SERVER
spring.cloud.config.profile=test

eureka.client.service-url.defaultZone=http://localhost:8081/eureka

启动之后会发现,依旧找不到对应的配置文件,整个项目是按照对应的默认配置进行启动的。

发生这种事情的原因是,git上的application.properties配置文件的优先级不够,优先加载本地的配置,为了能保证加载网络配置,还需要增加一个新的配置文件:bootstrap.properties,这个配置文件的加载优先级更高,能够保证一定会加载网络上配置中心的配置,由于版本的问题,2020.*之后的版本默认关闭了bootstrap.properties文件的加载,所以需要先增加jar包,在pom文件中添加:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

然后将application.properties配置文件中的配置复制到bootstrap.properties中,删除application.properties内容。

启动项目,然后查看:http://localhost:8085/spring-cloud-user-provide-prd.properties

确认配置生效后,查看Eureka的界面:

 发现项目确实已经按照config中的配置启动了。

可以再创建一个spring-cloud-user-provide-test.properties文件,将配置中心的spring.cloud.config.profile改为test

spring.cloud.config.profile=test

就可以发现,这个配置被改为了test文件的配置。

3.2、统一配置

除了分开的各种配置文件,还可以创建一个不带后缀的文件:spring-cloud-user-provide.properties,这个文件中可以增加一个配置:

userName=Jensen

prd,test这两个配置文件在进行查看的时候,http://localhost:8085/spring-cloud-user-provide-prd.properties

可以发现,spring-cloud-user-provide.properties配置文件配置的内容会出现在带后缀的配置文件内,spring-cloud-user-provide.properties就是总配置文件。

在总配置文件中的内容,userName是可以用@Value注解来引用的

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

 如果在获取到userName的配置值之后,再更新配置文件,就会发现,在项目里的userName变量值没有发生改变,也就说,配置的动态更新不会通知到项目。

如果想实现动态更新,就要使用消息总线,Spring Cloud Bus

4、Spring Cloud Bus 动态配置更新

想要实现动态更新,需要增加一些配置。

首先要增加消息总线的jar包:

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

 完成之后,在user-provider组件中增加配置,这个配置意味着可以监听配置的更新

management.endpoints.web.exposure.include=refresh

在user-provider组件中增加注解,@RefreshScope,开启刷新

@RefreshScope
@RestController
public class UserController {

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

    @GetMapping("/user")
    public User queryUser() {
        User user = new User();
        user.setName("Lily");
        user.setAge(18);
        return user;
    }

    @GetMapping("/default")
    public User queryDefaultUser() {
        User user = new User();
        user.setName(userName);
        user.setAge(18);
        return user;
    }

}

之后再更新git上的配置内容,就会发现,数据还没有更新!

因为想要项目感知到配置发生了变化,还需要主动进行一次刷新。

以post方式执行接口:http://localhost:8083/actuator/refresh,可以看到结果:

可以看到,接口感知到配置版本更新了,哪一个配置项更新了,此刻再访问username接口,就可以发现,数据确实产生了变化。

由此可见,想要自动感知配置变化,每次都需要执行一次接口,但这不现实。

在gitee上,有一个功能:webhook

 这个功能可以设定,在某些时候,比如代码被更新到库中时,执行某个方法,但是,这个方法必须要能被其他网络访问,也就是说,本地方法一定不行,必须要拥有一个服务器,在上面部署服务后,才能用这个功能进行配置更新。

  • 作者:烟锁迷城
  • 原文链接:https://blog.csdn.net/jiayibingdong/article/details/121268107
    更新时间:2022年10月6日12:15:35 ,共 4772 字。