SpringCloud微服务(七)——Bus服务消息总线

news2024/10/6 1:40:31

SpringCloud Bus动态刷新全局广播

SpringCloud

Spring Cloud Bus配合Spring Cloud Config使用可以实现配置的动态刷新,通知一处,处处生效。而不用一个一个去通知。

Spring Cloud Bus是消息总线,广播通知都可以集成,不止用于实现配置的动态刷新。

简介

分布式自动刷新配置功能

SpringCloud Bus是用来将分布式系统的节点与轻量级消息连接起来的框架,它整合了Java的事件处理机制和消息中间件的功能。

SpringCloud Bus目前支持RabbitMQ和Kafka。

在这里插入图片描述

什么是总线:

在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都连接上来。由该主题中产生的消息会所有的实例监听和消费,所以称它为消息总线,在总线上的各个实例,都可以方便地广播一些需要让其他连接在该主题上的实例都知道的商息。

ConfigClient实例都监听MQ中同一个topic(默认是springCloudBus).当一个服务刷新数据的时候,它会把这个信息放入到Topic中,这样其它监听同一Topic们服务就能得到通知,然后去更新自身的配置。
https://www.bilibilicom/ideo/avss9767007from=search&seid=15010075915728605208

在这里插入图片描述

设计思想

2种:

一、利用消息总线触发一个客户端/bus/refesh,而刷新所有客户端的配置

在这里插入图片描述

二、利用消息总线触发一个服务端ConfigServer的/bus/refesh端点,而刷新所有客户端的配置

在这里插入图片描述

显然第二种方式更加适合,第一种不适合的原因如下:

  • 打破了微服务的职责单一性,因为微服务本身是业务模块,它本不应该承担配置刷新的职责
  • 打破了微服务各节点的对等性
  • 有一定的局限性.例如,微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做自动刷新,那就会增加更多的修改

实现配置的动态刷新

这里是运用rabbitmq消息中间件的,先搭建rabbitmq环境

客户端

创建多个客户端微服务,测试范例:

依赖配置:

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

<!-- config -->
<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

server:
  port: 3366

spring:
#    application:
#      name: config-client3366
  cloud:
    config:
      label: master # 分支名称
      name: application # 配置文件名称,可自定义,最好application/config
      profile: dev # 文件中的dev profile内容,上述三个综合,为master分支上的application.yml的配置文件中的dev内容被读取http://localhost:3344/application/dev/master
      uri: http://localhost:3344 #配置中心的地址

  rabbitmq: #rabbitmq相关配置,15672是web管理端口,5672是mq访问端口
    port: 5672
    host: 192.168.169.135
    username: guest
    password: guest

eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka

management:
  endpoints:
    web:
      exposure:
        include: "*"

controller

/**
 *
 * @author zzyy
 * @version 1.0
 * @create 2020/03/06
 */
@RestController
@RefreshScope
public class ConfigClientController {

    @Value("${spring.application.name}")
    private String applicationName;

    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/applicationName")
    public String getApplicationName(){
        return serverPort + ":  " + applicationName;
    }

}

服务端

依赖配置:

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

<!-- config server -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>

<dependency>            
    <groupId>org.springframework.boot</groupId          
    <artifactId>spring-boot-starter-actuator</artifactId>    
</dependency>

application.yml

server:
  port: 3344

spring:
  application:
    name: cloud-config-center
  cloud:
    config:
      server:
        git:
          uri: https://github.com/wzq-55552/springcloud-config.git #配置远程的仓库地址springcloud-config
          search-paths:
            - springcloud-config
      label: master #进到仓库的主分支

  rabbitmq:
    host: 192.168.169.135
    port: 5672
    username: guest
    password: guest

eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka

# 暴露bus刷新配置的端点,bus-refresh
management:
  endpoints:
    web:
      exposure:
        include: "bus-refresh"

启动类加入注解@EnableConfigServer

测试

微服务全部启动

修改github上的配置文件内容:

spring:
  profiles: dev     #开发环境
  application: 
    name: github-dev-config-bus-application-name-2

服务端可以同步改变,但是客户端得重新启动才可以同步修改,默认客户端是无法立即生效的,查看controller:

在这里插入图片描述

这时运维人员执行(3344是配置中心的端口):curl -X POST "http://localhost:3344/actuator/bus-refresh"可以cmd执行测试,这里我使用postman:

http://localhost:3344/actuator/bus-refresh 必须是post请求

在这里插入图片描述

再一次查看所有客户端controller(返回配置信息):

在这里插入图片描述

查看rabbitmq的交换机,这时默认有了springCloudBus交换机:

在这里插入图片描述

动态刷新定点通知

不想全部通知,只想定点通知,只通知3355,不通知3366。

指定具体一个实例生效而不是全部

http://localhost:配置中心端口号/actuator/bus-refresh/{destination}

/bus/refresh请求不再发送到具体的服务实例上,而是发给config server并通过destination参数类指定需要重新配置的服务或实例

curl -X POST “http://localhost:3344/actuator/bus-refresh/微服务名:微服务端口”

后面格式是微服务名:微服务端口

测试:

修改测试客户端:

    @Value("${server.port}")
    private String serverPort;

    @Value("${spring.config.info}")
    private String configInfo;

    @GetMapping("/configInfo")
    public String getConfigInfo(){
        return serverPort + ":  " + configInfo;
    }

微服务配置修改为获取test环境,全部启动

github修改内容,初始test:

在这里插入图片描述

postman 发送post请求http://localhost:3344/actuator/bus-refresh/config-client3355:3355 修改3355微服务的配置:

在这里插入图片描述

在这里插入图片描述

定点通知只能修改一个微服务的配置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/30666.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java项目测试成功后部署到服务器上的相关问题

1.java项目是如何部署给用户使用的? 前提&#xff1a; 以一个web项目为例&#xff0c; 使用工具&#xff1a;开发工具&#xff1a;IDEA&#xff1b;Tomcat&#xff08;应用服务器&#xff09;&#xff1b;Navicat&#xff08;数据库&#xff09;&#xff1b;Jenkins&#xff…

CDMP考试需不需要参加培训课程?培训机构哪家比较好?

参加CDMP认证考试到底要不要参加培训课程&#xff0c;身边的很多同学都参加了培训班&#xff0c;我要参加吗&#xff1f;总是会有很这样的人提出这样的问题。 那么&#xff0c;我想说考试的结果不在于你定什么样的目标&#xff0c;如何做计划&#xff0c;而在于你何时开始行动…

Flutter高仿微信-第26篇-新的朋友

Flutter高仿微信系列共59篇&#xff0c;从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图&#xff1a; 实现代码&#xff1a; /*** Author : wangning* Email : maoning20080809163.c…

智慧餐厅解决方案-最新全套文件

智慧餐厅解决方案-最新全套文件一、建设背景二、建设思路1、刺激消费手段单一2、用户信息反馈量少3、商家推广覆盖面小4、生产力利用率偏低三、建设方案1 、组织人事在线管理&#xff0c;盘活内部人力资源2、多样化考勤方式&#xff0c;轻松实现多地工时管理3、数据成本分析&am…

大数据(9f)Flink状态编程

文章目录概述Managed StateOperator StateListStateBroadcastStateKeyed StateValueStateListStateMapStateReducingStateAggregatingState状态后端Appendix概述 流式计算 分为 无状态计算 和 有状态计算 流处理的状态功能&#xff1a;去重、监控…… 状态分类Managed StateR…

半诚实模型与恶意模型

原创 洪澄 开放隐私计算 开放隐私计算 开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神&#xff0c;专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播&#xff0c;愿成为中国 “隐私计算最后一公里的服务区”。 178篇…

【Unity】自定义Untiy天空

3、需求&#xff1a;更改默认天空盒&#xff0c;360显示所需的内容。 实施&#xff1a; 准备材料&#xff1a;一张8K图&#xff08;更清晰&#xff09; 步骤&#xff1a; 1、更改Camera为天空盒&#xff1b; 2、制作图片&#xff0c;怎么制作不说了&#xff0c;分辨率8192…

Linux服务器安装部署最新稳定版本mongoDB社区版- Ubuntu-20.04版本

没有玩过mongoDB&#xff0c;安装一次真&#x1f92c;波折&#xff0c;再次建议大家安装之前&#xff0c;一定要确定好服务器的操作系统&#xff0c;可以参考查看linux操作系统版本&#xff1a;Ubuntu&#xff1f;Centos&#xff1f;还是其他&#xff1f; 接前面在本地自测需要…

解决jupyter下载好了库,但是无法使用的问题。以及补充jupyter如何下载新的库。

文章目录出现原因验证解决步骤补充国内常用镜像源出现原因 出现这个问题的主要原因是&#xff0c;jupyter的内核&#xff08;或者说他使用的Python环境&#xff09;与下载库的环境不一样&#xff0c;解决办法就是更改kernel。换句话说就是将jupyter下载库的环境加入到内核环境…

模拟双色球系统——Java

目录 一、内容简介 二、 基本流程 三、具体步骤 1.菜单栏 2.随机生成幸运号码 3.用户输入 4.判断中奖情况 5.打印数组 四、代码实现 五、效果展示 一、内容简介 双色球是彩票的一种玩法&#xff0c;规则如下&#xff1a; 红球一共6组&#xff0c;每组从1——33中随…

微信h5 使用jssdk支付成功后,点击完成 页面关闭了,引出微信“点金计划“

可能会迷惑 为啥我们之前没有碰见过这种情况! 这样的情况只有两种情况,就是 你只是普通商户不是微信特约商户你的支付跳转功能还未被微信回收 那么怎么才能支付成功重新跳回自己的网站页面 刚开始经历这种情况的童鞋, 可能有点懵逼 先看个微信的之前发的一个公告吧 微信支付公…

面试系列分布式事务:谈谈3PC的理解

3PC就是三阶段提交是在二阶段提交上的改进版本&#xff0c;3PC最关键要解决的就是协调者和参与者同时挂掉的问题&#xff0c;所以3PC把2PC的准备阶段再次一分为二&#xff0c;这样三阶段提交。处理流程如下 &#xff1a; 阶段一 a) 协调者向所有参与者发出包含事务内容的 canCo…

【深入浅出Java并发编程指南】「实战篇」教你如何使用AbstractQueuedSynchronizer实现自己的同步器组件

前提概要 之前的文章中会涉及到了相关AQS的原理和相关源码的分析&#xff0c;所谓实践是检验真理的唯一标准&#xff01;接下来就让我们活化一下AQS技术&#xff0c;主要针对于自己动手实现一个AQS同步器。 定义MyLock实现Lock Doug Lea大神在JDK1.5编写了一个Lock接口&#xf…

【C++】模拟实现STL容器:vector

目录 一、vector迭代器失效问题 1、Visual Studio和g对迭代器失效问题的表现 2、解决迭代器失效的方法 二、模拟实现构造函数调用不明确 1、问题描述 2、解决调用不明确的方法 三、reserve中的深浅拷贝问题 1、reserve中浅拷贝发生原因 2、浅拷贝发生的图解 3、解决方…

vue.js毕业设计,基于vue.js前后端分离外卖点餐系统设计与实现(H5移动项目)

功能介绍 【后台管理员功能】 会员列表&#xff1a;查看所有注册会员信息&#xff0c;支持删除 录入资讯&#xff1a;录入资讯标题、内容等信息 管理资讯&#xff1a;查看已录入资讯列表&#xff0c;支持删除和修改 广告设置&#xff1a;上传图片和设置小程序首页轮播图广告地…

用Python代码画世界杯吉祥物拉伊卜(附代码)

用Python代码画世界杯吉祥物拉伊卜&#xff08;附代码&#xff09; 世界杯正在火热进行中&#xff0c;世界杯的吉祥物拉伊卜也非常火。 本文用Python代码画世界杯吉祥物。不废话&#xff0c;可以直接先看视频效果。 视频效果 用Python代码画世界杯吉祥物拉伊卜实现方法介绍 …

运用滤波反投影的方法对图像进行重建matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 直接由正弦图得到反投影图像&#xff0c;会存在严重的模糊&#xff0c;这是早期 CT 系统所存在的问题。傅立叶中心切片定理表明&#xff0c;投影的一维傅立叶变换是得到投影区域的二维傅…

360安全卫士弹窗广告怎么彻底关闭

如何关闭360广告弹窗&#xff1f;有时候我们在电脑上看一些视频或者整理一些文件时&#xff0c;经常莫名其妙会出现一些广告弹窗&#xff0c;即使是关了也还会出现&#xff0c;很是影响用户体验感&#xff0c;那么怎么彻底关闭呢&#xff1f;下面给大家介绍具体教程&#xff0c…

【单目3D目标检测】GUPNet论文精读与代码解析

文章目录PrefaceAbstractContributionsPipelineBackboneNeckHeadLossGUPIn PaperIn CodeHTLIn PaperIn CodeRefernecePreface Lu Y, Ma X, Yang L, et al. Geometry uncertainty projection network for monocular 3d object detection[C]. Proceedings of the IEEE/CVF Intern…

ActivitiListener

ActivitiListener目录概述需求&#xff1a;设计思路实现思路分析1.ActivitiListener2.Activity3.Gateway5.FieldExtensionIOSpecification参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip ha…