查看原文
其他

Spring Cloud(十)高可用的分布式配置中心 Spring Cloud Config 中使用 Refresh

搜云库 搜云库技术团队 2019-04-07

上一篇文章讲了 SpringCloudConfig 集成 Git仓库,配和 Eureka 注册中心一起使用,但是我们会发现,修改了 Git仓库的配置后,需要重启服务,才可以得到最新的配置,这一篇我们尝试使用 Refresh 实现主动获取 ConfigServer 配置服务中心的最新配置

准备工作

把上一篇,示例代码下载,才可以进行一下的操作,下载地址在文章末尾

spring-cloud-eureka-service
spring-cloud-config-server
spring-cloud-eureka-provider-1
spring-cloud-eureka-provider-2
spring-cloud-eureka-provider-3
spring-cloud-feign-consumer

Config Client

修改第九篇文章项目

spring-cloud-eureka-provider-1
spring-cloud-eureka-provider-2
spring-cloud-eureka-provider-3

添加依赖

  1. <!-- actuator 监控 -->

  2. <dependency>

  3.    <groupId>org.springframework.boot</groupId>

  4.    <artifactId>spring-boot-starter-actuator</artifactId>

  5. </dependency>

安全认证

在 application.properties 添加以下配置.关闭安全认证

  1. #关闭刷新安全认证

  2. management.security.enabled=false

值是 false的话,除开 health接口还依赖 endpoints.health.sensitive的配置外,其他接口都不需要输入用户名和密码了

开启 refresh

在程序的启动类 EurekaProviderApplication 通过 @RefreshScope 开启 SpringCloudConfig 客户端的 refresh刷新范围,来获取服务端的最新配置, @RefreshScope要加在声明 @Controller声明的类上,否则 refresh之后 Conroller拿不到最新的值,会默认调用缓存。

  1. package io.ymq.example.eureka.provider;

  2. import org.springframework.beans.factory.annotation.Value;

  3. import org.springframework.boot.SpringApplication;

  4. import org.springframework.boot.autoconfigure.SpringBootApplication;

  5. import org.springframework.cloud.context.config.annotation.RefreshScope;

  6. import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

  7. import org.springframework.web.bind.annotation.RequestMapping;

  8. import org.springframework.web.bind.annotation.RestController;

  9. @RefreshScope

  10. @RestController

  11. @EnableEurekaClient

  12. @SpringBootApplication

  13. public class EurekaProviderApplication {

  14.    @Value("${content}")

  15.    String content;

  16.    @Value("${server.port}")

  17.    String port;

  18.    @RequestMapping("/")

  19.    public String home() {

  20.        return "Hello world ,port:" + port+",content="+content;

  21.    }

  22.    public static void main(String[] args) {

  23.        SpringApplication.run(EurekaProviderApplication.class, args);

  24.    }

  25. }

测试服务

按照顺序依次启动项目

spring-cloud-eureka-service
spring-cloud-config-server
spring-cloud-eureka-provider-1
spring-cloud-eureka-provider-2
spring-cloud-eureka-provider-3
spring-cloud-feign-consumer

启动该工程后,访问服务注册中心,查看服务是否都已注册成功:http://localhost:8761/

修改Git仓库

修改 Git仓库配置,在 content=hello dev 后面加个 123456

访问服务

命令窗口,通过 curl http://127.0.0.1:9000/hello 访问服务,或者在浏览器访问 http://127.0.0.1:9000/hello F5 刷新

发现没有得到最新的值

刷新配置

通过 Postman 发送 POST请求到:http://localhost:8081/refresh,http://localhost:8083/refresh,我们可以看到以下内容:

访问服务

命令窗口,通过 curl http://127.0.0.1:9000/hello 访问服务,或者在浏览器访问 http://127.0.0.1:9000/hello F5 刷新

发现:服务8082 没有刷新到最新配置 因为没有手动触发更新

源码下载

GitHub:https://github.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-config-eureka-refresh

码云:https://gitee.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-config-eureka-refresh

下篇预告

留了一个悬念, ConfigClient 实现配置的实时更新,我们可以使用 /refresh 接口触发,如果所有配置的更改,都需要手动触发,那岂不是维护成本很高,而使用 SpringCloudBus 消息总线实现方案,可以优雅的解决以上问题,下篇文章我们讲 SpringCloudBus 的使用,关注下文章末尾公众号,支持下作者,感谢

Contact

  • 作者:鹏磊

  • 出处:http://www.ymq.io/2017/12/23/spring-cloud-config-eureka-refresh

  • Email:admin@souyunku.com

  • 版权归作者所有,转载请注明出处

  • Wechat:关注公众号,搜云库,专注于开发技术的研究与知识分享


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存