1 介绍
在微服务中起码有几十上百的服务,每个服务都有自己的配置文件。若需要修改,则特别麻烦。
Spring Cloud Config 为微服务提供集中化的外部配置支持,配置服务器为各个不同的微服务应用的所有环节提供了一个中心化的外部配置。如下图所示:
SpringCloud Config 分为服务端和客户端两部分。
服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息、加密、解密信息等访问接口。
客户端则通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。配置服务器默认采用 git 来存储配置信息,这样就有助于对环境配置进行版本管理。并且可以通过 git 客户端工具来方便的管理和访问配置内容。
SpringCloud Config 有以下功能:
- 集中管理配置文件
- 不同环境,不同配置,动态化的配置更新,分环境部署,比如 /dev /test /prod /beta / release
- 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉去配置自己的信息。
- 当配置文件发生改变,服务不需要重启,即可感知到配置的变化,并应用新的配置。
- 将配置信息以 REST 接口的形式暴露。
2 整合配置中心
2.1 创建远程仓库
根据上图,首先在 github 或码云上创建一个仓库。以码云为例,拉取仓库下来后,在根目录下创建 eureka 文件,并在 /erueka 路径下创建 eureka.yml、eureka-dev.yml、eureka-prod.yml 三个配置文件及编写相应配置信息。最后上传到到码云。
- eureka.yml
server:
port: 7001
spring:
profiles:
active: dev
- eureka-dev.yml 测试环境配置
spring:
application:
name: springcloud-eureka-dev
security:
user:
name: pkyShare
password: 123456
eureka:
instance:
hostname: eureka7001 # eureka 服务端实例名称
client:
# 单点时,如果 registerWithEureka 配置为 true,则 eureka server 会报错 Cannot execute request on any known server
registerWithEureka: false # 是否注册到 eureka 服务,默认为 true,当前已为 eureka server,且单点 eureka,故配置为 false
fetchRegistry: false # 是否在本地缓存注册表信息,默认为 true,当前为单点 eureka server,不需要从其他 eureka 除获取注册表信息,更谈不上缓存,故配置为 false
serviceUrl:
# 配置其他 eureka 的地址,如果多台则逗号分隔。
defaultZone: http://pkyShare:123456@${eureka.instance.hostname}:${server.port}/eureka/
# defaultZone: http://pkyShare:123456@eureka7002.com:7002/eureka/,http://pkyShare:123456@eureka7003.com:7003/eureka/
- eureka-prod.yml 生产环境配置
spring:
application:
name: springcloud-eureka-prod
security:
user:
name: pkyShare
password: 123456
eureka:
instance:
hostname: eureka7001 # eureka 服务端实例名称
client:
# 单点时,如果 registerWithEureka 配置为 true,则 eureka server 会报错 Cannot execute request on any known server
registerWithEureka: false # 是否注册到 eureka 服务,默认为 true,当前已为 eureka server,且单点 eureka,故配置为 false
fetchRegistry: false # 是否在本地缓存注册表信息,默认为 true,当前为单点 eureka server,不需要从其他 eureka 除获取注册表信息,更谈不上缓存,故配置为 false
serviceUrl:
# 配置其他 eureka 的地址,如果多台则逗号分隔。
defaultZone: http://pkyShare:123456@${eureka.instance.hostname}:${server.port}/eureka/
# defaultZone: http://pkyShare:123456@eureka7002.com:7002/eureka/,http://pkyShare:123456@eureka7003.com:7003/eureka/
2.2 创建配置中心模块
创建 springcloud-config-server 模块。
- pom.xml
<!-- springcloud begin -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!-- 配置中心依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
<!-- springcloud end -->
- application.yml
server:
port: 4001
spring:
application:
name: springcloud-config-server
# 配置远程仓库
cloud:
config:
server:
git:
# https 协议,不是 git
uri: https://gitee.com/pkyshare/springcloud-config-server.git
search-paths: /** # 表示远程仓库中根路径下的所有文件
username: 码云账号
password: 码云密码
# eureka 配置
eureka:
client:
service-url:
# eureka 服务端地址(即注册地址),若 eureka 开启了权限认证,则需要携带账号密码
defaultZone: http://pkyShare:123456@eureka7001.com:7001/eureka/
# defaultZone: http://pkyShare:123456@eureka7001.com:7001/eureka/,http://pkyShare:123456@eureka7002.com:7002/eureka/,http://pkyShare:123456@eureka7003.com:7003/eureka/
- 启动类
@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer // 表明自己是配置中心
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
2.3 启动并测试
启动后,在浏览器上输入:http://localhost:4001/master/eureka-dev.yml ,其中 master 是分支,结果如下图:
表明配置中心已经成功读取了远程仓库的某个配置信息。接下来就是客户端通过配置中心读取远程仓库信息。
3 配置 Eureka 客户端
3.1 pom.xml
在原有的依赖基础上引入以下依赖:
<!-- 配置 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
3.2 配置文件
- 创建 bootstrap.yml 配置文件
spring:
cloud:
config:
uri: http://localhost:4001 # 配置中心地址
name: eureka # 配置文件名
label: master # 分支名
profile: dev # 环境
技术上,bootstrap.yml 是被一个父级的 Spring ApplicationContext 加载的。这个父级的 Spring ApplicationContext 是先加载的,在加载 application.yml 的 ApplicationContext 之前。当使用 Spring Cloud 的时候,配置信息一般是从配置中心加载的,为了取得配置信息(比如密码等),需要一些提早的引导配置。因此,把连接配置中心的信息放在 bootstrap.yml,用来加载在这个时期真正需要的配置信息。如果放在 application.yml 中,则无法加载到想要的数据。
- 修改 application.yml,也可全部注释原来的配置。
spring:
application:
name: springcloud-eureka
3.3 启动 Eureka
启动后,浏览器输入 http://localhost:7001/,并通过认证,如下图:
表明客户端通过配置中心读取配置成功。