Config 统一配置中心
引言
什么是config
简单来说,就是为了统一管理微服务的配置,好处是日后大规模集群部署服务应用时,
相同的服务配置一致,日后再修改配置只需要统一修改全部同步,不需要一个一个服务手动维护。
工作流程
- config server先去github/gitee/gitlab等代码托管平台上拉取配置文件到config server,同时config server 为了安全,会在本地存储一份配置(window平台默认是存放在user/APPdata/)
- 之后每个微服务在启动时回去config server拉取对应的配置文件信息
一 、Config Server 开发
1.引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--引入consul依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!-- 这个包是用做健康度监控的-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--引入统一配置中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
</dependencies>
为什么要引入consul客户端
是为了把config server统一配置中心也注册到服务中心
因为以后统一配置中心也会是集群部署,所以为了保障高可用性,避免单节点宕机导致整个微服务系统崩溃,同时也是为了实现微服务从config server拉取配置信息时负载均衡
# 2.开启统一配置中心服务
@SpringBootApplication
@EnableConfigServer
public class Configserver7878Application {
public static void main(String[] args) {
SpringApplication.run(Configserver7878Application.class, args);
}
}
# 3.修改配置文件
server:
port: 8900
spring:
application:
name: CONFIG-SERVER
cloud:
consul:
host: localhost
port: 8500
config:
server:
git:
uri: https://gitee.com/yangjiawen621/configs.git
default-label: master #默认是master 分支
username: xxxxxxx
password: xxxxxxxxx
注意!!!:
1.uri是在github/gitee上面的仓库地址
2 如果仓库是public,那么不用配置username和password
3 如果是私密仓库,则需要配置username和password,如果不配置,则报错
# 4.启动服务,拉取远端配置文件
拉取规则 : label/name-profiles.yml |properties |json
label 代表去那个分支获取 默认使用master分支
name 代表读取那个具体的配置文件文件名称
profile 代表读取配置文件环境
实例:
gitee远端创建的仓库
启动server config项目进行拉取
拉取时必须按照拉取规则,
- 如果要拉取testServerConfig文件这里要写成testServerConfig-xxxx.yml形式
- 如果要拉取testServerConfig-dev文件这里要写成testServerConfig-dev.yml形式
- 如果要拉取testServerConfig-prod文件这里要写成testServerConfig-prod.yml形式
同时控制台显示已把文件存储到本地/users/appdata目录
发现已经全部拉取到本地
二、Config Client 开发
Config Client其实就是一个个的微服务
# 1.项目中引入config client依赖
<!--引入config client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
# 2.编写 bootstrap.yml 配置文件
spring:
cloud:
config:
discovery:
enabled: true
# 由于config server之前我们已经在consul服务中心注册,因此需要根据服务id去注#册中心获取服务列表,然后根据默认的轮询负载选取一个config-server来获取配置信息
service-id: SERVER-CONFIG
label: master #指定从仓库的那个分支拉取配置
name: testServerConfig #指定拉取配置文件的名称
profile: dev #指定拉取配置文件的环境
注意
由于config server之前我们已经在consul服务中心注册,因此需要根据服务id去注册中心获取服务列表,然后根据默认的轮询负载选取一个config-server来获取配置信息,因此需要在配置文件中声明和开启
注意2:
在config-client中配置文件不再是application.yml,需要改为bootstrap.yml,这样项目在启动时就不会使用本地的配置文件启动,而是会根据bootstrap的配置去config-server获取指定的yml文件,然后根据获取到的yml文件启动项目
启动项目:
发现控制台有拉取信息
再看注册中心:发现GOODS服务已经成功注册,并且端口时我们dev配置文件的8083端口
并且只要我们在gitee/github上面更改了配置文件,并保存,那么Config会自动拉更新配置文件
但是我们config client(即微服务)此时不能感知到配置文件的变化,需要重启后或者向每一个微服务手动发送一个POST请求才会更新配置文件
在生产环境中,微服务可能非常多,每次修改完远端配置之后,不可能对所有服务进行重新启动或者发送一个POST请求!!这样会影响微服务系统的维护效率
有没有办法能够让服务能够刷新远端修改之后的配置
,从而不要每次重启服务才能生效呢??
在springcloud中也为我们提供了Bus组件来实现自动刷新配置.
详情请移步自动刷新配置Bus组件