SpringCloud基础Spring Cloud Config:配置中心
Posted 烟锁迷城
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringCloud基础Spring Cloud Config:配置中心相关的知识,希望对你有一定的参考价值。
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和配置文件的映射关系,可以有以下几种访问方式:
- /application/profile/lable
- /application-profile.properties
- /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
这个功能可以设定,在某些时候,比如代码被更新到库中时,执行某个方法,但是,这个方法必须要能被其他网络访问,也就是说,本地方法一定不行,必须要拥有一个服务器,在上面部署服务后,才能用这个功能进行配置更新。
以上是关于SpringCloud基础Spring Cloud Config:配置中心的主要内容,如果未能解决你的问题,请参考以下文章
SpringCloud基础Spring Cloud Config:配置中心