上一篇文章,留了一个悬念,Config Client 实现配置的实时更新,我们可以使用 /refresh 接口触发,如果所有客户端的配置的更改,都需要手动触发客户端 /refresh ,当服务越来越多的时候,那岂不是维护成本很高,显然不太合适,而使用Spring Cloud Bus 消息总线实现方案,可以优雅的解决以上问题,那就是通过消息代理中间件RabbitMQGitWebhooks來触发配置的更新,那具体是怎么实现的,我会通过图文形式介绍。

Spring Cloud Bus

Spring Cloud Bus 将分布式系统的节点通过轻量级消息代理连接起来。用于在集群中传播状态更改(例如配置更改事件)或其他管理指令。Spring Cloud Bus 的一个核心思想是通过分布式的启动器对 Spring Boot 应用进行扩展,也可以用来建立一个或多个应用之间的通信频道。目前唯一实现的方式是用 AMQP 消息代理作为通道,但是相同的基本功能集(还有一些取决于传输)在其他传输的路线图上

消息总线

消息总线是一种通信工具,可以在机器之间互相传输消息、文件等。消息总线扮演着一种消息路由的角色,拥有一套完备的路由机制来决定消息传输方向。发送段只需要向消息总线发出消息而不用管消息被如何转发。
Spring cloud bus 通过轻量消息代理连接各个分布的节点。管理和传播所有分布式项目中的消息,本质是利用了MQ的广播机制在分布式的系统中传播消息,目前常用的有KafkaRabbitMQ
下面是一个配置中心刷新配置的例子

[图片来源于网络如有侵权请私信删除]

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

消息代理

消息代理(Message Broker)是一种消息验证、传输、路由的架构模式。消息代理是一个中间件产品,它的核心是一个消息的路由程序,用来实现接收和分发消息,并根据设定好的消息处理流来转发给正确的应用。它包括独立的通信和消息传递协议,能够实现组织内部和组织间的网络通信。设计代理的目的就是为了能够从应用程序中传入消息,并执行一些特别的操作。

和组织间的网络通信。设计代理的目的就是为了能够从应用程序中传入消息,并执行一些特别的操作。
现有的消息代理开源产品:
- ActiveMQ
- Kafka
- RabbitMQ
- RocketMQ

目前Spring Cloud Bus 支持 RabbitMQKafka,spring-cloud-starter-bus-amqpspring-cloud-starter-bus-kafka

RabbitMQ简介

RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

AMQP,即Advanced message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。

AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。

Github:https://github.com/rabbitmq
官网地址:http://www.rabbitmq.com

安装RabbitMQ

安装RabbitMQ 可以参考之前的文章

CentOs7.3 搭建 RabbitMQ 3.6 单机服务:
https://segmentfault.com/a/1190000010693696

CentOs7.3 搭建 RabbitMQ 3.6 Cluster 集群服务:
https://segmentfault.com/a/1190000010702020

Spring Boot 中使用 RabbitMQ:
https://segmentfault.com/a/1190000011577243

准备工作

以下项目修改不做过多解释,部分代码不再展示,请阅读上篇文章,Spring Cloud(十)高可用的分布式配置中心 Spring Cloud Config 中使用 Refresh:http://www.ymq.io/2017/12/23/spring-cloud-config-eureka-refresh/

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

  • 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 Server

在项目spring-cloud-config-server 进行以下操作

添加依赖

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

添加配置

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

RabbitMQymq用户是手动创建的,具体阅读上面 安装RabbitMQ 部分


#关闭刷新安全认证
management.security.enabled=falsespring.rabbitmq.host=192.168.252.126
spring.rabbitmq.port=5672
spring.rabbitmq.username=ymq
spring.rabbitmq.password=123456

Config Client

修改第上一篇文章项目

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

添加依赖

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

添加配置

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

spring.rabbitmq.host=192.168.252.126
spring.rabbitmq.port=5672
spring.rabbitmq.username=ymq
spring.rabbitmq.password=123456

测试服务

启动RabbitMQ

启动MQ服务

$ service rabbitmq-server start
Redirecting to /bin/systemctl start  rabbitmq-server.service

查看MQ状态

$ service rabbitmq-server status
[root@node6 rabbitmq]# service rabbitmq-server status
Redirecting to /bin/systemctl status  rabbitmq-server.service
● rabbitmq-server.service - RabbitMQ brokerLoaded: loaded (/usr/lib/systemd/system/rabbitmq-server.service; disabled; vendor preset: disabled)Active: active (running) since Fri 2017-12-29 17:44:10 CST; 9min agoProcess: 2814 ExecStop=/usr/sbin/rabbitmqctl stop (code=exited, status=0/SUCCESS)Main PID: 2948 (beam)Status: "Initialized"CGroup: /system.slice/rabbitmq-server.service├─2948 /usr/lib64/erlang/erts-8.0.3/bin/beam -W w -A 64 -P 1048576 -t 5000000 -stbt db -zdbbl 32000 -K true -- -root /usr/lib64/erlang -progname erl -- -home /var/lib/rabbitmq -- -pa /usr...├─3131 /usr/lib64/erlang/erts-8.0.3/bin/epmd -daemon├─3233 erl_child_setup 1024├─3240 inet_gethost 4└─3241 inet_gethost 4Dec 29 17:44:08 node6 rabbitmq-server[2948]: RabbitMQ 3.6.10. Copyright (C) 2007-2017 Pivotal Software, Inc.
Dec 29 17:44:08 node6 rabbitmq-server[2948]: ##  ##      Licensed under the MPL.  See http://www.rabbitmq.com/
Dec 29 17:44:08 node6 rabbitmq-server[2948]: ##  ##
Dec 29 17:44:08 node6 rabbitmq-server[2948]: ##########  Logs: /var/log/rabbitmq/rabbit@node6.log
Dec 29 17:44:08 node6 rabbitmq-server[2948]: ######  ##        /var/log/rabbitmq/rabbit@node6-sasl.log
Dec 29 17:44:08 node6 rabbitmq-server[2948]: ##########
Dec 29 17:44:08 node6 rabbitmq-server[2948]: Starting broker...
Dec 29 17:44:10 node6 rabbitmq-server[2948]: systemd unit for activation check: "rabbitmq-server.service"
Dec 29 17:44:10 node6 systemd[1]: Started RabbitMQ broker.
Dec 29 17:44:10 node6 rabbitmq-server[2948]: completed with 6 plugins.
[root@node6 rabbitmq]# 

启动项目

按照顺序依次启动项目

  • 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://127.0.0.1:8761/

Exchanges

任何发送到Fanout Exchange 的消息都会被转发到与该Exchange绑定(Binding)的所有springCloudBus 队列Queue上。

检查Queues

浏览器打开 :http://192.168.252.128:15672/

修改配置

修改Git仓库配置,在 content=hello dev 后面加上 Spring Cloud Bus Test

查看 Config Server

通过 Postman 发送 GET 请求到:http://localhost:8888/springCloudConfig/dev/master 查看 Config Server 是否是最新的值

查看 Config Client

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

发现没有得到最新的值

因为我们没有主动触发Config Server bus/refresh接口

刷新配置

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

注意是 PSOT 请求

http://localhost:8888/bus/refresh” title=”” />

三个Config Client 客户端控制台,分别会打印以下内容意思就是,收到远程更新请求,config.client,KEYS 刷新, keycontent

2017-12-29 18:38:49.023  INFO 28944 --- [jeTgrKRGzgj9g-1] o.s.cloud.bus.event.RefreshListener      : Received remote refresh request. Keys refreshed [config.client.version, content]
2017-12-29 18:38:49.025  INFO 28944 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_EUREKA-PROVIDER/localhost:eureka-provider:8081: registering service...
2017-12-29 18:38:49.035  INFO 28944 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_EUREKA-PROVIDER/localhost:eureka-provider:8081 - registration status: 204
2017-12-29 18:38:49.067  INFO 28944 --- [jeTgrKRGzgj9g-1] o.s.a.r.c.CachingConnectionFactory       : Created new connection: SpringAMQP#31e87320:0/SimpleConnection@39151d4e [delegate=amqp://ymq@192.168.252.126:5672/, localPort= 64885]

再次查看 Config Client

访问:http://localhost:8081/ ,http://localhost:8082/ ,http://localhost:8083/ 已经刷新了配置

扩展阅读

Git webhooks

现在虽然可以不用重启服务就更新配置了,但还是需要我们手动操作,这样还是不可取的。所以,这里就要用到Git的webhooks来达到自动更新配置。

打开git上配置仓库的地址,添加webhooks,上面Payload URL我写的域名,当然我没有部署,上面的Payload URL就填写我们的配置中心触发刷新的地址,当然这里不能写localhost啦,要外网访问地址才行。

还有这里面有个Secret的秘钥验证,如果这里填写的话,在配置文件上要写上encrypt.key与之对应。

局部刷新

某些场景下(例如灰度发布),我们可能只想刷新部分微服务的配置,此时可通过/bus/refresh端点的destination参数来定位要刷新的应用程序。

例如:/bus/refresh?destination=customers:8000,这样消息总线上的微服务实例就会根据destination参数的值来判断是否需要要刷新。其中,customers:8000指的是各个微服务的ApplicationContext ID

destination参数也可以用来定位特定的微服务。例如:/bus/refresh?destination=customers:**,这样就可以触发customers微服务所有实例的配置刷新。

跟踪总线事件

一些场景下,我们可能希望知道Spring Cloud Bus事件传播的细节。此时,我们可以跟踪总线事件(RemoteApplicationEvent的子类都是总线事件)。

跟踪总线事件非常简单,只需设置spring.cloud.bus.trace.enabled=true,这样在/bus/refresh端点被请求后,访问/trace端点就可获得类似如下的结果:

发送 GET请求到:http://localhost:8888/trace

[{"timestamp": 1514543931362,"info": {"method": "GET","path": "/eureka-provider/dev/master","headers": {"request": {"accept": "application/json, application/*+json","user-agent": "Java/1.8.0_112","host": "localhost:8888","connection": "keep-alive"},"response": {"X-Application-Context": "config-server:8888","Content-Type": "application/json;charset=UTF-8","Transfer-Encoding": "chunked","Date": "Fri, 29 Dec 2017 10:38:51 GMT","status": "200"}},"timeTaken": "6002"}},{"timestamp": 1514543927451,"info": {"method": "GET","path": "/eureka-provider/dev/master","headers": {"request": {"accept": "application/json, application/*+json","user-agent": "Java/1.8.0_112","host": "localhost:8888","connection": "keep-alive"},"response": {"X-Application-Context": "config-server:8888","Content-Type": "application/json;charset=UTF-8","Transfer-Encoding": "chunked","Date": "Fri, 29 Dec 2017 10:38:47 GMT","status": "200"}},"timeTaken": "4927"}},{"timestamp": 1514543925254,"info": {"method": "GET","path": "/eureka-provider/dev/master","headers": {"request": {"accept": "application/json, application/*+json","user-agent": "Java/1.8.0_112","host": "localhost:8888","connection": "keep-alive"},"response": {"X-Application-Context": "config-server:8888","Content-Type": "application/json;charset=UTF-8","Transfer-Encoding": "chunked","Date": "Fri, 29 Dec 2017 10:38:45 GMT","status": "200"}},"timeTaken": "2862"}},{"timestamp": 1514543923565,"info": {"method": "POST","path": "/bus/refresh","headers": {"request": {"cache-control": "no-cache","postman-token": "0e497ec1-0c03-4dc2-bb61-ce2a266227d3","user-agent": "PostmanRuntime/7.1.1","accept": "*/*","host": "127.0.0.1:8888","accept-encoding": "gzip, deflate","content-length": "0","connection": "keep-alive"},"response": {"X-Application-Context": "config-server:8888","status": "200"}},"timeTaken": "6616"}}
]

源码下载

GitHub:https://github.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-config-bus-rabbitMQ

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

Contact

  • 作者:鹏磊
  • 出处:http://www.ymq.io
  • Email:admin@souyunku.com
  • 版权归作者所有,转载请注明出处
  • Wechat:关注公众号,搜云库,专注于开发技术的研究与知识分享

Spring Cloud(十一)高可用的分布式配置中心 Spring Cloud Bus 消息总线集成(RabbitMQ)相关推荐

  1. 史上最简单的SpringCloud教程 | 第七篇: 高可用的分布式配置中心(Spring Cloud Config)(Finchley版本)

    转载请标明出处: http://blog.csdn.net/forezp/article/details/81041045 本文出自方志朋的博客 个人博客纯净版:https://www.fangzhi ...

  2. springCloud学习-高可用的分布式配置中心(Spring Cloud Config)

    1.简介 高可用的分布式配置中心,即将配置中心做成一个微服务,将其集群化,从而达到高可用.config-server和config-client向eureka-server注册,且将config-se ...

  3. SpringCloud学习(七)高可用的分布式配置中心(Spring Cloud Config)(Finchley版本)

    上一篇文章讲述了一个服务如何从配置中心读取文件,配置中心如何从远程git读取配置文件,当服务实例很多时,都从配置中心读取文件,这时可以考虑将配置中心做成一个微服务,将其集群化,从而达到高可用 准备工作 ...

  4. 史上最简单的SpringCloud教程 | 第七篇: 高可用的分布式配置中心(Spring Cloud Config)

    转:https://blog.csdn.net/forezp/article/details/70037513 上一篇文章讲述了一个服务如何从配置中心读取文件,配置中心如何从远程git读取配置文件,当 ...

  5. 第七篇: 高可用的分布式配置中心(Spring Cloud Config)(Finchley版本)V2.0_dev

    前言: 上一篇文章讲述了一个服务如何从配置中心读取文件,配置中心如何从远程git读取配置文件,当服务实例很多时,都从配置中心读取文件,这时可以考虑将配置中心做成一个微服务,将其集群化,从而达到高可用. ...

  6. 企业级 SpringCloud 教程 (七) 高可用的分布式配置中心(Spring Cloud Config)

    一.准备工作 继续使用上一篇文章的工程,创建一个eureka-server工程,用作服务注册中心. 在其pom.xml文件引入Eureka的起步依赖spring-cloud-starter-eurek ...

  7. SpringCloud之高可用的分布式配置中心(Spring Cloud Config)(七)

    当服务实例很多时,都从配置中心读取文件,这时可以考虑将配置中心做成一个微服务,将其集群化,从而达到高可用,架构图如下: 准备工作 继续使用上一篇文章的工程,创建一个eureka-server工程,用作 ...

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

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

  9. Spring Cloud(九)高可用的分布式配置中心 Spring Cloud Config 集成 Eureka 服务

    上一篇文章,讲了SpringCloudConfig 集成Git仓库,这一篇我们讲一下SpringCloudConfig 配和 Eureka 注册中心一起使用 在分布式系统中,由于服务数量巨多,为了方便 ...

最新文章

  1. 谈谈架构的本质和架构分类
  2. Cannot load 32-bit SWT libraries on 64-bit JVM
  3. 48.聊一聊constexpr变量
  4. Excel打印区域设置
  5. 史上最全 yum 入门使用教程和常见错误解决办法
  6. iframe页面里的链接在ios设备无法点击的解决办法
  7. 原生mysql 怎么创表_Mysql的基础使用之SQL原生语句的使用:表的 创建 删除 修改 (一)...
  8. unity-shader之混合模式、面剔除、Alpha测试、深度测试、通道遮罩
  9. 数学知识都是计算机,数学在计算机的作用
  10. 触发器(数据库原理术语)
  11. 软件行业迎来拐点 厂商积极拥抱SaaS和云计算
  12. 小型电话薄管理系统(Mysql数据库)
  13. Google搜索时如何在新标签页打开搜索结果
  14. MySQL的SQL基础(五)
  15. matlab 八连通,针对matlab 四连通,和八连通的详解
  16. 谷歌浏览器扩展工具---eye dropper取色器使用
  17. 金融风控模型开发SOP(标准操作流程)-收藏
  18. performSelector的具体用法
  19. 研究人员成功绕过iPad的iOS激活锁
  20. 服务器 报警以及相关信息 预案,服务器故障应急预案

热门文章

  1. iOS开发之AVKit框架使用
  2. 【Appium】Appium+Python环境搭建
  3. ElasticSearch Groovy脚本远程代码执行漏洞
  4. Shell 十三问 的学习记录
  5. python学习--服务期间通讯和mysql数据库操作
  6. Windows Phone 8初学者开发—第19部分:设置RecordAudio.xaml页面
  7. 绿色版mysql使用方法
  8. T-SQL查询——详解公用表达式(CTE)
  9. android-轻松监听来电和去电
  10. Infragistics NetAdvantage 2006 Volume 2 CLR 2.0曲折安装