本节为大家介绍:spring cloud config客户端的配置刷新,其实核心内容与《apollo实例配置热更新》差不多。需求都是在配置发生更改之后,将配置值的结果更新到客户端程序中。因此我们首先要明白两个问题:
1. 哪些配置刷新之后可以更新,哪些配置刷新之后也无效?参考《apollo实例配置热更新》第一小节,一样。
2. spring cloud config可以对哪些注解标注的配置进行刷新。下面两个例子都可以将"user.init.password"键对应的值热更新到password和defaultPwd对象上。
3. 这两个注解需要结合`@RefreshScope`注解使用才能使配置热更新生效。
~~~
@RefreshScope //这里需要加上RefreshScope注解
@ConfigurationProperties(prefix = "user.init")
public class User{
private String password;
}
~~~
下文中会针对这种@Value注解的方法为例进行讲解。
~~~
@RefreshScope //这里需要加上RefreshScope注解
public class Xxxxx{
@Value("${user.init.password}")
private String defaultPwd;
}
~~~
## 一、使微服务客户端具备配置刷新能力
### 1.1. 业务回顾
我们在《第一个微服务》调用章节,就介绍了aservice-rbac下面的服务:为用户重置密码的接口服务“/sysuser/pwd/reset”,前面的章节我们多次用到。其中红色的部分:从数据库的sys\_config表里面加载param\_key="user.init.password"对应的param\_value(也就是用户的默认密码)。

现在我们有了config服务配置中心,这个sys\_config数据库表我们就完全可以放弃了。我们把配置写在git仓库里面,进行集中管理。
### 1.2.发布一个自定义配置
首先,我们去config的git配置仓库**zimug-server-config-repo/aservice-rbac-dev.yml**增加配置:user.init.password=12345678,并将其发布


### 1.3.为微服务客户端增加配置刷新能力
**为aservice-rbac服务增加actuator**,因为actuator可以为我们提供“/actuator/refresh”配置刷新接口
~~~
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
~~~
配置actuator,在git仓库的**zimug-server-config-repo/aservice-rbac-dev.yml**中增加配置
* management.endpoints.web.exposure.include=refresh,health,表示我们只开放配置刷新接口和健康检查接口
~~~
management:
endpoints:
web:
exposure:
include: refresh,health
~~~
在需要进行配置刷新的类上使用`@RefreshScope`,user.init.password对应的配置对象defaultPwd的值就**初步具备刷新的能力**。
~~~
@Service
@RefreshScope
public class SysuserService {
@Value("${user.init.password}")
private String defaultPwd;
public void pwdreset(Integer userId){
if(userId == null){
throw new CustomException(CustomExceptionType.USER_INPUT_ERROR,
"重置密码必须带主键");
}else{
SysUser sysUser = sysUserMapper.selectByPrimaryKey(userId);
//String defaultPwd = dbLoadSysConfig.getConfigItem("user.init.password");
sysUser.setPassword(passwordEncoder.encode(defaultPwd));
sysUserMapper.updateByPrimaryKeySelective(sysUser);
smsService.send(sysUser.getPhone(),"您好,管理员已经将您的密码重置为" + defaultPwd);
}
}
}
~~~
## 二、测试:手动触发配置刷新
### 2.1.测试初始自定义配置是否生效
使用postman向“/sysuser/pwd/reset”接口发送请求

在SysUserService服务层(上面的代码)这一行下一个断点。可以看到密码是123456,说明我们的自定义配置加载生效了。

### 2.2.手动刷新配置
* 我们去Git仓库,将user.init.password=12345678,修改为user.init.password=Abcd1234
* 通过POST请求发送到`http://localhost:8401/actuator/refresh`,触发aservice-rbac的配置进行刷新,即刷新user.init.password配置。

使用postman向“/sysuser/pwd/reset”接口再次发送请求,仍在上文处下断点,这次的值为Abcd1234,证明我们配置刷新成功了。而且我们没有重新启动应用。

## 三、如何实现配置自动刷新
那么有没有一种方法,能够实现配置修改之后,自动去向`http://localhost:8401/actuator/refresh`发送请求,更新配置?是有方法的,但是不好。实际生产中几乎没法用,不好也给大家说说,学习一下。
我们可以在Git仓库中配置一个webhook,所谓webhook的作用就是每当git仓库有接收到push代码请求时,都会去向自定义指定URL发送POST请求。我们完全可以利用webhook进行配置的自动刷新。

这是一种方法给大家放在这学习一下,但是笔者重来没这么做过,基于以下几点原因:
* 微服务客户端必须提供公网地址才能访问到,实际生产或开发环境谁会把自己的内部服务全部暴露到公网?(上图中的127.0.0.1要换成公网ip才可以,内网ip是无法访问到的)
* webhook发送请求是无法区分项目、无法区分环境的。该向哪一个项目的,哪一个环境,哪一个实例发送`/actuator/refresh`请求?不能随便配吧。
* 最重要的原因:程序员提交代码的行为不可控,不能因为配置代码变更了就认为这种变更是正确的,不代表可以自动的应用到环境中。
基于以上原因,都不如自己决定向哪里发送`/actuator/refresh`请求。甚至写一个简单的管理程序,都比使用webhook强。当然如果我们想通过spring cloud config实现微服务配置的全量刷新、批量刷新、局部刷新,还有终极解决方案,那就是结合Spring Cloud Bus使用,后面章节我们会讲到。
- 文档简介
- 模块与代码分支说明
- dongbb-cloud项目核心架构
- 微服务架构进化论
- SpringBoot与Cloud选型兼容
- Spring Cloud组件的选型
- 单体应用拆分微服务
- 单体应用与微服务对比
- 微服务设计拆分原则
- 新建父工程及子模块框架
- 通用微服务初始化模块构建
- 持久层模块单独拆分
- 拆分rbac权限管理微服务
- Hello-microservice
- 构建eureka服务注册中心
- 向服务注册中心注册服务
- 第一个微服务调用
- 远程服务调用
- HttpClient远程服务调用
- RestTemplate远程服务调用
- RestTemplate多实例负载均衡
- Ribbon调用流程源码解析
- Ribbon负载均衡策略源码解析
- Ribbon重试机制与饥饿加载
- Ribbon自定义负载均衡策略
- Feign与OpenFeign
- Feign设计原理源码解析
- Feign请求压缩与超时等配置
- 服务注册与发现
- 白话服务注册与发现
- DiscoveryClient服务发现
- Eureka集群环境构建(linux)
- Eureka集群多网卡环境ip设置
- Eureka集群服务注册与安全认证
- Eureka自我保护与健康检查
- 主流服务注册中心对比(含nacos)
- zookeeper概念及功能简介
- zookeeper-linux集群安装
- zookeeper服务注册与发现
- consul概念及功能介绍
- consul-linux集群安装
- consul服务注册与发现
- 通用-auatator导致401问题
- 分布式配置中心-apollo
- 服务配置中心概念及使用场景
- apollo概念功能简介
- apollo架构详解
- apollo分布式部署之Portal
- apollo分布式部署之环境区分
- apollo项目权限管理实战
- apollo-java客户端基础
- apollo与SpringCloud服务集成
- apollo实例配置热更新
- apollo命名空间与集群
- apollo灰度发布(日志热更新为例)
- SpringCloudConfig配置中心
- config-git配置文件仓库
- config配置中心搭建与测试
- config客户端基础
- config配置安全认证
- config客户端配置刷新
- config配置中心高可用
- BUS消息总线
- bus消息总线简介
- docker安装rabbitMQ
- 基于rabbitMQ的消息总线
- bus实现批量配置刷新
- alibaba-nacos
- nacos介绍与单机部署
- nacos集群部署方式(linux)
- nacos服务注册与发现
- nacos服务注册中心详解
- nacos客户端配置加载
- nacos客户端配置刷新
- nacos服务配置隔离与共享
- nacos配置Beta发布
- 服务熔断降级hystrix
- 服务降级&熔断&限流
- Hystrix集成并实现服务熔断
- Jemter模拟触发服务熔断
- Hystrix服务降级fallback
- Hystrix结合Feign服务降级
- 远程服务调用异常传递的问题
- Hystrix-Feign异常拦截与处理
- Hystrix-DashBoard单服务监控
- Hystrix-dashboard集群监控
- 分布式系统流量卫兵sentinel
- sentinel简介与安装
- 客户端集成与实时监控
- 实战流控规则-QPS限流
- 实战流控规则-线程数限流
- 实战流控规则-关联限流
- 实战流控规则-链路限流
- 实战流控效果-WarmUp
- 实战流控效果-匀速排队
- BlockException处理
- 实战熔断降级-RT
- 实战熔断降级-异常数与比例
- DegradeException处理
- 注解与异常的归纳总结
- Feign降级及异常传递拦截
- 动态规则nacos集中存储
- 热点参数限流
- 系统自适应限流
- 微服务网关-GateWay
- 还有必要学习Zuul么?
- 简介与非阻塞异步IO模型
- GateWay概念与流程
- 新建一个GateWay项目
- 通用Predicate的使用
- 自定义PredicateFactory
- 编码方式构建静态路由
- Filter过滤器介绍与使用
- 自定义过滤器Filter
- 网关请求转发负载均衡
- 结合nacos实现动态路由配置
- 整合Sentinel实现资源限流
- 跨域访问配置
- 网关层面全局异常处理
- 微服务网关安全认证-JWT篇
- Gateway-JWT认证鉴权流程
- 登录认证JWT令牌颁发
- 全局过滤器实现JWT鉴权
- 微服务自身内部的权限管理
