【Spring Cloud】分布式配置动态刷新

25 篇文章 0 订阅


上一篇博客讲了一下SpringCloud的分布式配置: 【Spring Cloud】分布式配置,但是存在一些问题,如:如何动态刷新?

问题

  • 目前已经掌握了Spring Cloud Config配置中心的的用法,但是当重新修改配置文件提交后,客户端获取的仍然是修改前的信息,需要客户端重启才可以获取最新的信息。
  • 因此我们需要客户端能够动态进行更新,幸好Spring Cloud官方已经给出方案,所以我们只需要使用就行了。

解决方案

1.使用Spring Boot Actuator监控接口【不推荐】

  • Spring Boot Actuator可以帮助你监控和管理Spring Boot应用,比如健康检查、审计、统计和HTTP追踪等。
  • 所有的这些特性可以通过JMX或者HTTP endpoints来获得。
  • 根据应用依赖和配置自动创建出来的监控和管理端点。通过这些端点,我们可以实时获取系统应用的各项监控指标。

总结成一句话:Spring Boot Actuator是监控系统健康情况的工具。

流程图

在这里插入图片描述

使用Spring Boot Actuator的步骤

  • 第一步:在config-client中添加POM依赖。

    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    
  • 第二步:添加配置信息

    management:
    	endpoints:
    		web:
    			exposure:
    				include: "refresh"
    
  • 第三步:添加@RefreshScope注解,启动demo-gateway项目。

  • 第四步:修改Git仓库demo-gateway-dev.properties文件中eureka.port的值。

  • 第五步:使用POSTMAN 通过POST请求发送到http://localhost:8085/actuator/refresh

  • 第六步:访问http://localhost:8085/port 可以看到配置内容被更新了

2.Spring Cloud Bus

第一种方案问题

  • 第一种解决方案中,我们客户端发现每次获取最新配置都需要手动进行刷新,如果少的的话还可以使用,但是多的话就比较繁琐了,虽然我们可以使用类似Github的WebHook的工具。
  • WebHook是当某个事件发生时,通过发送http post请求的方式来通知信息接收方。
  • 但是当客户端越来越多的时候WebHook已经不好使用了,每次新增客户端都需要更改WebHook会显得很麻烦,Spring Cloud官方给出了非常好的解决方案。
  • Spring Cloud Bus可以完美解决这一问题。

Spring Cloud Bus

  • Spring Cloud Bus 是 Spring Cloud 体系内的消息总线,用来连接分布式系统的所有节点。Spring Cloud Bus 将分布式的节点用轻量级的消息代理(RabbitMQ、Kafka)连接起来。可以通过消息代理广播配置文件的更改,或服务之间的通讯,也可以用于监控。解决了微服务数据变更,及时同步的问题。
  • 大家可以将它理解为管理和传播所有分布式项目中的消息既可,其实本质是利用了MQ的广播机制在分布式的系统中传播消息,利用bus的机制可以做很多的事情,其中配置中心客户端刷新就是典型的应用场景之一。

流程图

在这里插入图片描述

Spring Cloud Bus实现客户端刷新的步骤

  1. 提交代码触发post给Server端发送bus/refresh
  2. Server端接收到请求并发送给Spring Cloud Bus
  3. Spring Cloud Bus接到消息并通知给其它客户端
  4. 其它客户端接收到通知,请求Server端获取最新配置
  5. 全部客户端均获取到最新的配置

开发准备

  • Spring Cloud Bus 主要使用MQ进行消息的发送与接收。
  • 可以根据情况来进行选择,主要使用的是哪个MQ就用哪一个就行了。
  • 这里我们就用RabbitMQ作为示例来进行讲解。
  • 关于RabbitMQ的内容,可以看我之前的博客内容

实现

1. 在config-server中添加依赖
		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
2.在config-server中添加配置
application.yml
server:
  port: 7900
spring:
  application:
    name: demo-config-server
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/xxxx/env_project.git
          search-paths: config-file
    bus:
      trace:
        enabled: true
  rabbitmq:
    host: 192.168.29.80
    port: 5672
    username: admin
    password: admin
eureka:
  client:
    service-url:
      defaultZone: http://192.168.2.220:7776/eureka/
management:
  endpoints:
    web:
      exposure:
        include: bus-refresh
bootstrap.yml
encrypt:
  key: demo-config-server
3.在config-client中添加依赖
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
4.在config-client中添加配置
application.yml
server:
  port: 8085
eureka:
  client:
    service-url:
      defaultZone: http://192.168.2.220:7776/eureka/
spring:
  rabbitmq:
    host: 192.168.29.80
bootstrap.yml
spring:
  cloud:
    config:
      uri: http://localhost:7900
      profile: dev
      label: dev
      name: demo-gateway
  application:
    name: demo-config-client

在这里插入图片描述在这里插入图片描述

Spring Cloud是一个用于构建分布式系统的开发工具集合,它基于Spring Boot框架,提供了一系列的组件和工具,用于简化分布式系统的开发和部署。Spring Cloud提供了诸多功能,包括服务注册与发现、负载均衡、断路器、配置管理、消息总线等,可以帮助开发者快速构建可靠、弹性和高可用的分布式系统。 以下是Spring Cloud的一些核心组件和功能: 1. 服务注册与发现:Spring Cloud提供了服务注册与发现的功能,通过集成Eureka、Consul等注册中心,可以实现服务的自动注册与发现。 2. 负载均衡:Spring Cloud通过集成Ribbon组件,实现了负载均衡的功能,可以根据配置的负载均衡策略,将请求分发到多个服务实例中。 3. 断路器:Spring Cloud集成了Hystrix组件,实现了断路器模式,可以在服务调用失败或超时时进行降级处理,保证系统的稳定性。 4. 配置管理:Spring Cloud提供了统一的配置管理功能,通过集成Config Server组件,可以将应用的配置信息集中管理,并支持动态刷新配置。 5. 消息总线:Spring Cloud通过集成Spring Cloud Bus组件,实现了消息总线的功能,可以在分布式系统中实现配置动态刷新和事件的广播。 6. 链路追踪:Spring Cloud集成了Zipkin组件,可以实现分布式系统的链路追踪,帮助开发者快速定位和解决问题。 7. 服务网关:Spring Cloud提供了Zuul组件,可以实现统一的API网关,对外暴露统一的接口,并提供路由、过滤等功能。 8. 分布式事务:Spring Cloud通过集成Seata等组件,可以实现分布式事务的管理,保证多个服务之间的数据一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值