SpringCloud Config 分布式配置管理
配置中心用于统⼀管理配置, 快速切换各个环境的配置。
常用的配置中心
- 百度开源的disconf https://github.com/knightliao/disconf
- 阿⾥开源的diamand https://github.com/takeseem/diamond
- springcloud开源的Config http://cloud.spring.io/spring-cloud-config/
- zookeeper
Config是一个分布式的配置管理中心,由config server、config client2部分组成,每个要从config server是获取配置的服务节点都是config client。
使用git仓库存储配置
config默认使⽤git仓库来存储配置,可以使用公司自己搭建的git服务器,也可以使⽤github、码云上的私人仓库。
不推荐使用github上的仓库来存储配置,因为在国内使用github访问速度很慢,个人开发者建议使用码云。
新建私人仓库,名称比如config-mall,不同环境的配置有2种方式
(1)文件名指定
配置文件都放在master分支下,比如用户服务的配置:user-service-dev.yml user-service-test user-service-prod.yml
dev是开发环境,test是测试环境,prod是生产环境
(2)分支指定(推荐)
新建分支dev、test
master下放生产环境的配置,dev下放开发环境的配置,test下放测试环境的配置
文件名都是user-service.yml,不需要在文件名中指名环境
使用yml、properties文件都可以
所有eureka client的配置都可以放在git仓库中,比如网关、消费者、提供者,因为要先从eureka server获取config server节点列表,所以要是eureka client
config server
要单独写一个服务作为config server
(1)新建子模块config-server作为服务,创建时只需勾选Spring Cloud Config -> Config Server,Spring Cloud Discovery -> Eureka Discovery Client
也可以手动加依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
如果只有一台config server,挂了系统就不可用,config server肯定要集群,要作为一个服务注册到eureka server上,各服务节点从eureka server上获取config server的节点列表。
(2)引导类上加 @EnableConfigServer、@EnableEurekaClient
@EnableEurekaClient可缺省,因为依赖中有eureka client的依赖时会自动加@EnableEurekaClient
(3)配置文件
server:
port: 9100
spring:
application:
#服务名称
name: config-server
cloud:
config:
server:
git:
#git仓库地址
uri: https://gitee.com/chenhongyong/config-mall.git
#git服务器的账户、密码,我使用的是码云,码云的账号、密码
username: xxxxxxxxxx
password: xxxxxxxxx
#超时时间,单位s,默认5
timeout: 5
#默认分⽀,默认master。如果config client未指定使用的git仓库分支,默认使用此处配置的默认分支
default-label: master
eureka:
client:
#注册中心地址
serviceUrl:
defaultZone: http://127.0.0.1:8761/eureka/
eureka的配置、git仓库配置
启动config server,地址栏输入 127.0.0.1:9100/master/user-service.yml,能看到配置内容说明config server搭建成功。
地址的写法很多:
- port后面是分支名,缺省时默认为master 127.0.0.1:9100/user-service.yml
- 文件后缀使用yml、properties、json均可,会自动转化
config client
把eureka client都作为config client,网关、消费者、提供者,只要是eureka server之外的服务都可以是config client
(1)创建时勾选Spring Cloud Config -> Config Client
也可以手动添加依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
这个依赖是勾选Config Client自动添加的,里面包含了config client、jackson等依赖,可以只添加config client的:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-client</artifactId> </dependency>
(2)配置文件
spring:
application:
#服务名称
name: user-service
cloud:
config:
discovery:
#使用配置中心,默认false
enabled: true
#配置中心的服务名
service-id: config-server
#指定环境,默认使用master分支
#profile: dev
#使用label指定分支
label: dev
eureka:
client:
#注册中心地址
serviceUrl:
defaultZone: http://127.0.0.1:8761/eureka/
配置文件中只需保留erueka、config的配置,其它配置都放到git仓库中
环境有2种指定方式,对应git仓库2种配置方式:
- 如果git仓库使用文件名区分,则使用profile指定
比如服务名是user-service,profile是dev,那就使用分支(默认master)下的user-service-dev.yml
- 如果git仓库使用分支区分,则使用label指定要使用的分支
比如服务名是user-service,会使用指定分支下的user-service.yml
(3)端口问题
如果我们把端口配置server.port放到git仓库中,应用使用默认的8080就启动了,我们配置的端口无效。有2种解决方式:
- 就把server.port写在resources下的application.yml中
- 把server.port放到git仓库中,把resources下的application.yml重命名为bootstrap.yml
spring、springboot启动时会自动加载资源根目录下的application、bootstrap配置文件,只是加载时机不同
启动应用时会在控制台打印端口,可以在控制台查看应用使用的端口
流程:
应用启动注册Eureka Server -> 从Eureka Server获取Config Server的节点列表 -> 从Config Server获取配置。