热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringCloud学习之六:使用SpringCloudBus自动刷新配置

使用SpringCloudBus自动刷新配置1.简介上一章已经实现了使用服务配置中心集中管理配置文件,并可actuatorrefresh手动刷新配置而不需重启。但如果所有微服务节点

使用Spring Cloud Bus自动刷新配置

1. 简介

上一章已经实现了使用服务配置中心集中管理配置文件,并可/actuator/refresh手动刷新配置而不需重启。但如果所有微服务节点的配置都需要手动刷新,工作量也很大。所以本文将使用Spring Cloud Bus实现配置的自动刷新。

Spring Cloud Bus使用轻量级的消息代理(RabbitMQ、Kafka等)连接分布式系统节点,这样当其中一个节点的状态更改时可以自动广播到其他节点。


graph LR
用户--/actuator/bus-refresh-->A[Config Server]
A --从Git拉取配置--> B[Git Repo]
C[微服务A] --获取配置--> A
D[微服务B] --获取配置--> A
E[微服务C] --获取配置--> A
F[Spring Cloud Bus] -.接收消息.-> C
F -.接收消息.-> D
F -.接收消息.-> E
A -.发送消息.-> F

2. Spring Cloud Bus


2.1 实现自动刷新



  • 在配置中心scl-config-server和客户端scl-eureka-client-consumer中添加如下spring-cloud-starter-bus-amqp依赖。


    org.springframework.cloud
    spring-cloud-starter-bus-amqp



  • 在两个项目的配置文件application.yml中都添加RabbitMQ相关配置,并在actuator中暴露bus-refresh端点

    spring:
    rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
    endpoints:
    web:
    exposure:
    include: bus-refresh


  • 在配置中心scl-config-server中添加WebSecurityConfig配置类,关闭CSRF。否则刷新时无法通过校验

    @EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable();
    super.configure(http);
    }
    }


  • 重启两个项目,然后访问http://localhost:8090/consumer/config
    技术图片



  • 修改配置文件并提交到Git仓库

    profile: production-1.1-bus


  • 在Postman中使用Post请求访问http://localhost:8600/actuator/bus-refresh,并选择Basic校验,返回204 No Content,再次访问http://localhost:8090/consumer/config,可以看到配置已刷新
    技术图片
    技术图片



  • 借助Git仓库的WebHooks,就可以实现配置的自动刷新。




2.2 问题


若使用/actuator/bus-refresh端点刷新后,没有通知其他节点;导致只有本节点配置更新,其他节点配置无更新。则可能跟Turbine聚合监控问题一样,都是因为交换器的问题。




  • 检查RabbitMQ的交互器
    技术图片

  • 将两个交换器进行绑定即可
    技术图片


3. 局部刷新

在某些场景下(如灰度发布),若指向刷新部分微服务的配置,可通过/actuator/bus-refresh/{destination}中的destination定位要刷新的应用范围

destination值为{spring.application.name}:{server.port}



  • 将客户端scl-eureka-client-consumer修改一个端口为8091再次启动,此时有两个客户端,端口分别为8090和8090



  • 修改配置文件并提交到Git仓库

    profile: production-1.1-bus-update


  • 在Postman中使用Post请求访问http://localhost:8600/actuator/bus-refresh/scl-eureka-client-consumer:8091,并选择Basic校验,返回204 No Content,再次访问http://localhost:8090/consumer/config和http://localhost:8091/consumer/config,可以看到8091对应的配置已更新,但8090的未更新。局部更新成功
    技术图片
    技术图片
    技术图片




4. Spring Cloud Config与Eureka配合使用

前文中是在客户端中指定Config Server地址,这种方式无法利用服务发现组件的优势



  • 在配置中心scl-config-server中添加spring-cloud-starter-netflix-eureka-client依赖


    org.springframework.cloud
    spring-cloud-starter-netflix-eureka-client


    com.fasterxml.jackson.dataformat
    jackson-dataformat-xml





  • 修改配置中心的配置文件application.yml,将其注册到服务注册中心

    eureka:
    client:
    fetch-registry: false
    service-url:
    defaultZone: http://root:123456@test1:8100/eureka-server1/eureka,http://root:123456@test2:8200/eureka-server2/eureka,http://root:123456@test3:8300/eureka-server3/eureka # 服务注册中心地址


  • 修改客户端scl-eureka-client-consumer的配置文件bootstrap.yml内容,并移除application.yml中eureka的配置

    spring:
    cloud:
    config:
    profile: prod
    label: master
    username: root
    password: 123456
    discovery:
    enabled: true # 使用服务注册中心中的Config Server,默认false
    service-id: scl-config-server # 指定Config Server在服务注册中心的名称,默认是configserver
    eureka: # 因为bootstrap.yml在application.yml之前加载,若将eureka配置放在application.yml里,启动时会从默认的服务注册中心抓取服务信息,导致失败
    client:
    register-with-eureka: true # 是否注册到服务注册中心
    fetch-registry: true # 是否从注册中心抓取信息,若不存在服务调用设置为false即可,反之则设置为true
    registry-fetch-interval-seconds: 5 # 每5秒刷新一下本地缓存
    service-url:
    defaultZone: http://root:123456@test1:8100/eureka-server1/eureka,http://root:123456@test2:8200/eureka-server2/eureka,http://root:123456@test3:8300/eureka-server3/eureka # 服务注册中心地址


  • 重启两个项目,测试发现一切正常。



SpringCloud学习之六:使用Spring Cloud Bus自动刷新配置



推荐阅读
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • 解决TensorFlow CPU版本安装中的依赖问题
    本文记录了在安装CPU版本的TensorFlow过程中遇到的依赖问题及解决方案,特别是numpy版本不匹配和动态链接库(DLL)错误。通过详细的步骤说明和专业建议,帮助读者顺利安装并使用TensorFlow。 ... [详细]
  • 探索新一代API文档工具,告别Swagger的繁琐
    对于后端开发者而言,编写和维护API文档既繁琐又不可或缺。本文将介绍一款全新的API文档工具,帮助团队更高效地协作,简化API文档生成流程。 ... [详细]
  • 本文探讨了在构建应用程序时,如何对不同类型的数据进行结构化设计。主要分为三类:全局配置、用户个人设置和用户关系链。每种类型的数据都有其独特的用途和应用场景,合理规划这些数据结构有助于提升用户体验和系统的可维护性。 ... [详细]
  • Linux中的yum安装软件
    yum俗称大黄狗作用:解决安装软件包的依赖关系当安装依赖关系的软件包时,会将依赖的软件包一起安装。本地yum:需要yum源,光驱挂载。yum源:(刚开始查看yum源中的内容就是上图 ... [详细]
  • 鼠标悬停出现提示信息怎么做
    概述–提示:指启示,提起注意或给予提醒和解释。在excel中会经常用到给某个格子增加提醒信息,比如金额提示输入数值或最大长度值等等。设置方式也有多种,简单的,仅为单元格插入批注就可 ... [详细]
  • 气象对比分析
    本文探讨了不同地区和时间段的天气模式,通过详细的图表和数据分析,揭示了气候变化的趋势及其对环境和社会的影响。 ... [详细]
  • 探讨 HDU 1536 题目,即 S-Nim 游戏的博弈策略。通过 SG 函数分析游戏胜负的关键,并介绍如何编程实现解决方案。 ... [详细]
  • 深入解析动态代理模式:23种设计模式之三
    在设计模式中,动态代理模式是应用最为广泛的一种代理模式。它允许我们在运行时动态创建代理对象,并在调用方法时进行增强处理。本文将详细介绍动态代理的实现机制及其应用场景。 ... [详细]
  • 深入理解ExtJS:从入门到精通
    本文详细介绍了ExtJS的功能及其在大型企业前端开发中的应用。通过实例和详细的文件结构解析,帮助初学者快速掌握ExtJS的核心概念,并提供实用技巧和最佳实践。 ... [详细]
  • 通常情况下,修改my.cnf配置文件后需要重启MySQL服务才能使新参数生效。然而,通过特定命令可以在不重启服务的情况下实现配置的即时更新。本文将详细介绍如何在线调整MySQL配置,并验证其有效性。 ... [详细]
  • 本文详细介绍了在XAMPP环境中如何修改Apache和MySQL的默认端口号,并确保WordPress能够正常访问。同时,提供了针对Go语言社区和Golang开发者的相关建议。 ... [详细]
  • 本文详细介绍了在不同操作系统中查找和设置网卡的方法,涵盖了Windows系统的具体步骤,并提供了关于网卡位置、无线网络设置及常见问题的解答。 ... [详细]
  • 本文详细介绍了一种通过MySQL弱口令漏洞在Windows操作系统上获取SYSTEM权限的方法。该方法涉及使用自定义UDF DLL文件来执行任意命令,从而实现对远程服务器的完全控制。 ... [详细]
  • Spring Cloud学习指南:深入理解微服务架构
    本文介绍了微服务架构的基本概念及其在Spring Cloud中的实现。讨论了微服务架构的主要优势,如简化开发和维护、快速启动、灵活的技术栈选择以及按需扩展的能力。同时,也探讨了微服务架构面临的挑战,包括较高的运维要求、分布式系统的复杂性、接口调整的成本等问题。最后,文章提出了实施微服务时应遵循的设计原则。 ... [详细]
author-avatar
心忆泪痕
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有