消息总线在微服务中的应用

news2024/12/23 3:39:56

直连式配置中心

上一篇文章介绍了 Spring Cloud 中的分布式配置组件 Config,每个服务节点可以从Config Server 拉取外部配置信息。但是似乎还有一个悬而未决的问题,那就是当服务节点数量非常庞大的时候,我们不可能一台一台服务器挨个去手工触发刷新,这时候就需要一个可以号令武林的角色出场,由它代替我们做批量刷新的事儿。

帮派组织架构

  • 帮主:仍然是我们的 Github 服务器(后面会讲到其他存放属性文件的方式),存放所有的配置项信息
  • 传功长老:Config 组件,从 Github 那里获取资源文件,并保存一份放到本地。
  • 小弟:众多服务节点,从传功长老那里获取帮主的指令

Config Server 的工作模式

Config Server 主要有两种工作模式:

  • 效忠帮主 在这个模式下,Config Server 只会从 Github 或者数据库获取配置信息 Github 方案:如果 Github 是公共仓库,那就不需要配置用户名和密码。如果是私有仓库,要把登录用的用户名和密码写到配置文件里面,当然密码可以通过加密方式存储,然后系统启动的时候使用密钥进行解密
  • Database 方案,需要额外指定 spring.profiles.active=jdbc 切换到 db 方案,并指定数据源自立门户 帮主?什么帮主?我就是帮主,Github 被我一脚踢开,Config 组件自己说了算,直接从本地路径读取资源文件采用这种方式,需要指定spring.profiles.active=native开启功能,然后指定本地文件存储路径为了简化配置,我们的课程采用第一种模式管理配置文件,也就是 Github 公共仓库。在项目配置中非常简单,只用指定 Github 地址就可以,例如spring.cloud.config.server.git.uri=https://github.com/xxxxx/config-repo.git

在企业应用中,有时也会有多个项目共同使用一个 Github repo 的情况,这时候就需要将不同项目的资源文件放到不同目录下,使用如下配置,给你的服务指定一个独立的目录存放配置文件spring.cloud.config.server.git.search-paths=/{appName}

直连式方案的利弊

优点:从部署结构上来讲相当简单,组件间依赖也少
缺点:可用性不能得到保障,假如 Config 节点宕机会产生较大影响。由于需要将在客户端启动的时候指定 Config 地址,即便这里使用 DNS 地址(比如域名等非 IP 形式),如果域名发生变化仍然需要在客户端重新配置 Config 地址。

配置文件动态刷新

斧头帮决定来一次整风运动,调动小弟们的积极性,要做到帮主随叫随到(是帮主叫你,不是他自己随叫随到),我们来看看怎么推广。
在这里插入图片描述
很简单,这个过程分 3 个步骤进行:

  1. 发送刷新请求 我们选定一个服务节点,通过 POST 请求访问节点下的/actuator/refresh 路径,这时节点会发送一个刷新请求到 Config 服务器
  2. 拉取文件 Config 服务器会访问 Github 获取最新的内容,并把配置信息文件下载到本地
  3. 获取更新内容 接着服务节点从 Config 那里拿到变更内容,并将变动的属性配置到各个类中。

在第三步骤里还有个小前提,假如一个类中有需要进行运行期替换操作的属性,那就要把@RefreshScope 注解加到这个类上,这样运行期参数修改才会在这个类上面生效。在上面那个 case “里, /actuator/refresh”就像帮主发给小弟的对讲机,只要一声令下就得前来报到。但是要使用这个对讲机还得先了解一下它的配置。

什么是 Actuator

Actuator 是一个轻巧的监控组件,通过 REST 接口的方式可以供外部调用,访问服务节点下的 “/actuator”路径可以查看当前开放的服务。

Actuator 也是一个相当贴心的组件,当你引入 Spring Cloud 的其他组件依赖到 pom 中以后(比如 Config 或 BUS),这部分组件会通过 Actuator Endpoint 将自己的核心服务提供出去(比如 Config 和 BUS 的 refresh 功能)。假如同学们访问 /actuator后只能看到 health info 这两个服务,那是因为 Actuator 的服务包含很多 “机密” 信息,为了安全考虑,默认只暴露几个无关痛痒的接口。我们可以通过改动默认配置项让它暴露指定的接口,为了方便演示,本课程中我们采用以下配置让Actuator “暴露所有服务,这样你就可以通过 /actuator”路径查看当前可用的服务了。management.endpoints.web.exposure.include=*

消息总线BUS

接下来,让我们继续 “总线式架构” 的展望,看看 Spring Cloud 中哪个组件可以担当号令武林的角色。

号令武林

武林至尊 宝刀屠龙
号令武林 莫敢不从

BUS- 消息总线,从这个 “总” 字就可以看出身份地位不一般,它代理了这个号令武林的角色,将消息变更发送给所有的服务节点。

在微服务架构的系统中,通常我们会使用消息代理来构建一个 Topic,让所有服务节点监听这个主题,当生产者向 Topic 中发送变更的时候,这个主题产生的消息会被所有实例所消费,这就是消息总线的工作模式,也就是我们熟悉的 “发布- 订阅” 模型。

其实广义的消息总线不单指代这种 “发布- 订阅” 的模式,也可以代指分布式服务间进行通信、消息分发的 单播 模式,甚至有的公司既不使用 HTTP 也不用 RPC 来构建微服务,完全靠消息总线来做服务调用。比如银行的一些老系统就是采用总线型架构,在不同服务节点之间做消息分发。

Spring Cloud BUS 的职责范围就相对小了很多,因为还有一个 Stream 组件代理了大部分的消息中间件通信服务,因此 BUS “ ”在实际应用中大多是为了应对 消息广播 的场景,比如和 Config 一同搭配使用推送配置信息。

我们先来看下官网对 BUS 定位的描述:

Spring Cloud Bus links nodes of a distributed system with a lightweight message
broker. This can then be used to broadcast state changes (e.g. configuration
changes) or other management instructions.

不同于其他 Spring Cloud 组件洋洋洒洒的大篇功能描述,Spring 官网对 BUS 的应用场景
寥寥数笔,总结一下它的应用范围就是:广播状态更改,例如配置变更或者其他的管理指
令。

总线式架构的完整流程

下面我们揭开总线式架构的完整面纱:
在这里插入图片描述
白底红框那三个和 BUS 有关系的步骤:

  • MQ/Kafka BUS 是一个调用封装,它背后还是需要依赖消息中间件来完成底层的消息分发,实际项目中最常用的两个中间件分别是 RabbitMQKafka
  • BUS 作为对接上游应用和下游中间件系统的中间层,当接到刷新请求的时候,通知底层中间件向所有服务节点推送消息
  • Refresh Config 章节中我们通过 Refresh 请求来刷新配置,那么对于总线式架构的Refresh 请求来说,有两个需要解决的问题:谁来发起变更 - 是由服务节点,还是由 Config Server 发起变更请求?

小结

本文带大家了解了 BUS + Config 结合的总线式消息推送模型,后续我们将继续对 BUS 展
开深入的学习。

BUS 底层依赖了 Stream 来广播消息,真正实现与消息代理进行交互的实际上是 Stream,它才是站在 BUS 背后的男人。

学习 Tips:Spring Cloud 各个组件之间常有相互依赖的关系,比如 Feign 和 Ribbon 还有Hystrix 搭配,BUS 和 Stream,Config 和 BUS,整个 Spring Cloud 各组件配合的天衣无缝浑然一体,秉承了 Spring “ ”家族 全家桶 式的设计思想。回想过去十多年来层出不穷的开源框架,能走到今天依然在 Java 企业级开发领域呼风唤雨的也只有 Spring 了,从最初的IOC+AOP,到 MVC+全家桶组件库,再到 SpringBoot,现在又是 SpringCloud,Spring一直是 Java 领域的弄潮儿,这种生命力和创新精神真的是相当厉害。

本文已收录至我的个人网站:程序员波特,主要记录Java相关技术系列教程,共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源,让想要学习的你,不再迷茫。

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

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

相关文章

django+flask警务案件信息管理系统python-5dg53-vue

1)用户在后台页面各种操作可及时得到反馈。 (2)该平台是提供给多个用户使用的平台,警员使用之前需要注册登录。登录验证后,警员才可进行各种操作[10]。 (3)管理员用户拥有信息新增,修…

计算机二级C语言的注意事项及相应真题-2-程序修改

目录 11.找出n的所有因子,统计因子的个数,并判断n 是否是”完数”12.计算s所指字符串中含有t所指字符串的数目13.将一个由八进制数字组成的字符串转换为与其面值相等的十进制整数14.根据整型形参m的值,计算如下公式的值15.从低位开始依次取长…

Springboot多种方法处理静态资源:设置并访问静态资源目录

~目录嗷~ 静态文件application设置方法 配置详解编写配置优缺点 设置配置类方法 配置详解编写配置优缺点 总结 作者:Mintimate 博客:https://www.mintimate.cn Mintimate’s Blog,只为与你分享 静态文件 静态资源&…

Pycharm python用matplotlib 3D绘图显示空白解决办法

问题原因: matplotlib版本升级之后显示代码变了,修改为新的 # ax Axes3D(fig) # 原代码 ax fig.add_axes(Axes3D(fig)) # 新代码import numpy as np import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot3d import Ax…

pytest的常用插件和Allure测试报告

pytest常用插件 pytest-html插件 安装: pip install pytest-html -U 用途: 生成html的测试报告 用法: ​在.ini配置文件里面添加 addopts --htmlreport.html --self-contained-html 效果: 执行结果中存在html测试报告路…

前端工程化之:webpack1-8(loader)

一、loader webpack 做的事情,仅仅是分析出各种模块的依赖关系,然后形成资源列表,最终打包生成到指定的文件中。 更多的功能需要借助 webpack loaders (加载器)和 webpack plugins (插件)完成。 webpack loader : loader 本质上是…

【Java开发岗面试】八股文—微服务、消息中间件

声明: 背景:本人为24届双非硕校招生,已经完整经历了一次秋招,拿到了三个offer。本专题旨在分享自己的一些Java开发岗面试经验(主要是校招),包括我自己总结的八股文、算法、项目介绍、HR面和面试…

python 基础知识点(蓝桥杯python科目个人复习计划32)

今日复习内容:基础算法中的位运算 1.简介 位运算就是对二进制进行操作的运算方式,分为与运算,或运算,异或运算,取反,左移和右移。 (1)与运算 xyx&y000010100111 (2)或运算 …

OpenHarmony—Hap包签名工具

概述 为了保证OpenHarmony应用的完整性和来源可靠,在应用构建时需要对应用进行签名。经过签名的应用才能在真机设备上安装、运行、和调试。developtools_hapsigner仓 提供了签名工具的源码,包含密钥对生成、CSR文件生成、证书生成、Profile文件签名、Ha…

【安装指南】maven下载、安装与配置详细教程

🌼一、概述 maven功能与python的pip类似。 Apache Maven是一个用于软件项目管理和构建的强大工具。它是基于项目对象模型的,用于描述项目的构建配置和依赖关系。以下是一些关键的 Maven 特性和概念: POM(Project Object Model&…

MATLAB知识点:矩阵的拼接和重复

​讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 节选自第3章 3.3.4 矩阵的拼接和重复 有时候我们需要对多个矩…

云原生Kubernetes: Ubuntu 安装 K8S 1.23版本(单Master架构) 及故障恢复

目录 一、实验 1.环境 2.安装 Ubuntu 3.连接Ubuntu 4.master节点安装docker 5.node节点安装docker 6.master节点安装K8S 7.添加K8S工作节点 8.安装网络插件calico 9.故障 10.故障恢复 11.测试k8s网络和coredns 二、问题 1.Ubuntu如何修改镜像源 2.Ubuntu和Windo…

KAFKA节点故障的容错方案

KAFKA节点故障的容错方案 1. broker启动加载逻辑1.1 日志组成和分析1.2 snapshot文件1.3 broker启动流程1.4 LogManager的初始化和启动过程 2. controller高可用1.1 选主逻辑1.2 HA切换1.3 controller的职责 3. partition高可用3.1 ISR列表3.1 选举Leader 4. 疑问和思考4.1 如果…

11:按键

按键 1、按键的相关知识2、独立按键3、CPU如何处理按健4、编程测试(用LED1作为指示)5 、编程测试(用8个LED作为指示) 1、按键的相关知识 分为独立按键和矩阵按键 2、独立按键 由图得独立按键右边接地,左边独立连接到…

正则表达式可视化工具regex-vis

什么是正则表达式 ? 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。【百度百科】 正则表达式用简短…

题目: 有1234个数字, 组成多个互不相同且无重复数字的三位数? 都是多少?

lua脚本如下 最原始的解题方法 local str{} local i, j, k0, 0, 0 for i1, 4 do for j1, 4 do for k1, 4 do if i~j and i~k and j~k then str[#str1]i..j..k end end end end print("组成的数有"..#str) print(table.unpack(str)) 运行的结果如下 组成的数有24 1…

【课程作业_01】国科大2023模式识别与机器学习实践作业

国科大2023模式识别与机器学习实践作业 作业内容 从四类方法中选三类方法,从选定的每类方法中 ,各选一种具体的方法,从给定的数据集中选一 个数据集(MNIST,CIFAR-10,电信用户流失数据集 )对这…

微信小程序新手入门教程三:基础语法介绍

WXML(WeiXin Markup Language)是框架设计的一套标签语言,可以与各种组件相结合,进行页面构建。 一 常用标签 wxml的语法结构与我们熟悉的html很像,但在细节处略有不同,我们可以参考html标签对比记忆。wxm…

基于协同过滤的个性化电影推荐系统分析设计python+flask

本系统为用户而设计制作个性化电影推荐管理,旨在实现个性化电影推荐智能化、现代化管理。本个性化电影推荐自动化系统的开发和研制的最终目的是将个性化电影推荐的运作模式从手工记录数据转变为网络信息查询管理,从而为现代管理人员的使用提供更多的便利…

华为OD机试真题【日志首次上报最多积分】

1、题目描述 【日志首次上报最多积分】 日志采集是运维系统的的核心组件。日志是按行生成,每行记做一条,由采集系统分批上报。 如果上报太频繁,会对服务端造成压力;如果上报太晚,会降低用户的体验; 如果一次上报的…