config组件统一配置的使用
demo地址
config 组件(配置) 统一配置中心
1. config 组件 统一配置中心
作用: 用来实现微服务系统中服务配置统一管理组件 netflix config ===> spring config
组件: 统一配置中心服务端(集中管理配置文件)、统一配置中心客户端 client
config server也是集群,修改后所有节点的配置都要统一改动。所以config server不作为最终配置文件管理者,而是作为临时配置文件的中转站。config server可以读取远程仓库,拉取到config server的本地仓库中。
修改的时候,只需要在远程仓库修改一次就行。(网关的配置也需要交给远程仓库管理)
为什么从远程仓库拉取配置后会在config server本地仓库缓存一份?
因为远程仓库可能宕掉。
2. config组件使用 config client ---> confiq server ---->远端git仓库
windows启动consul consul agent -dev
选择一个远端git仓库
- 使用github gitee
a. 创建新仓库
b. 获取仓库地址 获取仓库地址 gitee.com/w--kk/test-... - 搭建config server 统一配置中心服务
a. 独立springboot 应用
b. 引入config server依赖
java
<!--引入统一配置中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
-
配置application.properties 远程仓库地址
gitee.com/w--kk/test-... -
开启统一配置中心 ,在入口类加入注解
@EnableConfigServer
java
@SpringBootApplication
@EnableDiscoveryClient
@EnableConfigServer //代表我是统一配置中心服务
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class,args);
}
}
什么是Config
- 说明
-
config(配置)又称为 统一配置中心顾名思义, 就是将配置统一管理, 配置统一管理的好处是在日后大规模集群部署服务应用时相同的服务配置一致, 日后再修改配置只需要统一修改全部同步, 不需要一个一个服务手动维护。
- 统一配置中心组件流程图
Config Server开发
- 引入依赖
java
<!--引入统一配置中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
- 开启统一配置中心服务
java
@SpringBootApplication
@EnableConfigServer
public class Configserver7878Application {
public static void main(String[] args) {
SpringApplication.run(Configserver7878Application.class, args);
}
}
- 修改配置文件
java
server.port=7878
spring.application.name=configserver
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
- 直接启动服务报错
- 没有指定远程仓库的相关配置
- 创建远程仓库
- github创建一个仓库
- 复制仓库地址
- 在统一配置中心服务中修改配置文件指向远程仓库地址
java
spring.cloud.config.server.git.uri=https://github.com/chenyn-java/configservers.git 指定仓库的url
spring.cloud.config.server.git.default-label=master 指定访问的分支
#spring.cloud.config.server.git.username= 私有仓库访问用户名
#spring.cloud.config.server.git.password= 私有仓库访问密码
-
再次启动统一配置中心
-
拉取远端配置 [三种方式][]
- 拉取远端配置规则
- label/name-profiles.yml|properties|json
label 代表去那个分支获取 默认使用master分支
name 代表读取那个具体的配置文件文件名称
profile 代表读取配置文件环境
- 查看拉取配置详细信息
- http://localhost:7878/client/dev [client:代表远端配置名称][dev:代表远程配置的环境]
拉取到了本地
- 指定分支和本地仓库位置
java
spring.cloud.config.server.git.basedir=/localresp #一定要是一个空目录,在首次会将该目录清空
spring.cloud.config.server.git.default-label=master
Config Client 开发
config client 配置客户端组
- config client 微服务
- 创建一个独立springboot 应用
- 将自身配置交给远端git仓库管理
- 引入config client相关依赖
- 配置文件编写, 告诉config server地址
- 项目中引入config client依赖
java
<!--引入config client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
- 编写配置文件
java
spring.cloud.config.discovery.enabled=true #开启统一配置中心服务
spring.cloud.config.discovery.service-id=configserver #指定统一配置服务中心的服务唯一标识
spring.cloud.config.label=master #指定从仓库的那个分支拉取配置
spring.cloud.config.name=client #指定拉取配置文件的名称
spring.cloud.config.profile=dev #指定拉取配置文件的环境
spring.cloud.config.discovery.enabled=true
#根据服务id获取configserver
为了高可用,config client地址不能写死,所以需要去注册中心找,找到之后把列表拉取到本地,然后再选一台机器去config server获取配置
spring.cloud.config.discovery.service-id=CONFIGSERVER
#告诉当前configclient统一配置中心在注册中心服务id
- 远程仓库创建配置文件
java
- client.properties [用来存放公共配置][]
spring.application.name=configclient
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
- client-dev.properties [用来存放研发相关配置][注意:这里端口为例,以后不同配置分别存放]
server.port=9099
- client-prod.properties [用来存放生产相关配置][]
server.port=9098
- 启动客户端服务进行远程配置拉取测试
- 直接启动过程中发现无法启动直接报错
报错原因
- 项目中目前使用的是application.properties启动项目,使用这个配置文件在springboot项目启动过程中不会等待远程配置拉取,直接根据配置文件中内容启动,因此当需要注册中心,服务端口等信息时,远程配置还没有拉取到,所以直接报错
解决方案
- 应该在项目启动时先等待拉取远程配置,拉取远程配置成功之后再根据远程配置信息启动即可,为了完成上述要求springboot官方提供了一种解决方案,就是在使用统一配置中心时应该将微服务的配置文件名修改为bootstrap.(properties|yml),bootstrap.properties作为配置启动项目时,会优先拉取远程配置,远程配置拉取成功之后根据远程配置启动当前应用。
再次启动服务
手动配置刷新
config client 手动配置刷新
- 手动配置刷新
当远端git仓库中配置发生变化时,不需要重启微服务就可以直接读取远端配置信息,这种就叫手动配置刷新- 当前项目支持手动配置刷新
@RefreshScope
//作用: RefreshScope 用来在不需要重启微服务情况下,将当前scope域中信息刷新为最新配置信息
问题:每一个微服务节点如果要加载最新配置信息,必须向每一个服务手动发送post方式请求,才能加载最新配置
说明
-
在生产环境中,微服务可能非常多, 每次修改完远端配置之后, 不可能对所有服务进行重新启动, 这个时候需要让修改配置的服务能够刷新远端修改之后的配置, 从而不要每次重启服务才能生效, 进一步提高微服务系统的维护效率。
-
在springcloud中也为我们提供了手动刷新配置和自动刷新配置两种策略,这里我们先使用手动配置文件刷新。
-
在每个controller上加注解
java
@RefreshScope //作用: RefreshScope 用来在不需要重启微服务情况下,将当前scope域中信息刷新为最新配置信息
- 修改完远端git仓库配置文件之后, 向每一个微服务发送一个post方式请求
必须POST方式(或postman) curl -X POST http://localhost:8023/actuator/refresh
- 必须在微服务配置文件中暴露远端配置刷新端点(endpoint)
management.endpoints.web.exposure.include=*
问题
问题: 每一个微服务节点如果要加载最新配置信息,必须向每一个服务手动发送post方式请求,才能加载最新配置