微服务洞察,让微服务更透明

news2024/11/24 11:33:12

作者: 屿山

微服务作为云原生时代下一种开发软件的架构和组织方法,通过将明确定义的功能分成更小的服务,并让每个服务独立迭代,增加了应用程序的灵活性,允许开发者根据需要更轻松地更改部分应用程序。同时每个微服务可以由单独的团队进行管理,使用适当的语言编写,并根据需要进行独立扩缩容。但微服务同样也并非“银弹”,在带来如此多的优势的同时,逐渐膨胀的微服务数量也为系统带来了空前的复杂度,服务之间错综复杂的调用、协作关系如同一层迷雾笼罩在系统之上,借助 Trace、Log、Metric 三驾马车我们的系统具备了一定的可观测性,但所能得到信息是标准化且固定的,往往不能够满足复杂场景下的观测需求,比如微服务引擎 MSE(Microservices Engine)中的微服务治理功能模块为用户用好微服务提供了诸多帮助,但其中的很多功能,比如全链路灰度、无损上下线等会涉及多个应用,且所涉及的信息又不被标准的可观测系统覆盖。而微服务洞察通过动态的信息采集能够填补这其中的一部分空缺,更好地满足这些微服务场景的观测需求,同时也将他们纳入到标准的观测体系中来。

微服务洞察

设想这样一个问题现场,线上系统出现了一个奇怪的问题,某一个接口偶现错误,频率不高,出现时间毫无规律,但是没有发现任何有效的错误日志。这时,在通常的实践中,除非具备脑内 debug 的神力,不然我们往往需要在代码中增加日志逻辑,然后重启应用,静静等待问题复现后查询日志,如果定位了问题范围需要更多的信息,就需要我们不断循环 编写日志逻辑->重启应用->静静等待 的步骤直到解决 bug。但这还不是最令人头疼的,如果给这个问题加上问题触发伴随应用重启、pod 内日志丢失、重启后问题无法复现等 debuff,排查的难度将会进一步上升。

而由于微服务洞察具备任意位置类粒度的动态信息采集的核心能力,能够帮助我们解决上述场景中的一些痛点。首先在第一次发现这个问题后,我们可以直接在线上环境中通过配置一条微服务洞察的规则,来收集一些初步信息来帮助我们判断可能的问题原因。由于收集的信息会以调用链的形式组织,我们可以从中获取问题出现的频率、时间、参数分布、上下游调用信息等。同时由于信息会直接上报并集中存储到远端系统,因此不受应用重启的影响,我们也不需要一台一台实例去查询日志。

在这里插入图片描述
在这里插入图片描述

在对问题有了初步的判断之后,我们往往能够将问题定位到一个范围之内,这时我们可以进一步锁定某些方法,通过配置规则,打印它们的入参、返回值、调用堆栈等信息来判断其执行是否符合预期。

在这里插入图片描述

通过上述的举例可以发现,借助微服务洞察的能力,我们能够轻松地探知标准的可观测系统难以触达的角落,从而满足我们对一些微服务场景的观测需求。

洞察微服务场景

无损下线

无损下线是微服务治理中的一个功能,主要是为了解决在发布过程中的微服务在下线的过程中可能存在的流量损失。其大致流程如下图所示。

在这里插入图片描述

通过一系列的策略和措施,能够做到服务的完全无损下线。但这样就导致无损下线的流程比较复杂,同时还涉及到多个节点之间的通知机制,特别是在大规模之下,下线流程的完整性以及可靠性的确认变得非常复杂与繁琐。这就是前文所提到的难以触达的角落,我们可以通过微服务洞察的能力帮助我们观测这个场景。

针对无损下线的场景,微服务洞察提供了场景化的规则,简单配置一键开启。

在这里插入图片描述

在开启了规则之后,微服务洞察会收集无损下线流程中值得关心的信息,组织成调用链的形式展示。如下图场景,我们对 108 节点进行缩容操作,我们就可以得到一条 Tracing 链路,其中包含主动通知、服务注销、应用停止等几个步骤,并且我们可以在每个步骤中看到所需的信息。

在这里插入图片描述

在这里插入图片描述

在主动通知环节我们可以看到当前 Provider 节点对哪些 Consumer 进行 GoAway 请求的调用,如下图所示我们将主动通知 10.0.0.90、10.0.0.176 两个 Consumer 节点。

在这里插入图片描述

当 Consumer 收到 GoAway 调用后,会进行负载均衡列表的刷新以及路由的隔离,我们将在负载均衡地址列表中显示最新抓到的当前 Consumer 对于当前服务缓存的最新地址列表,我们可以在下图中看到,地址列表中只剩下 10.0.0.204 这个服务提供者节点的调用地址。

在这里插入图片描述

我们也可以看到 Spring Cloud 向 Nacos(注册中心)执行服务下线的调用结果,注销成功。

在这里插入图片描述

微服务洞察通过将无损下线的 workflow 抽象成 Tracing 结构的策略,可以帮助我们降低大规模场景、复杂链路下无损下线问题的排查成本。

全链路灰度

全链路灰度是微服务治理中的另一个功能。有时某个功能发版依赖多个服务同时升级上线,我们希望可以对这些服务的新版本同时进行小流量灰度验证,这就是微服务架构中特有的全链路灰度场景,通过构建从网关到整个后端服务的环境隔离来对多个不同版本的服务进行灰度验证。在发布过程中,我们只需部署服务的灰度版本,流量在调用链路上流转时,由流经的网关、各个中间件以及各个微服务来识别灰度流量,并动态转发至对应服务的灰度版本。如下图:

在这里插入图片描述

而在使用该能力的时候,要想探清流量的匹配情况以及流量的走向具有较大的难度。而借助微服务洞察的能力可以帮助我们便捷地感知这些信息。

这部分的示例将基于 A、B、C 三个应用,其中 A、B 应用分别部署一个基线版本和一个灰度版本,其内部存在 /a -> /b -> /c 的调用链路。

在这里插入图片描述

我们只需要配置如下的规则可以看到流量的路径,以及实例和流量的标签信息。

在这里插入图片描述

从所展示的信息中可以看到,灰度流量正确地流经了灰度实例而不是非灰度实例(其中 mse.app.tag 是应用的标签,mse.tag 是流量的标签)

在这里插入图片描述

全链路灰度支持按照 headers 中的信息来匹配灰度流量,因此我们也在上一条规则的基础上,增加如下的规则来观测灰度流量的 headers 信息,来帮助我们判断流量匹配是否符合预期。

在这里插入图片描述

开启规则后,对于 /a -> /b -> /c 链路中的带有 gray 全链路灰度标签的流量,会在采集上一条规则所定义的信息的基础上,同时采集 Headers 信息,在链路展示页面详情展示如下:

在这里插入图片描述

借助微服务洞察的能力,我们只需要简单的规则配置,就可以完成对复杂的全链路灰度场景的观测,让我们在使用全链路灰度时不再提心吊胆。

引用的框架/组件内部

微服务架构下的开发往往会使用很多框架或是中间件,这些框架和中间件的内部无法添加日志逻辑,因此在使用时对开发者来说时黑盒的,极大地增加了观测的难度。而借助微服务洞察,任意位置都只需要通过配置规则的方式就可以获取到现场信息。接下来以负载均衡和 Nacos 为例。

Nacos

Nacos 借用官网的描述,致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。处于微服务架构中的关键位置,但是目前在可观测方面 Nacos 服务端能够获取一些信息,但是客户端则成了黑暗的角落,开发者也不能随意地添加日志信息,想要关注其中的信息难上加难。而在微服务洞察的帮助下,通过简单的规则配置,就可以获取到客户端内部的信息,来补全这部分的观测需求。

我们以服务变更回调的方法以及收取订阅服务内容的方法为例,前者会在所订阅的服务发生变更时被触发,后者会在收到订阅的服务内容时被触发,通过关注这两个方法的入参,我们便可以获取到此时服务的详细信息。

在这里插入图片描述
在这里插入图片描述

负载均衡

以 Spring Cloud 常用的客户端负载均衡组件 Ribbon 作为示例,Ribbon 位于客户端一侧,通过服务注册中心(本文中为 Nacos)获取到一份服务端提供的可用服务列表。随后,在客户端发送请求时通过负载均衡算法选择一个服务端实例再进行访问,以达到负载均衡的目的。通过分析代码可以发现,Ribbon 内部的 updateZoneServerMapping 方法的参数 Map<String, List<Server>> map 基本等同于每次更新动作最后所更新的可用服务列表。我们只需要配置一条规则来获取这个方法的入参就可以获取到当时真实的可用服务列表信息。

在这里插入图片描述
在这里插入图片描述

小节

本文以一个假象的场景出发,介绍了微服务引擎 MSE(Microservices Engine)微服务治理功能模块中微服务洞察功能的应用场景和简单的使用介绍。借助微服务洞察,我们可以便捷地观测到一些不被标准可观测系统覆盖的角落。在提供任意位置类粒度的动态信息采集这一核心能力的同时,我们也会结合微服务开发者们的微服务开发运维经验,不断去探索更多有价值的微服务场景,在核心能力的基础上以更加贴近场景的方式收集并采集信息,旨在帮助我们更好地治理我们的微服务应用,助力于云上帮助企业构建完整的微服务体系。欢迎大家尝鲜与体验~

点击此处,前往微服务引擎 MSE 官网查看更多资讯~

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

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

相关文章

想不起来的python知识点(应该后续还会再补充)

目录数据类型Number随机生成一个[0,1)范围的实数随机生成一个[1,20)范围内的整数补String(字符串)字符串连接使用join运算符List&#xff08;列表&#xff09;由于没有书&#xff0c;利用博客对于Python的学习内容进行简要的记录&#xff01;&#xff08;应该是菁&#xff08;j…

基于声网 Flat 构建白板插件应用“成语解谜”的最佳实践

前言 本文作者赵杭天。他参加了“2022 RTE 编程挑战赛”——“赛道二 场景化白板插件应用开发” &#xff0c; 并凭借作品“成语解谜”获得了该赛道大奖。“成语解谜”是一个基于互动白板 SDK 的互动小游戏应用。通过前端编码、调用白板 API 能力、定制化后端逻辑等&#xff0…

刷题记录:牛客NC17509挖沟[prim+kruskal算法详解]

传送门:牛客 题目描述: 胡队长带领HA实验的战士们玩真人CS&#xff0c;真人CS的地图由一些据点组成&#xff0c;现在胡队长已经占领了n个据点&#xff0c;为了方 便&#xff0c;将他们编号为1-n&#xff0c;为了隐蔽&#xff0c;胡队长命令战士们在每个据点出挖一个坑&#x…

Cocos Creator 3.61所有工具软件的使用

文章目录Tiled-地图绘制软件下载安装基本使用点点就会了导入cocos编辑动画注意cocos导入TiledBigShear-图片裁剪为plist形式下载安装使用TexturePacker-使用plist文件产生精灵图集下载安装Tiled-地图绘制软件 下载安装 官网免费 Tiled官方 安装无要求 基本使用 点点就会了 导…

UE5 Meerkat狐獴演示Demo分析

1.特效的生成方式 1.1临时特效的生成&#xff1a;使用了已生成轨道临时创建该特效&#xff08;不用在场景中放入该特效&#xff0c;而是临时创建即可&#xff09;、系统生命周期轨道设置该特效的播放时长 1.2长期特效的生成&#xff1a;特效时长为该镜头片段长度 2.特效的类…

软考高级哪个好考?

软考高级有5个科目。 开发方向的有系统分析师&#xff0c;系统架构师&#xff1b; 网络方向的有网络规划与设计师&#xff1b; 信息系统方向的有信息系统项目管理师&#xff1b; 信息化服务方向的有系统规划与管理师。 考试题型 上午是9:00 — 11:30考综合知识&#xff0c;…

ROBOGUIDE软件:FANUC机器人多层堆焊功能介绍与示教编程操作方法

目录 机器人多层堆焊功能介绍 机器人跟踪路径数据指令介绍 机器人多层堆焊指令介绍 机器人弧焊焊接工作站创建 机器人多层堆焊示教编程 仿真运行 机器人多层堆焊功能介绍 在厚板焊接中进行多层堆焊焊接&#xff0c;以便多次焊接相同的部位而增大焊接宽度。通常情况下&am…

Java池化技术

在我们平常的编码中&#xff0c;通常会将一些对象保存起来&#xff0c;这主要考虑的是对象的创建成本。比如像线程资源、数据库连接资源或者 TCP 连接等&#xff0c;这类对象的初始化通常要花费比较长的时间&#xff0c;如果频繁地申请和销毁&#xff0c;就会耗费大量的系统资源…

Java-String 类·上

Java-String 类上1. 创建字符串2. 字符串比较相等3. 字符串常量池4. 理解字符串不可变大家好&#xff0c;我是晓星航。今天为大家带来的是Java String字符串相关知识点的讲解&#xff01;&#x1f600; 1. 创建字符串 常见的构造 String 的方式 // 方式一 String str "…

轻量化网络ShuffleNet 旷视

CVPR2018 人脸识别 脸部特效 张翔宇 什么是分组卷积 我们可以回忆一下 普通卷积 feature map有几个 我们的对应的卷积核就需要几个channel 然后我们学习这个 分组卷积 如图所示&#xff0c;前两个channel 有一个2个channel的卷积核负责&#xff0c;两个与两个对应 来自这…

学习.NET MAUI Blazor(四)、路由

Web应用程序的可以通过URL将多个页面串联起来&#xff0c;并且可以互相跳转。Web应用主要是使用a标签或者是服务端redirect来跳转。而现在流行的单页应用程序 (SPA) &#xff0c;则通过路由&#xff08;Router&#xff09;来实现跳转&#xff0c;如Vue 、React等。 提示 MAUI的…

C#一个网络小程序的逐步实现过程

经常要检测某些IP地址范围段的计算机是否在线。 有很多的方法&#xff0c;比如进入到网关的交换机上去查询、使用现成的工具或者编写一个简单的DOS脚本等等&#xff0c;这些都比较容易实现。 现在使用C#来完成。 1、简单上手 公用函数&#xff1a; public static long IPToLong…

传奇服务器容易受到什么攻击,怎么防御攻击?

有兄弟问明杰&#xff0c;说自己打算开服&#xff0c;听说攻击挺多的&#xff0c;就是想先了解一下开传奇用的服务器最容易受到什么类型的攻击&#xff0c;如果遇到了又改怎么防御呢&#xff1f;带着这个问题&#xff0c;明杰跟大家详细的说一下&#xff0c;常见的开区时候遇到…

Max Sum Plus Plus(DP 滚动数组优化)[HDU - 1024]

题目如下&#xff1a; 题目链接 Max Sum Plus Plus 题解 or 思路&#xff1a; 经典的动态规划问题 dp[i][j]dp[i][j]dp[i][j], 前 jjj 个物品&#xff0c; 我们分成题目要求的 iii 组 对于第 jjj 个物品&#xff0c; 我们可以将它分到 第 kkk 组中&#xff0c; 或者分到新的一…

前端八股文——笔试题

目录 前言 一、flex布局手写题目 二、移动端点击事件为什么有延迟&#xff1f;时间多久&#xff1f;如何解决这个问题&#xff1f; 1.meta标签里面content属性&#xff0c;设置禁止缩放。 2.设置默认宽度为浏览器宽度。 3.设置touch-action&#xff1a;manipulation。 4…

Chat-GPT从注册到搬进服务器

首先&#xff0c;我们要明白的一个事实是&#xff0c;不可能免费的成功搞定&#xff0c;得付出10几块得成本&#xff0c;我这个方法满打满算16块钱&#xff08;是不犯错得情况下&#xff0c;实际上我用了30多了&#xff09; 1.10元买个香港的服务器 不一定是香港的&#xff0c…

Day 04-Composition API_ref reactive 函数

1.ref函数 作用: 定义一个响应式的数据&#xff1b; 语法: const xxx ref(initValue) 创建一个包含响应式数据的引用对象&#xff08;reference对象&#xff0c;简称ref对象&#xff09;。 JS中操作数据&#xff1a; xxx.value 模板中读取数据: 不需要.value&#xff0c;直…

永恒之蓝(MS17-010)

目录追溯了解网络IP查找环境条件复现流程445端口使用MSF的永恒之蓝漏洞模块扫描模块攻击模块温馨提醒&#xff1a;纯水文&#xff0c;如果不幸翻到这篇文章&#xff0c;可以立刻关闭&#xff01; 先整理两个学习的链接&#xff08;本文学习第一个&#xff09;&#xff1a; htt…

JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK17特性讲解】

JDK各个版本特性讲解-JDK17特性 一、JAVA17概述 JDK 16 刚发布半年&#xff08;2021/03/16&#xff09;&#xff0c;JDK 17 又如期而至&#xff08;2021/09/14&#xff09;&#xff0c;这个时间点特殊&#xff0c;蹭苹果发布会的热度&#xff1f;记得当年 JDK 15 的发布也是同天…

Kafka Consumer auto.offset.reset 理解

先来一下 kafka 官网对于 auto.offset.reset 的解释&#xff1a; 上面的描述挺准确的&#xff0c;但如果没有相关背景会感觉很懵逼。网上也有很多文章讲这个东西并给了很多例子&#xff0c;看了之后总感觉没有理解清楚。 先来看一下怎么查看消费者 group 的 offset 情况&…