前言
在前面我们整合SpringCloudConfig
遇到了一个问题,就是当配置信息有更新的时候,客户端并不能主动感知到配置的变化,从而去主动获取最新的配置。那么客户端如何去主动获取最新新的配置信息呢?SpringCloud
已经给我们提供了解决方案,客户端可以通过actuator
的/refresh
接口来刷新配置信息。
Refresh
修改spring-cloud-config-client
项目pom,引入actuator
依赖:
<!--actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
完整pom:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spring-cloud-config</artifactId>
<groupId>com.chaytech</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>spring-cloud-config-client</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--spring cloud config client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!--eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!--actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
</project>
在获取配置的类加上@RefreshScope
注解,当请求客户端/refresh
接口的时候就会更新此类下面的变量值:
@RestController
@RefreshScope // 使用该注解的类,会在接到SpringCloud配置中心配置刷新的时候,自动将新的配置更新到该类对应的字段中
public class ClientController {
@Value("${profiles}")
private String profiles;
@GetMapping("/profiles")
public String profiles() {
return this.profiles;
}
}
修改application.yml
增加关闭安全认证配置,否则/refresh
需要授权才能访问:
management:
security:
enabled: false # 关掉安全认证
OK,这样就完成了Refresh
改造。
启动eureka
集群、config server
端、config client
端来测试:
请求:http://127.0.0.1:9003/profiles
接着修改配置文件内容,提交到GitHub:
请求:http://127.0.0.1:9003/profiles
配置信息还没有变,接着我们请求refresh
接口:http://127.0.0.1:9003/refresh
可以看到refresh
接口返回了刷新变量的名称。
再次请求:http://127.0.0.1:9003/profiles
可以看到客户端拿到了最新的配置信息。
这种信息虽说可以帮我解决不能获取到最新配置信息的问题,但是每次都需要人为来请求refresh
接口来刷新,也很麻烦。那怎么可以自动触发这个接口呢?我们可以利用GitHub的WebHooks
来帮助我完成这个工作。
WebHooks
WebHooks
是当某个事件发生时,通过发送HTTP POST
请求的方式来通知信息接收方。WebHooks
来监测你在Github
上的各种事件,最常见的莫过于push
事件。如果你设置了一个监测push
事件的WebHooks
,那么每当你的这个项目有了任何提交,这个WebHooks
都会被触发,这时Github
就会发送一个HTTP POST
请求到你配置好的地址。
如此一来,我们就可以通过这种方式去自动完成一些重复性工作。下面我们来配置。
切换到对应的仓库,找到Settings
——WebHooks
:
添加webhook
:
Payload URL
:触发后回调的URLContent type
:数据格式,有两个选择,一般使用jsonSecret
:用作给POST的body加密的字符串。采用HMAC算法events
:触发的事件列表。
事件类型:
1.push
:仓库有push时触发。默认事件
2.create
:当有分支或标签被创建时触发
3.delete
:当有分支或标签被删除时触发
这样我们就可以利用webhook
的机制去触发客户端的配置更新,但是当客户端越来越多的时候webhook
这种方式显然不太好,每当增加客户端都需要增加webhook
也是不现实的。在后面我将再介绍另外一种方案,来优雅的解决此问题。