2019独角兽企业重金招聘Python工程师标准>>>

系列文章

Spring-Cloud-Config快速开始

Spring-Cloud-Config消息总线和高可用

前言

上文中简单的介绍了Spring-Cloud-Config如何使用,如何手动更新配置文件,并且在文末提出了几个疑问,其中包括多个Client节点如何更新,Server端如何保证高可用性等;本文将重点介绍通过使用Spring Cloud Bus来批量更新客户端,以及Server如何保证高可用;

Spring Cloud Bus消息总线

Spring Cloud Bus使用轻量级消息代理链接分布式系统的节点,可以用于广播状态改变(例如,配置改变)或其他管理指令;目前唯一实现的方式是用AMQP消息代理作为通道,其实本质是利用了MQ的广播机制在分布式的系统中传播消息,目前常用的有Kafka和RabbitMQ;下面重点使用kafka来实现多客户端刷新配置文件;

1.总体更新流程

大致流程图如下所示:

2.kafka安装部署

kafka部署依赖Zookeeper,使用的版本分别是:kafka_2.11-1.0.1和zookeeper-3.4.3,具体如何安装部署可参考:Kafka快速开始

3.server端改造

3.1添加新的依赖

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

3.2application.properties添加配置

#开启消息总线
spring.cloud.bus.trace.enabled=true
spring.cloud.stream.kafka.binder.brokers=192.168.237.128
spring.cloud.stream.kafka.binder.defaultBrokerPort=9092

4.client改造

4.1添加新的依赖

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

4.2application.properties添加配置

#开启消息总线
spring.cloud.bus.trace.enabled=true
spring.cloud.stream.kafka.binder.brokers=192.168.237.128
spring.cloud.stream.kafka.binder.defaultBrokerPort=9092

5.启动测试

5.1启动Server端
观察启动日志,可以发现/actuator/bus-refresh映射

2018-07-18 10:51:44.434 INFO 12532 --- [ main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/actuator/bus-refresh],methods=[POST]}" onto public java.lang.Objectorg.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)

往下可以有如下这行日志:

2018-07-18 10:52:08.803 INFO 6308 --- [ main] o.s.c.s.b.k.p.KafkaTopicProvisioner : Using kafka topicfor outbound: springCloudBus

Server端连接kafka创建了一个名称为springCloudBus的Topic,用来作为配置文件更新的消息通知;可以去kafka上查看:

[root@localhost bin]# ./kafka-topics.sh --list --zookeeper 10.13.83.7:2181
__consumer_offsets
springCloudBus

5.2启动Client
分别指定启动端口为8881和8882,可以看到和Server端类似的日志,订阅了名为springCloudBus的Topic,这样Server端发送消息给kafka,kafka通知client更新数据;

5.3测试
分别访问http://localhost:8881/hello和http://localhost:8882/hello,结果如下:

hello test

更新git中的配置文件为:

foo=hello test update

POST方式请求Server端,用来更新配置文件

c:\curl-7.61.0\I386>curl -X POST http://localhost:8888/actuator/bus-refresh

分别访问http://localhost:8881/hello和http://localhost:8882/hello,结果如下:

hello test update

2个客户端都获取到了最新的数据,表示更新成功;

在上图中我们发现Server端承担了太多的任务,而上图中Server端是一个单点,这样就不能保证系统高可用,下面看一下如何分布式部署Server端;

Server端保证高可用

Server端通过注册中心Eureka来保证高可用,下面看一下具体流程:

1.Eureka注册中心

1.1Eureka-Server依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka-server</artifactId><version>1.4.5.RELEASE</version>
</dependency>

1.2启动配置文件

spring.application.name=eureka-server
server.port=8880eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:8880/eureka/

eureka.client.register-with-eureka:是否将自己注册到Eureka Server,默认为true
eureka.client.fetch-registry:是否从Eureka Server获取注册信息,默认为true
eureka.client.serviceUrl.defaultZone:Eureka Server交互地址

1.3准备启动类

@SpringBootApplication
@EnableEurekaServer
public class EurekaServer {public static void main(String[] args) {SpringApplication.run(EurekaServer.class, args);}
}

2.改造Server端(服务提供方)

2.1Eureka-Client依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2.2启动配置文件

eureka.client.serviceUrl.defaultZone=http://localhost:8880/eureka/

指定注册中心地址,也就是Eureka-Server配置的地址

2.3启动类添加@EnableDiscoveryClient注释,实现服务注册和发现

@EnableDiscoveryClient
@EnableConfigServer
@SpringBootApplication
public class ConfigServer {public static void main(String[] args) {SpringApplication.run(ConfigServer.class, args);}
}

3.改造Client端(服务消耗方)

3.1Eureka-Client依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

3.2启动配置文件

#spring.cloud.config.uri= http://localhost:8888/
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.serviceId=config-server
eureka.client.serviceUrl.defaultZone=http://localhost:8880/eureka/

注释掉具体的Server端地址
spring.cloud.config.discovery.enabled:开启服务发现支持
spring.cloud.config.discovery.serviceId:服务提供端的名称
eureka.client.serviceUrl.defaultZone:配置中心的地址

4.测试

首先启动注册中心eurekaServer,端口为8880;然后启动多个config-server端,端口分别为:8887,8888;最后启动多个config-client端,端口分别是:8883,8884;
可以查看注册中心,注册的服务:

分别访问http://localhost:8883/hello和http://localhost:8884/hello,结果如下:

hello test

更新git中的配置文件为:

foo=hello test update

POST方式请求Server端,用来更新配置文件

c:\curl-7.61.0\I386>curl -X POST http://localhost:8888/actuator/bus-refresh

这里只是选择了其中一个server端去更新,任意一个都可以;

分别访问http://localhost:8883/hello和http://localhost:8884/hello,结果如下:

hello test update

2个客户端都获取到了最新的数据,表示更新成功;

将8888端口的Server端停掉,再次更新配置文件为

foo=hello test update2

POST方式请求Server端,用来更新配置文件

c:\curl-7.61.0\I386>curl -X POST http://localhost:8887/actuator/bus-refresh

分别访问http://localhost:8883/hello和http://localhost:8884/hello,结果如下:

hello test update2

2个客户端都获取到了最新的数据,表示更新成功;

总结

通过消息总线的方式解决了多个Client更新的问题,以及通过eureka来保证Server的高可用性;当然eureka注册中心和消息总线本身也需要高可用性,这里就不过多介绍了。

示例代码地址

Github:https://github.com/ksfzhaohui…

转载于:https://my.oschina.net/OutOfMemory/blog/1865231

Spring-Cloud-Config消息总线和高可用相关推荐

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

    上一篇文章,留了一个悬念,Config Client 实现配置的实时更新,我们可以使用 /refresh 接口触发,如果所有客户端的配置的更改,都需要手动触发客户端 /refresh ,当服务越来越多 ...

  2. Spring Cloud Eureka(三)实现一个高可用的注册中心

    Spring Cloud Eureka(三)实现一个高可用的注册中心 实现一个高可用的注册中心 在微服务结构这样的分布式环境中,我们需要充分考虑发生故障的情况,所以在生产环境中必须为服务的各个组件进行 ...

  3. Spring Cloud Bus 消息总线

    在微服务架构的系统中,我们通常会使用轻量级的消息代理来构建一个共用的消息主题让系统中所有微服务实例都连接上来,由于该主题中产生的消息会被所有实例监听和消费, 所以称它为消息总线. 在总线上的各个实例都 ...

  4. Spring Cloud第七篇:高可用的配置中心

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

  5. Spring Cloud Bus 消息总线介绍

    作者 | 洛夜 来源 | 阿里巴巴云原生公众号 在 Spring 生态中玩转 RocketMQ 系列文章: <如何在 Spring 生态中玩转 RocketMQ?> <罗美琪和春波特 ...

  6. 干货|Spring Cloud Bus 消息总线介绍

    2019独角兽企业重金招聘Python工程师标准>>> 继上一篇 干货|Spring Cloud Stream 体系及原理介绍 之后,本期我们来了解下 Spring Cloud 体系 ...

  7. Spring Cloud Bus 消息总线实现配置自动刷新

    why 当微服务太多的时候,服务之间需要建立通信或一个服务的改变需要广播到所有其它服务,这时就需要有一个总线来承担对应的职责. what spring cloud bus 是通过轻量消息代理连接各个分 ...

  8. Spring Cloud Bus消息总线

    目录 一.概述简介 1.1. Bus是什么 1.2. Bus能干嘛 1.3. 为何被称为总线 二.RabbitMQ环境配置 2.1. windows下载与安装 2.2. 使用RabbitMQ 三.Bu ...

  9. Nacos发布 v0.2 版本,无缝支持 Spring Cloud 微服务生态及高可用集群模式

    2019独角兽企业重金招聘Python工程师标准>>> 近日,阿里巴巴新开源项目Nacos 发布了 v0.2 版本,该版本开始支持完整的Spring生态技术栈,这包括 Spring ...

最新文章

  1. ansible学习笔记
  2. 提高网速软件_【干货】C盘空间不够用,这款软件或许会帮到你!一键清除C盘多余文件...
  3. 牛客多校2 - Fake Maxpooling(线性递推gcd+单调队列)
  4. 如何使用Avira Rescue CD清洁感染的PC
  5. 花三分钟给女票写一个爬虫,做一回模范男友!
  6. [转载] 康威的人生游戏与轻量级模式
  7. 中班音乐活动 机器人_幼儿园大班音乐活动教案:《机器人》
  8. 使用 Spring 2.5 基于注解驱动的 Spring MVC
  9. 获取高程数据以及转灰度图和裁剪操作
  10. uni-app微信小程序——商城(8)——订单详情
  11. 连接跟踪子系统之helper
  12. 日记:2019新年计划,每日计划的思维导图
  13. POI导出多个Excel文件,生成压缩文件
  14. tl-wdr7300虚拟服务器怎么设置,TP-Link TL-WDR7300路由器wifi密码怎么设置?(电脑)...
  15. 跨境电商须知: Google CWV新政及应对之道(上)
  16. 采集英语站-免费采集外贸英语站的软件
  17. 华为OBS通过ObjectKey生成临时的url地址
  18. 机房收费系统合作版(四):一路走来感谢有你相伴
  19. CourseMaker和CamtasiaStudio谁更能打造精彩微课
  20. plc s7-200的a/d转换的c语言程序,西门子S7-200中A/D转换模块的技术指标

热门文章

  1. 11.11 双十一 前端教你一键领取天猫千张优惠券 (领前先想想有没有钱花这些优惠券)...
  2. Linux Kobject
  3. [转]Visual Studio 2010 MSDN 文件位置及安装注意事项
  4. dirty_ratio与dirty_background_ratio参数区别--系统优化必选
  5. python之event【事件】
  6. 详解 Array.prototype.slice.call(arguments)
  7. C#中DataRow的初始化
  8. 动态设置imageview 宽高
  9. 程序员:下一次面试前你需要准备的五个基本步骤
  10. 【函数计算月报】2018年12月刊