Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >系统化服务构建-调用链管理

系统化服务构建-调用链管理

作者头像
needrunning
发布于 2020-02-20 05:44:42
发布于 2020-02-20 05:44:42
1.7K00
代码可运行
举报
文章被收录于专栏:图南科技图南科技
运行总次数:0
代码可运行

这篇文章探讨应用开发中的调用链管理,涉及到的主要知识有日志,接口及服务的定义,监控和微服务注册。

调用链管理

调用链管理是服务架构中的一项基本职责,也是一项服务能力。主要使用 TraceId 和 SpanId,跟踪服务的调用依赖关系,串起整个服务调用路径,方便上下游服务的监控,管理。

先不用说微服务这么高大上的系统,通常的应用系统,在实现某项功能时,会涉及到各种外部依赖,或接口,或服务,或组件,整个调用链条的生命周期就是调用链管理。

关键概念

本文在谈论调用链管理时,有几个概念明确如下

上游服务(消费者)

上游服务是调用者所依赖的服务的统称,这里的服务可以是单独的接口,也可以是一组接口组成的功能集合。

实际上这里有一个核心问题是如何定义服务。

从接口数量的纬度,无论单个接口,多个接口组成的功能集合,多个功能组成的组件,都可以叫做服务。

从服务必备的属性来看,主要包括服务名(接口名),域名,URL(地址),方法和参数。

从微服务的概念纬度来看,服务包括服务提供者,和服务消费者。再深度一点,就涉及到服务注册中心的相关理论了。

本小节的上游服务,特指服务提供者。

下游服务(调用方)

调用方就是服务消费者,指服务的下游。

在某一项功能的调用链过程中,调用方就不仅仅局限在前端 Js 了,调用方更多的是下游服务。这里涉及到计算机网络的两种通信方式,C/S 方式和 P2P(点对点对等方式)。

P2P 点对点的核心解释就是网络上的计算节点既是服务的提供者,为其它计算节点提供服务,又是消费者,依赖于其它上游服务。

LevelId

调用链的唯一编号,一般由首次调用的发起者生成,全局唯一。

上游服务异常

“下游业务基于上游服务做业务,如何定义上游服务异常?

第一种情况

上游地址错误,造成访问异常,简单来说,接口没有返回,接口域名错误,接口地址错误 404,http 通道直接报错

第二种情况

上游地址域名正确,接口地址正确,但是服务停止了,接口返回 Null,尤其是基于 Java 的服务,有的开发者喜欢默认 Null 输出

以上两种情况 下游在处理时,可以以 ["message"] 的形式,统一定义【上游服务异常】状态码,进行错误直接输出,来标记服务没有获取到数据的情况。基于一个准则,做对外输出的统一化。

第三种情况

上游服务访问相应时间长,造成超时。

作为调用方如何捕获接口调用方的请求超时,是个值得研究的问题。

调用链管理的作用

进行调用链管理的目的是维护程序稳定,功能可用,保证应用系统的弹性。

通过调用链管理,可以快速定位问题,通过自定义【上游服务异常】状态码的方式,定位问题出现在上游服务层面,还是本服务的数据处理层面。

如果接口是跨部门调用的,明确定位问题节点,有利于部门之间划分权责。

下面阐述如何做调用链管理,主要包括生成链路 Id,记录请求输出日志,分析和预警。

生成链路 Id

“链路 Id 由前端生成还是后端生成?

图片是公开资料的一张 PPT

TrackId.png

链路 Id 由第一次调用的入口方生成,不一定是前端。

以下代码是 YII2 中链路 Id 生成示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static function createRequestId()
    {
        //$prefix = $module;
        $prefix = Yii::$app->controller->module->id;
        session_create_id(date('YmdHis'));
        // 使用uniqid()方法创建唯一id
        $requestId = strtoupper(md5(uniqid($prefix, true)));
        return $requestId;
    }

记录日志

形式化描述监控模型

以下描述摘录自一篇论文,文中的形式化描述的五元组的过程,实际上就是监控建模的过程。

“一次追踪有全局的 TraceId 来标识,追踪中的每个调用请求都有唯一的 LevelId, 为了更好地描述后续概念,这里我们首先对每个调用请求进行形式化描述。

LevelId 就是上文中的 TraceId 或者链路 Id

“定义 五元组 ?=(???????,???????,???h??,??????)来描述每个请求信息 所包含的特征信息,称之为特征向量。

LevelId 用来标识请求信息,LevelId 在一次追 踪中唯一,为多级编号。

Service 表示请求信息所请求的服务名称,

Method 表示请求信息调用的方法名称,

Params 表示请求信息所带参数集合。

程序在每个节点记录日志时,可以借助形式化描述的属性,进行记录,持久化方式可以以日志形式,也可以用数据库形式。

“如何检测请求超时?

第一种方式,借助于 HTTP 等调用组件的超时参数设置

第二种方式,服务器(服务方)检测时间差,客户端(请求方)请求时间与服务器(服务方)时间的差值与超时时间做对比

“当接口查询不到数据时,接口 code 应该如何设计?

接口下应该直接输出上游接口的 message,还是应该重新指定 messgae。

参考一种实现方式,对于【上游服务异常】的状态码进行统一,而【Message】进行原样输出。

但是有一点,需要保证输出到本系统的返回数据 json 结构是完整的,即符合

data message code

的结构,缺一不可。

不完整的输出结构,就意味着带给下游调用方更多的判断逻辑和沟通协调。

输出完整的 json 结构,方便调用方的统一管理和维护通讯协议的标准化,标准化就代表着低成本和高效率。

服务雪崩效应

多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应。服务雪崩效应是一种因“服务提供者”的不可用导致“服务消费者”的不可用,并将不可用逐渐放大的过程。

监控做到业务无侵入

监控能做到业务无侵入,可插拔 就是最高境界了。常规的应用系统很难做到这一点,也鲜有能力维护。横切关注点,边车模式都是实现业务无侵入的一些尝试方案。

横切关注点 AOP

软件开发过程中,横切关注点指的是散布于软件应用中多处的功能,这些功能 与业务逻辑相分离(但是往往又会直接内嵌在应用的业务逻辑之中)。把这些横切关 注点与业务逻辑进行解耦分离正是 AOP 要解决的问题。

常见的横切关注点有操作日志的生成、安全检测、事务处理等等,分布式追踪中对于追踪信息的采集记录也可以当做一个横切关注点。

总结

本文围绕调用链管理,对相关的概念和使用场景进行描述,总体来说,调用链管理也是有生命周期和通用实施策略的。

监控模型

首先使用链路 Id 作为串联,在各个计算节点记录完整的输入输出日志。

其次对日志进行一些常规分析,量化数据指标,对关键业务进行更加详细的记录和分析。

最后是及时的预警和反馈。

按照这样的步骤,最基础的调用链管理功能就完成了。如果要再深入研究,主要的方向就是结合日志,配合可视化 UI,在分布式链路跟踪上。

业界淘宝鹰眼就是基于网络调用日志的分布式跟踪系统,它可以分析网络请求在各个分布式系统之间的调用情况,从而得到处理请求的调用链上的入口 URL、应用服务的调用关系,从而找到请求处理瓶颈,定位错误异常的根源位置。

end2020年1月 山西

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 图南科技 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
天啦噜!生产机器连接数飙升到上万,背后发生了什么?
那是个月黑风高的夜晚,小黑哥成功将新版本发布到了生产,小心翼翼检查了应用日志,后续测试小姐姐验收成功。
andyxh
2020/02/18
6920
天啦噜!生产机器连接数飙升到上万,背后发生了什么?
网易考拉在服务化改造方面的实践
网易考拉(以下简称考拉)是网易旗下以跨境业务为主的综合型电商,自2015年1月9日上线公测后,业务保持了高速增长,这背后离不开其技术团队的支撑。微服务化是电商IT架构演化的必然趋势,网易考拉的服务架构演进也经历了从单体应用走向微服务化的整个过程,以下整理自网易考拉陶杨在近期Apache Dubbo Meetup上的分享,通过该文,您将了解到:
用户1516716
2019/05/07
9440
网易考拉在服务化改造方面的实践
golang 微服务容错处理是如何做的?
工作中,我们一般为了提高服务的健壮性,会去设置失败后重试机制,用来避免一些因为网络抖动,暂时性的故障
阿兵云原生
2023/09/01
1670
golang 微服务容错处理是如何做的?
面试官:面对千万级、亿级流量怎么处理?
这个《我想进大厂》系列的最后一篇,终结篇。可能有点标题党了,但是我想要表达的意思和目的是一致的。
艾小仙
2021/01/05
6760
面试官:面对千万级、亿级流量怎么处理?
微服务系列 2:微服务化框架的模型和治理能力设计
紧接上一篇,微服务系列 1:微服务化框架落地的挑战和核心需求,那么基于这些核心诉求,我们整个的微服务框架的模型是如何?又该具备哪些核心的治理能力呢?通过本文来一一知晓!
Allen.Wu
2023/03/01
8310
微服务系列 2:微服务化框架的模型和治理能力设计
大家都在说的微服务架构究竟指的是什么?
本篇将主要讲解微服务架构究竟指的是什么,它包括了哪些核心组件,它又能给我们带来哪些帮助。
brookwang
2022/06/24
8860
大家都在说的微服务架构究竟指的是什么?
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
【基础的内容考察 ——回答原则:简单的问题不能答错(一道面试题就能淘汰一个人),新手和老手都要注意】
寻求出路的程序媛
2024/08/05
2910
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
Dubbo介绍、原理
Dubbo是一个分布式服务框架,以及SOA治理方案。其功能主要包括:高性能NIO通讯及多协议集成,服务动态寻址与路由,软负载均衡与容错,依赖分析与降级等。
DannyHoo
2022/04/02
2.3K0
Dubbo介绍、原理
微服务架构的核心关键点
当我们架构微服务应用时首先遇到的一个问题是,作为消费者如何访问并调用服务提供者所提供的服务,作为服务提供者如何能让服务消费者知道并进行消费。在传统应用开发时,通常是在开发语言层面上解决这个问题,可能我们从来也没有考虑过这个问题,甚至可以说这个问题在传统开发时根本不存在。但在微服务架构下,同一个微服务可能同时存在多个实例,并且这些微服务实例还在不停上线、下线,那么它们如何相知、相识并进行通信呢?使用物理地址显然不行,因为不知道服务提供者到底在哪台服务器,服务当前是否仍然在线,如果服务不在线还进行调用岂不是造成调用失败?
玄姐谈AGI
2020/08/04
7970
微服务架构的核心关键点
Spring Cloud全解析:熔断之Hystrix简介
多个微服务之间调用的时候,微服务A调用微服务B,微服务B调用微服务C,如果微服务C出现问题或者响应时间过长,就会导致微服务A占用越来越多的系统资源,进而导致系统崩溃,称为服务雪崩,其是由于提供者不可用导致消费者不可用,并将不可用逐渐放大的过程
科技新语
2024/09/11
1590
Spring Cloud全解析:熔断之Hystrix简介
初探微服务架构
之前介绍了什么时候进行服务化,以及服务化拆分的两种方式即横向拆分和纵向拆分,还提到了引入微服务架构需要解决的问题。
武培轩
2019/10/12
6170
初探微服务架构
服务熔断与降级
在某个小乡镇的某个银行柜台,只有一个窗口办理业务,后边很多人在排队,业务办理很慢,突然间办理业务的电脑坏了、或者说工作人员午休或下班了,后边排队等待办理业务的并不知道前边什么情况,可能会继续排队。
叔牙
2020/11/19
2K0
服务熔断与降级
springcloud学习手册-Hystrix(服务容错保护)
导读 | Hystrix 服务容错保护 的概念和说明 大家看到这个图,千万可不要害怕啊!大家都知道这是什么吗? 这就是大名鼎鼎的:豪猪 豪猪的英文就是:Hystrix,国外一些大牛的程序员在给自己的架
程序源代码
2018/03/09
9620
springcloud学习手册-Hystrix(服务容错保护)
微服务架构组件分析
服务描述:服务调用首先解决的问题就是服务如何对外描述。 常用的服务描述方式包括 RESTful API、XML 配置以及 IDL 文件三种。
Java天坑
2018/10/21
8660
东方证券企业架构之技术架构转型实践
微服务架构是近几年受到各行业广泛追捧的技术之一,微服务架构具有轻型化、便捷化、敏捷化等特点,不仅能够适应业务创新和变化的需要,而且易于维护、变更、升级,契合当前证券业务发展的需要。然而向微服务架构转型也面临不少挑战,东方证券通过构建统一的服务治理框架,打造了一个多语言、多协议、可视化、灵活配置的服务管理平台,支持东方证券企业技术架构向以微服务为核心的现代化架构转型。本文将介绍东方证券 gRPC-Nebula 服务治理框架与星辰服务治理平台的建设成果,并介绍转型过程中的实践经验。
深度学习与Python
2020/09/14
9460
[微服务感悟] 服务雪崩与熔断器
之前工作中出现了这样的一个问题,有一个业务服务,它的功能是政府某部门的文件流转柜。那个业务中原本每个外部请求都有一个独立的线程池去处理任务,后来听说spring支持全局的线程池。我们为了便于管理所有的线程,于是用spring建立一个全局现场池,让所有异步请求都从spring提供的全局线程池拿线程执行。当时的异步调用有发送短信,同步政府某部门业务数据等功能。有一天,我们的客户反馈投件之后没有发送短信,我们查看日志发现是线程池中堆积了很多同步政府业务数据的任务,日志显示所有的同步数据的请求都超时了。考虑这个外部请求只会在一些极少数的校验业务中出现,不是主要业务,于是我们紧急的停掉了这个政府接口调用,重新上线,用户又可以收到短信了
逝兮诚
2020/02/13
8240
微服务架构-实现技术之三大关键要素3服务可靠性:服务访问失败的原因和应对策略+服务容错+服务隔离+服务限流+服务降级
例如由于日志文件过大导致硬盘无法写入、网络路由无效等可以通过调整硬件状态进行恢复的失败情况。
全栈程序员站长
2022/08/11
8070
微服务架构-实现技术之三大关键要素3服务可靠性:服务访问失败的原因和应对策略+服务容错+服务隔离+服务限流+服务降级
微服务相关原理与治理
微服务架构没有公认的技术标准和规范或者草案,但业界已经有一些很有影响力的开源微服务架构框架提供了微服务的关键思路,例如 Dubbo 和 Spring Cloud。
JQ实验室
2022/02/09
3240
微服务相关原理与治理
10 Dubbo 配置实战
文档地址 https://dubbo.apache.org/zh/index.html
用户7630333
2023/12/07
2610
10  Dubbo 配置实战
SpringCloud微服务构建浅析
Spring Cloud 作为Java 语言的微服务框架,它依赖于Spring Boot,有快速开发、持续交付和容易部署等特点。Spring Cloud 的组件非常多,涉及微服务的方方面面,井在开源社区Spring 和Netflix 、Pivotal 两大公司的推动下越来越完善。
程序大视界
2020/07/21
7000
SpringCloud微服务构建浅析
推荐阅读
相关推荐
天啦噜!生产机器连接数飙升到上万,背后发生了什么?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验