概述
1、解决了什么问题
微服务以为者要将单体应用中的业务才分成一个个的子服务,每个服务的粒度相对较小
, 因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以需要一套集中式的
、动态的
配置管理
设施是必不可少的。
Spring Cloud 提供了 ConfigServer 来解决这个问题,我们的每一个微服务自己带着一个application.yml. 如果上百个服务那么必然面临着的问题就是一个信息“爆炸”
的问题(配置文件过多且凌乱)。
2、是什么
SpringCloud Config 为微服务架构中微服务提供了集中化的外部配置支持,配置服务器为各个不同微服务应用的的所有环境提供了一个中心化的外部配置。
- 如何使用
Spring Cloud 分为服务端
和客户端
两部分
-
服务端也称
为分布式配置中心
,它是一个独立的微服务应用
, 用来连接配置服务器并为客户端提供获取配置信息,加密/ 解密信息
等访问接口。 -
客户端
则是通过制定的配置中心
来管理应用资源,以及与业务相关的配置内容,并在启动的时候
从配置中心获取好加载配置信息配置服务器默认
采用git
来存储配置信息,这样就有助于缓解配置
进行版本管理,并且可以通过git 客户端工具
来方便管理和访问配置内容。
3、能干什么
- 集中管理配置文件
- 不同环境的不同配置,
动态化
的配置更新
,分环境部署比如:/dev/test/prod/beta/release 运行期间
动态调整配置,不再需要在每个服务器部署
的机器上编写配置文件,服务会向配置中心统一
拉取配置自己
的信息- 当配置发生变动,服务
不需
要重启
即可感知配置的并发并应用新的配置 - 将配置信息以
REST
接口的形式暴露
4、能与GitHub 、码云等进行整合
config官网: https://spring.io/projects/spring-cloud-config#learn
简单案例(采用码云,GitHub同理)
- 新建仓库 cloud2020-config
- 如果需要下载: https://gitee.com/aqiang9/cloud2020-config.git
- 配置多环境: config-dev.yml 、config-test.yml 、 config-prod.yml 等
- 对于配置文件的修改 一般是由运维人员负责修改
搭建配置中心
1、模块名 cloud-config-center-3344
2、pml.xml (注册中心 、web、actuator 等)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
3、yml 配置文件
server:
port: 3344
spring:
application:
name: cloud-config-center
cloud:
config:
server:
git:
uri: https://gitee.com/aqiang9/cloud2020-config.git // 配置文件地址
search-paths:
- cloud2020-config // 路径
# 读取的分支
label: master
# 注册中心的配置 (可以自行替换)
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka
instance:
instance-id: config-center
prefer-ip-address: true
4、主启动
@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer
public class ConfigCenterMain3344 {
public static void main(String[] args){
SpringApplication.run(ConfigCenterMain3344.class,args) ;
}
}
5、测试
http://127.0.0.1:3344/master/config-dev.yml
配置规则
/{lable}/{name}-{profiles}.yml #
/{name}-{profile}.yml # 默认为master
/{name}/{profile}[/{lable}] # http://127.0.0.1:3344/config/dev/master
- lable:分支{branch} 如果不配置 默认为master
- name: 服务名
- profiles : 环境名 {dev/test/prod}
整合client端
1、模块名 cloud-config-client3355
2、pml.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
3、yml 配置文件
bootstrap.yml
server:
port: 3355
spring:
application:
name: config-client
cloud:
config:
label: master # 分支名称
name: config # 配置文件名
profile: dev # 读取后缀名称
uri: http://config-3344.com:3344 #配置中心地址
# 完整地址 {uri}/{label}/{name}-{profile}.yml
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka
instance:
instance-id: ${spring.application.name}
prefer-ip-address: true
4、主启动
@SpringBootApplication
@EnableEurekaClient
public class ConfigClientMain3355 {
public static void main(String[] args){
SpringApplication.run(ConfigClientMain3355.class,args) ;
}
}
@RestController
public class ConfigClientController {
@Value("${server.port}")
private String serverPort;
@Value("${conf.info}")
private String configInfo;
@GetMapping("/configInfo")
public String info(){
return configInfo ;
}
}
5、测试
localhost:3355/configInfo
问题随之而来,分布式分配至的动态刷新问题
- 当远程修改配置文件,configserver 能
立刻生效
, configclient并未作出响应
重启
后生效
yml的说明
1、bootstrap.yml 与application.yml 区别
application.yml 用户级的资源配置文件
bootstrap.yml 系统级的配置文件
springcloud 会创建一个Bootstrap Context 作为spring应用的ApplicationContext的父上下文初始化时,BootstrapContext负责从外部源加载配置文件并解析配置。这两个上下文共享一个从外部获取的Environment
Bootstrap 属性有高优先级
默认情况下 不会被本地配置覆盖
两个上下文有着不同的约定 ,所以新增一个bootstrap 保证配置分离
要将Client
模块下的application.yml 改为bootstrap.yml
刷新配置文件(手动)
修改 configclient端
- pom.xml 中引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- 修改yml
# 为了动态刷新 配置文件 暴露监控端点
management:
endpoints:
web:
exposure:
include: "*"
- 修改需要动态配置的业务类: 添加
@RefeshScope
注解 表示需要动态更新
@RestController
@RefreshScope
public class ConfigClientController {
-
测试
-
配置没有刷新 ?
- 需要发送一条刷新请求
curl -X POST "localhost:3355/actuator/refresh
, 触发配置刷新
- 需要发送一条刷新请求
思考还有什么问题
- 如果有多个微服务客户端 config-client1、config-client2、config-client3 , 每个微服务都要执行一次 post 请求,手动刷新?
是否可以官博,一处通知,处处生效?
- 能否定制化通知
引入消息总线 , 优化配置服务