前言

  • 在springcloud config章节中我们完成了配种中心的搭建,以及通过配置中心完成配置的抽离通过springcloud config模块我们将配置抽离到git仓库中我们不必要每次为了改配置而发包了。但是springcloud config并没有彻底的帮我们解决配置自动更新的问题。我们在config章节中我们遗留最后是每次修改git仓库后需要人为手动调用actuator/refresh接口才能促使配置的更新。当时也指出了在分布式微服务众多的情况人为调用接口耗时而且没有保障!!!当然你也可以写个脚本批量调用。但是今天我们即将学习的springcloud bus正好可以我们规避掉上述的问题
  • 之前在springcloud config中有一点这里做一个补充说明。在git仓库发生变化时如何进行调用refresh接口。主要是通过git仓库的WebHooks来进行回调的。

整合springcloud bus

  • config章节我们使用的是framework-root项目中的order模块来进行的。本次我们选择payment模块作为config客户端演示(再次操作熟练下记忆)。
  • 首先我们的pom中需要添加config作为client。 和上次不同的是我们本次需要引入bus模块。因为需要用到端点刷新所以actuator必不可少

pom

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<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>

配置文件

  • 这里我们需要回顾上章节内容。首先需要在bootstrap.yml文件中指定config-server地址
spring:
cloud:
  config:
    label: master
    name: config-server
    profile: dev
    uri: http://localhost:8070
  • 因为bus借助到消息队列我们这里通过rabbitmq来进行演示。所以我们还需要配置rabbit信息在application.yml中
rabbitmq:
host: 39.102.60.114
port: 5672
username: 'zxhtom'
password: '025025'
  • 为了更加了解每个模块功能涉及的端点情况,我们这里端点并没有全部放开所以需要啥端点需要我们自己配置
management:
endpoints:
  web:
    exposure:
      include: hystrix.stream,info,bus-refresh
  • 这里还是注意下因为springboot版本升级,在actuator监控中会发生变化。低版本中bus涉及的端点接口是/bus/refresh 。但是笔者这里actuator 是2.2.2.RELEASE版本的。这里的刷新接口是/actuator/bus-refresh 。

controller

  • 当然这里为了测试方便能够直白的看到配置发生了变化。我们写个接口读取配置 .。和普通的接口唯一区别就是controller类上多了一个@RefreshScope
@RestController
@RefreshScope
@RequestMapping(value = "/payment/config")
public class ConfigController {

   @Value("${zxhtom}")
   String value;

   @RequestMapping(value = "/getConfig" , method = RequestMethod.GET)
   public String getConfig() {
       return value;
  }
}

多实例部署

  • 上面我们简单对payment进行改造完成了config-client的升级。但是在bus自动刷新config-client中需要多台config-client 。 这里抛个小技巧---idea一份代码多实例部署
  • 其实这个功能我们在eureka章节中也提到过。不过笔者这里还是为什么大家整理出来就不需要你们去翻啦。毕竟最近高产不好找!!!

  • 我们在idea中Edit Configurations 。 然后添加一个springboot启动类配置。

  • 我们直接在VM Options中指定其他端口。这样就完成了多实例部署。但是有的情况下我们不仅仅需要端口不一样。那么我们就可以通过Enviroment varables 配置指定外部配置文件。这里我们仅仅设置端口不一样就可以了。

测试

  • 经过上面的多实例部署的方式我们可以在idea中启动两个payment服务。

  • 这里我们仅启动了config-server + euraka + 2* payment 。 实际上此时我们还未使用到eureka。 不过因为项目之前使用了eureka。
  • 全部启动成功之后我们先访问两个payment服务中配置接口查看此时的配置信息。

  • 然后我们在修改仓库中的对应的值,这里对应git仓库中config-server-dev.properties 。 至于为什么是这个文件就不分析了config章节里详细分析过了。
  • 修改完仓库配置文件后,就到了我们bus的重头菜了,这里我们payment起了两个实例。为什么我要起多个实例了就是为了这里能够演示蔓延的效果。我们这个时候通过刷新其中一个实例的数据就可以实现两个实例数据全部刷新了。但是actuator/refresh这个接口是不能满足的我们需要使用actuator/bus-refresh来实现。

  • 刷新完之后我们在访问两个payment数据会发现发生变化。这里读者自己操作下就可以看出效果了。

各归其位

  • 不知道你有没有发现,上面通过bus我们实现了只需要执行一次刷新接口就可以完成所有的配置刷新了。但是还有有点缺点的,springcloud bus模块在springcloud中的定位是【消息总线】 。 总线的意思个人理解应该是龙头的意思。但是上面的实现好像只是一个中转的作用。就好像一个组织里龙头老大需要听命与其中一个手下办事一样
  • 所有大多数项目架构中都不采用上述的方式来实现config的动态刷新。而是将config-server进行改造升级。让config-server拥有bus刷新的能力。这样在git仓库中钩子配置成config-server对应的刷新接口就可以了。这样从职能上分析也会变得职责分明;总线做数据的回调、各个微服务订阅消息刷新配置就可以了。
  • 还有人说为了让职责更加的分明,我们可以新建一个模块叫做bus。让他充当钩子回到的函数。这样config-server做为配置的数据源、config-client读取配置、bus作为配置刷新通知功能。这样三者互相相辅相成。
  • 总之,至于怎么划分就是每个架构中需要考虑的事情了。我们这里不做探讨。

局部刷新

  • 上面通过引入第三方模块我们将模块功能职责分的很明晰了。而且也能够实现配置的动态刷新,但是有的时候我们服务刷新配置的消耗是巨大这种情况我们就需要精准刷新。换句话说就是如非必要拒绝刷新。有的时候我们git仓库并不会影响到所有模块的刷新这个时候我们就需要只刷部分服务。
  • 上述中两个payment端口分别为8001/8003 。 加入这个时候我们想在git更新时只刷新8003端口服务。我们可以调用刷新接口是指定服务名
  • localhost:8092/actuator/bus-refresh/cloud-payment-service:8003 。 这样8003的payment的配置会发生变化。而8001的配置还是之前旧数据
  • 重点就是在刷新接口上。actuator/bus-refresh/{destination} 。 destination的取值就是对我们下发服务的一种描述。关于他的格式主要是如下
  • ${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id}:${server.port} 。正常情况下我们通过${spring.application.name}:${server.port}进行识别。

源码

点我下载哦

多项目如何高效协同合作 | springcloud系列之bus消息总线的更多相关文章

  1. SpringCloud学习之Bus消息总线实现配置自动刷新(九)

    前面两篇文章我们聊了Spring Cloud Config配置中心,当我们在更新github上面的配置以后,如果想要获取到最新的配置,需要手动刷新或者利用webhook的机制每次提交代码发送请求来刷新 ...

  2. Spring Cloud 系列之 Bus 消息总线

    什么是消息总线 消息代理中间件构建一个共用的消息主题让所有微服务实例订阅,当该消息主题产生消息时会被所有微服务实例监听和消费. 消息代理又是什么?消息代理是一个消息验证.传输.路由的架构模式,主要用来 ...

  3. 跟我学SpringCloud | 第八篇:Spring Cloud Bus 消息总线

    SpringCloud系列教程 | 第八篇:Spring Cloud Bus 消息总线 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如无特 ...

  4. SpringCloud之Config配置中心+BUS消息总线原理及其配置

    一.配置中心作用 在常规的开发中,每个微服务都包含代码和配置.其配置包含服务配置.各类开关和业务配置.如果系统结构中的微服务节点较少,那么常规的代码+配置的开发方式足以解决问题.当系统逐步迭代,其微服 ...

  5. SpringCloud(六)Bus消息总线

    Bus 消息总线 概述 分布式自动刷新配置功能 Spring Cloud Bus 配合 Spring Cloud Config使用可以实现配置的动态刷新 Bus支持两种消息代理:RabbitMQ和Ka ...

  6. SpringCloud系列——Bus 消息总线

    前言 SpringCloud Bus使用轻量级消息代理将分布式系统的节点连接起来.然后可以使用此代理广播状态更改(例如配置更改)或其他管理指令.本文结合RabbitMQ+GitHub的Webhook实 ...

  7. SpringCloud Bus消息总线

    在微服务架构中,通常会使用轻量级的消息代理来构建一个共用的消息主题来连接各个微服务实例,它广播的消息会被所有在注册中心的微服务实例监听和消费,也称消息总线. SpringCloud中也有对应的解决方案 ...

  8. springcloud 之 bus 消息总线

    在分布式系统中,我们通常使用轻量级消息代理(rabbitmq.kafuka)建立一个公共的主题,让所有的微服务都链接进来,并且监听消费这个主题的内容,我们就称这个主题是 消息总线. (可以用作配置文件 ...

  9. SpringCloud Bus消息总线简介

    简介: SpringCloud Bus配合SpringCloud Config使用可以实现配置的动态刷新 SpringCloud Bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架,它整合了 ...

随机推荐

  1. jquery validate 如何校验多个相同name

    在表单页中有如下代码 <form> <input name="zhai"/><!-- 三个相同name的input --> <input ...

  2. 解决maven中静态资源只能放到properties中的问题

    构建Maven项目的时候,如果没有进行特殊的配置,Maven会按照标准的目录结构查找和处理各种类型文件. Maven项目的标准目录结构 src main java         源文件 resour ...

  3. eclipse性能调优的一次记录

    最近因为学习原因,eclipse中插件越来越多,造成eclipse一次次假死,着实很影响工作效率和心情,有时正是兴起,但是造成短片很令人生气,如果eclipse卡顿或者假死,在电脑配置较不错的情况下, ...

  4. 优先队列PriorityQueue&Lambda&Comparator

    今天翻阅<Labuladuo的算法小抄>时发现在使用优先队列的PriorityQueue解决一道hard题时(leetCode 23),出现了如下代码: ListNode mergeKLi ...

  5. leetcode 括号

    1. 括号(0809) 设计一种算法,打印n对括号的所有合法的(例如,开闭一一对应)组合. 说明:解集不能包含重复的子集. 例如,给出 n = 3,生成结果为: [ "((()))" ...

  6. zabbix 历史数据处理

    问题描述 zabbix server 平稳运行有一段时间了,但是最近问题却来了,今天早上收到zabbixserver磁盘空间不足的告警.通过查看之后发现是大部分数据是zabbix 库的的数据 在进一步 ...

  7. 利用job提升马哈鱼数据血缘分析效率

    利用job提升马哈鱼数据血缘分析效率 一.Job基本知识 前面文章中已介绍马哈鱼的基本功能,其中一个是job,job其实是一个任务集合处理的概念,就是让用户通过job,可以一次递交所有需要处理的 SQ ...

  8. 转:C#读取PDF、TXT内容

    //读取PDF内容 private void button2_Click(object sender, EventArgs e) { label3.Text = OnCreated("D:\ ...

  9. BeanFactory和ApplicationContext对比

    一.BeanFactory和ApplicationContext对比 其中,ApplicationContext容器即时加载,就是一加载配置文件,就会创建对象,且自动装配bean(即写道xml中bea ...

  10. Cobar源码分析之AST

    本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star. 背景 Cobar Cobar是阿里开源的数据库中间件,关于它的介绍这里不再赘述,可以参考之前的 ...