程序员社区

SpringCloud构建微服务之SpringCloudConfig配置中心Refresh

前言

在前面我们整合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 :触发后回调的URL
  • Content type :数据格式,有两个选择,一般使用json
  • Secret :用作给POST的body加密的字符串。采用HMAC算法
  • events :触发的事件列表。
    事件类型:
    1. push:仓库有push时触发。默认事件
    2. create:当有分支或标签被创建时触发
    3. delete:当有分支或标签被删除时触发

这样我们就可以利用webhook的机制去触发客户端的配置更新,但是当客户端越来越多的时候webhook这种方式显然不太好,每当增加客户端都需要增加webhook也是不现实的。在后面我将再介绍另外一种方案,来优雅的解决此问题。

源码地址:https://github.com/chencytech/spring-cloud-examples

赞(0) 打赏
未经允许不得转载:IDEA激活码 » SpringCloud构建微服务之SpringCloudConfig配置中心Refresh

一个分享Java & Python知识的社区