SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务)

这篇具有很好参考价值的文章主要介绍了SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在上文讲到,在发布服务的场景下通过MQ利用“下线”这一事件驱动去更新Ribbon缓存,搭配上更改Eureka的两个配置信息成功实现了Eureka服务下线无感知。当时就说这个过程中存在一个非常鸡肋的地方,就是在通知前要去更改Eureka的配置参数。本文将通过配置热更新搭配SpringCloudBus消息总线的方式来将其解决。

1.痛点

发布服务场景特殊,如果关闭Eureka-Server三级缓存、对Eureka-Client的参数进行修改势必会对高可用性产生影响。如果可以在这个过程中进行配置热更新,在下线旧服务发布新服务这一特定情况下对Eureka配置进行更改做到既支持服务的无感知下线,又不影响非此场景下Eureka的性能就好了。

2.解决方案

使用SpringCloudConfig+Actuator+Git来实现配置热更新,服务发布的场景下热更新配置,人为保证Eureka数据强一致用来实现服务下线无感知。服务发布完恢复Eureka原生配置保证高可用。总结来看就是在对服务数据一致性有要求的情况下,去做到一致性;没有此要求的情况下去还原高可用
SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务),SpringCloud体系,git,eureka,云原生,ribbon,springcloud,rabbitmq

3.具体实现

3.1搭建热配置服务

SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务),SpringCloud体系,git,eureka,云原生,ribbon,springcloud,rabbitmq
引入依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-server</artifactId>
        <version>2.2.3.RELEASE</version>
    </dependency>
</dependencies>

3.2编写配置文件

#服务端口
server:
  port: 8086
  #指定应用名称
spring:
  application:
    name: config-center
  cloud:
    config:
      label: master #配置git仓库分支
      server:
        git:
          uri: https://gitee.com/lazy-sheep-java/cloud-config.git #配置git仓库地址
          search-paths: cloud-config/application.yml #配置仓库路径
          #username:  git_username #访问git仓库的用户名,公开仓库不配置用户名
          #password: git_password #访问git仓库的用户密码,公开仓库不配置密码

3.3搭建版本控制仓库

创建一个yml配置文件
SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务),SpringCloud体系,git,eureka,云原生,ribbon,springcloud,rabbitmq
application-dev.yml文件内容
声明:该文件内容是和项目中的参数一致的,没有作出更改

eureka:
    client:
      registry-fetch-interval-seconds: 3
      #每次获取全量注册信息
      disable-delta: true
    server:
      #三级缓存开关
      useReadOnlyResponseCache: false

3.4Eureka-Client引入以下依赖

<!-- spring cloud config 客户端 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

3.5Eureka-Client微服务编写以下配置bootstrap.yml提前加载

spring:
  application:
    name: payment-service
  cloud:
    config:
      uri: http://localhost:8086    #config服务端的地址
      label: master
      profile: dev              #开发环境

并在application.yml中配置actuator支持

#Actuator
management:
  endpoint:
    shutdown:
      enabled: false
  endpoints:
    web:
      exposure:
        include: "*"

3.6分别编写测试Controller

@RestController
@RefreshScope
public class TryConfigController {
    @Value("${eureka.client.registry-fetch-interval-seconds}")
    private String seconds;

    @GetMapping("info")
    public String info(){
        return seconds;
    }
}
@RestController
@RefreshScope
public class TryController {
    @Value("${eureka.server.useReadOnlyResponseCache}")
    private String flag;

    @GetMapping("info")
    public String info(){
        return flag;
    }
}

3.7测试效果

到此时Eureka-Client端application.yml中的核心配置参数eureka.client.registry-fetch-interval-seconds的值为10秒,并且Eureka-server端三级缓存为开启状态
SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务),SpringCloud体系,git,eureka,云原生,ribbon,springcloud,rabbitmq

我们启动所有微服务,访问测试Controller的接口,观察该属性的值:
SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务),SpringCloud体系,git,eureka,云原生,ribbon,springcloud,rabbitmqSpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务),SpringCloud体系,git,eureka,云原生,ribbon,springcloud,rabbitmq
可以看到为10S,与此同时观察控制台日志输出情况,Eureka-Client拉取Eureka-Server端的服务列表时间间隔:SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务),SpringCloud体系,git,eureka,云原生,ribbon,springcloud,rabbitmq
可见此时Eureka配置参数还与该模块下的application.yml保持一致!
在不全程不重启微服务的前提下,当我们向存在git仓库中的application-dev.yml文件进行更改(关闭了三级缓存,将Eureka-Client从Eureka-server拉取服务列表的时间变为2S),并且push上去。
SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务),SpringCloud体系,git,eureka,云原生,ribbon,springcloud,rabbitmq
SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务),SpringCloud体系,git,eureka,云原生,ribbon,springcloud,rabbitmq
此时分别调用Actuator提供的动态刷新接口去刷新对应微服务的热配置http://localhost:8088/actuator/refresh,http://localhost:10086/actuator/refresh,刷新成功并返回了如下结果:
SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务),SpringCloud体系,git,eureka,云原生,ribbon,springcloud,rabbitmq
SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务),SpringCloud体系,git,eureka,云原生,ribbon,springcloud,rabbitmq
此时调用测试接口,测试Eureka配置属性变化:
SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务),SpringCloud体系,git,eureka,云原生,ribbon,springcloud,rabbitmq
SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务),SpringCloud体系,git,eureka,云原生,ribbon,springcloud,rabbitmq
这说明不重启情况下完成了配置热更新,为了进一步观察效果,直接去日志中查看:
SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务),SpringCloud体系,git,eureka,云原生,ribbon,springcloud,rabbitmq
这说明热更新成功实现!

3.8下线场景压测

基于此,去做Eureka服务下线感知情况的压测,调用下线接口后立即压测,观察下线服务是否被负载均衡到:
SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务),SpringCloud体系,git,eureka,云原生,ribbon,springcloud,rabbitmq
立即使用Jmeter压测,可以看到异常情况是没有的:
SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务),SpringCloud体系,git,eureka,云原生,ribbon,springcloud,rabbitmq
观察控制台,下线服务实例是否被负载均衡到?
8083
SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务),SpringCloud体系,git,eureka,云原生,ribbon,springcloud,rabbitmq
8081
SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务),SpringCloud体系,git,eureka,云原生,ribbon,springcloud,rabbitmq
8084
SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务),SpringCloud体系,git,eureka,云原生,ribbon,springcloud,rabbitmq
可见完全没问题,这时就可以kill掉下线的服务实例,去发布新服务了,当新服务发布完毕又去push配置来热更新还原原生配置保证Eureka高可用:
SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务),SpringCloud体系,git,eureka,云原生,ribbon,springcloud,rabbitmq
SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务),SpringCloud体系,git,eureka,云原生,ribbon,springcloud,rabbitmq
SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务),SpringCloud体系,git,eureka,云原生,ribbon,springcloud,rabbitmq

4.SpringCloudBus优化

Spring-Cloud-Bus:广播配置文件的更改或服务的监控管理,用于实现微服务的监控和相互通信,配合SpringCloudConfig使用,实现配置的动态刷新。当一个服务刷新数据时,将信息放入消息总线中,其他监听该消息总线的服务就能得到通知并更新自身的配置

整个流程下来相信大家可以深刻体会到,每次Git中的配置文件发生更改,我都要去基于属性变更的微服务去调用http://localhost:对应端口/actuator/refresh发送POST请求,如果服务集群部署数量较少那运维工作量还不算大,但反之就有点折磨运维老哥了。
基于此,可以使用SpringCloudBus的广播模式将配置文件更新的动作广播出去,让受其管理的微服务、集群都去刷新配置
具体实现如下:
1.在目标微服务中配置好mq(如文章上面所示),并引入Spring-Cloud-Bus的依赖

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

2.当Git中的配置文件更新,直接调用接口:http://localhost:任选一个服务列表中的端口/actuator/bus-refresh POST,正常情况会返回一个204
SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务),SpringCloud体系,git,eureka,云原生,ribbon,springcloud,rabbitmq
即完成受Spring-Cloud-Bus管控的所有微服务的配置热更新:
SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务),SpringCloud体系,git,eureka,云原生,ribbon,springcloud,rabbitmq
出现Keys refreshed[…]说明更新配置广播完毕,所有的目标微服务的配置都完成了热更新!一次调用更新所有,大大简化了操作

5.写到最后

以下是项目开源地址,欢迎大家体验:项目地址请点我!
SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务),SpringCloud体系,git,eureka,云原生,ribbon,springcloud,rabbitmq文章来源地址https://www.toymoban.com/news/detail-817291.html

到了这里,关于SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第六节:Git标签(关键词:git tag、git show、创建、删除、查看、推送标签)

    本节涉及Git命令 git tag :列出所有标签 git tag tagname commitID :创建标签 git tag -a tagname -m \\\'message\\\' commitID :创建带有注释的标签 git show tagname :查看某个标签细节 git tag -d :删除标签 git psuh origin --tags :推送所有标签 git psuh origin tagname :推送某个标签 git checkout tagname :检出标签

    2024年02月07日
    浏览(59)
  • Eureka注册中心实现原理

            在实际生产环境中,为了防止微服务模块由于单个服务节点阻塞挂掉而导致整体服务雪崩,微服务模块需要部署多个服务节点,而当其他微服务模块代码在调用某服务模块时,需要写入被调用的服务节点的ip和端口,但多个服务节点的ip端口不一致,如何写入我们

    2024年02月03日
    浏览(32)
  • Eureka 本机集群实现

    距离上次发布博客已经一年多了,主要就是因为考研,没时间学习技术的内容,现在有时间继续完成关于代码方面的心得,希望跟大家分享。 今天在做一个 Eureka 的集群实现,我是在本电脑上跑的,感觉这个挺有意思,跟大家介绍一下。 首先介绍一下大概的环境背景,自己使

    2024年01月17日
    浏览(14)
  • Git 分支管理:优化版本控制与应急处理的关键策略

    在 Git 中,分支是主仓库的新/独立版本。 假设你有一个大型项目,需要对其进行设计更新。 没有使用 Git 时: 复制所有相关文件以避免影响实时版本 开始进行设计工作,并发现代码依赖于其他文件中的代码,这些文件也需要更改! 复制相关文件,确保每个文件依赖项引用正

    2024年03月09日
    浏览(48)
  • 第三节:Git分支管理(关键词:git branch、git checkout、git diff、git merge、查看、创建、切换、对比分支)

    本节涉及Git命令 git branch :列出全部分支 git branch name :创建分支 git checkout name :切换分支 git diff branch1 branch2 :对比两个分支 git diff --quiet branch1 branch2 :对比两个分支是否存在差异,但不显示细节 git diff branch1 branch2 filename :对比两个分支中某个具体文件差异 git merge :合并

    2023年04月08日
    浏览(34)
  • SpringBoot开启 Actuator springboot开启actuator监控信息

    官网文档: https://docs.spring.io/spring-boot/docs/2.1.5.RELEASE/actuator-api/html/ 2.1.5.RELEASE 为对应springboot版本号 include: \\\"*\\\" 表示 公开所有端点 include: \\\"health,metrics,threaddump\\\" 表示只公开这三个 health,metrics,threaddump 端点 所有可选的端点及说明 端点 作用 “*” 公开全部 health 提供应用程序的健

    2024年01月22日
    浏览(50)
  • SpringCloud集成Eureka并实现负载均衡

    辗转两家公司也算工作了大半年,有幸见识过很多微服务架构,比如Dubbo+Redis的组合;Dubbo+Zookepper的组合;SpringCloud+Eureka的组合;SpringCloud+Nacos的组合… 每一种组合都有属于自己的故事。 笔者认为:流行的不一定是最好的,如果只学习最流行的技术,这对以后的发展是很受限

    2024年02月05日
    浏览(32)
  • spring boot actuator 禁用后,/actuator仍可正常访问

    项目上线后,被测试出actuator没有关闭,关闭后,仍可正常访问/actuator端点,只是类似/actuator/env这样的无法访问,现在就想把/actuator端点也给禁用了。 spring boot 2.x关闭actuator配置,关闭后,仍可正常访问/actuator端点 说明spring boot 2.x无法通过配置的方式禁用/actuator端点 大部分

    2024年01月19日
    浏览(29)
  • 微服务springcloud 03.Eureka实现高可用

    01.运行时候项目图 存在两个item service,和两个Eureka注册中心 02.在已有的项目中扩展service服务数量(item service的数量变成两个) 第一步:配置item service的启动参数 启动参数的优先级要高于yml文件的优先级 具体参数是:–server.port=8001 name是修改启动后项目名称,修改为sp02-i

    2024年02月09日
    浏览(27)
  • 使用 @FeignClient 实现不使用 Eureka 的服务调用

    在微服务架构中,服务间的通信是非常重要的。通常情况下,我们使用Eureka作为服务发现和注册中心来实现服务之间的调用。然而,有时候我们可能不想使用Eureka作为服务发现的解决方案,而是希望使用其他方式来实现服务调用。在这种情况下,我们可以利用Spring Cloud中的

    2024年02月09日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包