一、什么是分布式配置中心?用来干嘛的?
Spring Cloud Config 是一种用来动态获取Git、SVN、本地配置文件的一种工具
在spring cloud项目中,都会配置一个配置中心去管理各个服务的配置文件,而往往配置文件不会放到本地配置中心,一般都会放到git上,也就是配置文件与项目分离,放在git或者svn上统一管理。既可以多个项目的配置文件共用一个仓库,也可以每个项目分别一个仓库!!
接下来我们看看如何来搭建config服务端和客户端:
1.先创建一个名为springcloud-config-server-6001的子模块,作为config服务端
导入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
它的配置如下:
server:
port: 6001
spring:
application:
name: springcloud-config-server
cloud:
config:
server:
git:
uri: https://gitee.com/xingrenjie/springcloud-config.git
search-paths: /**
说明如下:
spring.cloud.config.server.git.uri: git仓库的地址。
spring.cloud.config.server.git.search-paths: git仓库地址下的相对地址 多个用逗号","分割。
然后在启动类上加上注解@EnableConfigServer即可。
这样一来,服务端就配置好了。
2.另起一个模块作为客户端。我这里拿eureka来测试,并且项目里eureka的核心配置文件是空的:
导入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
在resource目录下新建bootstrap.yml文件,内容如下:
spring:
cloud:
config:
uri: http://localhost:6001
label: master
name: config-eureka-server
profile: eureka7001
说明如下:
spring.cloud.config.uri:连接的config服务端地址(这里我的服务端地址为localhost:6001)
spring.cloud.config.name: 获取配置文件的名称(我gitee仓库里的配置文件名为config-eureka-server)。
spring.cloud.config.profile: 获取配置的策略(我的配置文件里有三种配置,这里设置取哪种)。
spring.cloud.config.label:获取仓库分支,默认是master。如果是是本地获取的话,则无用。
spring.cloud.config.discovery.enabled: 开启配置信息发现。
spring.cloud.config.discovery.serviceId: 指定配置中心的service-id,便于扩展为高可用配置集群。
注:上面这些与spring-cloud相关的属性必须配置在bootstrap.properties中,config部分内容才能被正确加载。因为bootstrap.properties的相关配置会先于application.properties,而bootstrap.properties的加载也是先于application.properties。需要注意的是eureka.client.serviceUrl.defaultZone要配置在bootstrap.properties,不然客户端是无法获取配置中心参数的,会启动失败!
最后来看看我的gitee仓库和配置文件内容:
config-eureka-server.yml配置内容如下:
spring:
profiles:
active: eureka7001
---
server:
port: 7001
spring:
profiles: eureka7001
eureka:
instance:
hostname: eureka7001.com
client:
fetch-registry: false
register-with-eureka: false
service-url:
defaultZone: http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
---
server:
port: 7002
spring:
profiles: eureka7002
eureka:
instance:
hostname: eureka7002.com
client:
fetch-registry: false
register-with-eureka: false
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7003.com:7003/eureka
---
server:
port: 7003
spring:
profiles: eureka7003
eureka:
instance:
hostname: eureka7003.com
client:
fetch-registry: false
register-with-eureka: false
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
我将eureka集群的三个配置写在一个配置文件了,由spring.profiles来区分。这样一来,三个客户端连接同一个config服务端,只需指定spring.cloud.config.profile:eureka7001,eureka7002,eureka7003即可拿到各自的配置!!
下面我启动看看效果:
简单的config分布式配置中心就完成了,有一个问题,我的配置文件都是杂乱的放在一个仓库里的,如果这个仓库需要存放多个项目的配置文件呢。那我们是不是应该对每个项目的配置文件分类存放,分别放在各自的目录下?
多个项目公用一个Git仓库,用不同的目录区分项目:
服务端:
server:
port: 6001
spring:
application:
name: springcloud-config-server
cloud:
config:
server:
git:
uri: https://gitee.com/xingrenjie/springcloud-config.git
search-paths: ‘{application}’
这种模式下不同的项目会对应到https://gitee.com/xingrenjie/springcloud-config.git仓库下的不同目录,如果项目中spring.application.name=user
,那么它的配置仓库会定位到https://gitee.com/xingrenjie/springcloud-config.git仓库下的/user
目录。配置文件按application-{profile}.properties
的格式存储,{profile}
代表环境名。
多个项目使用多个不同Git仓库:
服务端:
spring.cloud.config.server.git.uri=https://gitee.com/xingrenjie/{application}.git
这种模式下不同的项目会对应的不同的Git仓库,如果项目中spring.application.name=user
,那么它的配置仓库会定位到https://gitee.com/xingrenjie/user.git仓库下的配置。配置文件按application-{profile}.properties
的格式存储,{profile}
代表环境名。