• 消息总线


    如何实现对配置信息的实时更新

    消息代理中间件可以将消息路由到一个或多个目的地。利用这个功能,我们就能完美的解决该问题

    RabbitMQ实现

     config-client修改pom.xml增加spring-cloud-starter-bus-amqp模块

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

    在配置文件中增加关于RabbitMQ的连接和用户信息

    spring.rabbitmq.host=localhost
    spring.rabbitmq.port=5672
    spring.rabbitmq.username=springcloud
    spring.rabbitmq.password=123456

    启动config-server,再启动两个config-clien(分别在不同的端口上)

    可以在config-client-eureka中的控制台中看到如下内容,在启动时候,客户端程序多了一个/bus/refresh请求。

    o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/bus/refresh],methods=[POST]}" onto public void org.springframework.cloud.bus.endpoint.RefreshBusEndpoint.refresh(java.lang.String)
    • 先访问两个config-client的/from请求,会返回当前config-repo/didispace-dev.properties中的from属性。
    • 接着,我们修改config-repo/didispace-dev.properties中的from属性值,并发送POST请求到其中的一个/bus/refresh
    • 最后,我们再分别访问启动的两个config-client的/from请求,此时这两个请求都会返回最新的config-repo/didispace-dev.properties中的from属性。

    上面已经能够通过Spring Cloud Bus来实时更新总线上的属性配置了。

    原理分析

    我们通过使用Spring Cloud Bus与Spring Cloud Config的整合,并以RabbitMQ作为消息代理,实现了应用配置的动态更新。

    访问/bus/refresh接口。此时,“Service A”的实例3就会将刷新请求发送到消息总线中,该消息事件会被“Service A”的实例1和实例2从总线中获取到,并重新从Config Server中获取他们的配置信息,从而实现配置信息的动态更新。

    指定刷新范围

    通过向服务实例请求Spring Cloud Bus的/bus/refresh接口,从而触发总线上其他服务实例的/refresh。但是有些特殊场景下(比如:灰度发布),我们希望可以刷新微服务中某个具体实例的配置。

    Spring Cloud Bus对这种场景也有很好的支持:/bus/refresh接口还提供了destination参数,用来定位具体要刷新的应用程序。比如,我们可以请求/bus/refresh?destination=customers:9000,此时总线上的各应用实例会根据destination属性的值来判断是否为自己的实例名,若符合才进行配置刷新,若不符合就忽略该消息

    destination参数除了可以定位具体的实例之外,还可以用来定位具体的服务。定位服务的原理是通过使用Spring的PathMatecher(路径匹配)来实现,比如:/bus/refresh?destination=customers:**,该请求会触发customers服务的所有实例进行刷新

     架构优化

    在之前的架构中,服务的配置更新需要通过向具体服务中的某个实例发送请求,再触发对整个服务集群的配置更新。虽然能实现功能,但是这样的结果是,我们指定的应用实例就会不同于集群中的其他应用实例,这样会增加集群内部的复杂度,不利于将来的运维工作,比如:我们需要对服务实例进行迁移,那么我们不得不修改Web Hook中的配置等。所以我们要尽可能的让服务集群中的各个节点是对等的

    我们主要做了这些改动:

    1. 在Config Server中也引入Spring Cloud Bus,将配置服务端也加入到消息总线中来。
    2. /bus/refresh请求不在发送到具体服务实例上,而是发送给Config Server,并通过destination参数来指定需要更新配置的服务或实例。

    我们的服务实例就不需要再承担触发配置更新的职责。同时,对于Git的触发等配置都只需要针对Config Server即可,从而简化了集群上的一些维护工作。

     

  • 相关阅读:
    Linux--awk命令详解
    【python】将txt文本内容导入list列表
    【python】readlines( )函数的用法,读取文件内容
    【python】使用jieba分词并导出txt
    【python】module 'jieba' has no attribute 'cut'解决办法
    【python】UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position...解决办法
    pip安装python模块时报错,安装失败的解决办法,超详细!(Read timed out.等)
    【热力图】区域地图热力图,百度地图api
    【XAMPP】 Error: Apache shutdown unexpectedly. 11:00:50  [Apache] 解决办法详细
    Linux进入文件夹,查看文件,返回上级目录,查看列表文件(Ubuntu)
  • 原文地址:https://www.cnblogs.com/zhangjianbin/p/6263246.html
Copyright © 2020-2023  润新知