返回顶部
首页 > 资讯 > 精选 >request轻调用链怎么实现
  • 642
分享到

request轻调用链怎么实现

2023-06-04 23:06:09 642人浏览 薄情痞子
摘要

这篇文章主要介绍“request轻调用链怎么实现”,在日常操作中,相信很多人在request轻调用链怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”request轻调用链怎么实现”的疑惑有所帮助!接下来

这篇文章主要介绍“request轻调用链怎么实现”,在日常操作中,相信很多人在request轻调用链怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”request轻调用链怎么实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、前言

介绍调用链的服务端信息收集以及服务间上下文传递。

二、服务端信息收集

服务端信息收集整体流程如下图所示,通过在应用容器Tomcat等)启动过程中植入切点从而实现在应用逻辑执行之前和之后对请求进行劫持。

  • 应用逻辑执行之前:解析request中调用链信息,并初始化调用链上下文;

  • 应用逻辑执行之后:解析response中调用链信息,并将本次请求处理的所有调用链信息输出到日志文件。

request轻调用链怎么实现

三、切点植入

在介绍切点之前我们应该对servlet容器(本文以tomcat为例)处理一次请求的大致流程有一个整体的了解。

request轻调用链怎么实现

图片来源于网络

在Connector接收到一次连接并转化成请求(Request)后,会将请求传递到Engine的管道(Pipeline)的阀(ValveA)中。请求在Engine的管道中会传递到Engine Valve这个阀中。接着请求会从Engine Valve传递到一个Host的管道中,在该管道中传递到Host Valve这个阀里。接着从Host Valve传递到一个Context的管道中,在该管道中传递到Context Valve中。接下来请求会传递到Wrapper C内的管道所包含的阀Wrapper Valve中,在这里会经过一个过滤器链(Filter Chain),最终送到一个Servlet中。借助于tomcat的这种架构设计,我们可以通过在tomcat处理一次请求的生命周期过程中植入自己的逻辑,将tomcat对外提供的能力进行一次增强,即UAV的中间件增强技术。

中间件增强技术除了巧妙运用了tomcat容器的架构设计之外还借助了java Instrumentation(它给我们提供了一种能够在对象第一次加载时动态修改字节码的能力,由于篇幅原因在此不进行详细讲解,不明白的小伙伴自行查阅资料)。在UAV中通过UAVServer对外提供各种切点能力。

有了中间件增强技术,在应用逻辑执行之前和之后的切点就有了,接下来就是在这些切点位置执行我们自己的调用链逻辑了。

四、中间件增强技术在调用链中的使用

上文介绍的间件增强技术是一种通过使用javaagent方式动态地在tomcat代码中植入切点代码并以UAVServer的形式对外提供能力的框架(具体能力后续文章会详细介绍)。轻调用链实现正是使用了UAVServer对外提供的GlobalFilterHandler能力。

GlobalFilterHandler: 这里的GlobalFilterHandler是中间件增强技术中的一种能力,与传统的filter没有任何关系。它对外提供了四个能力:

  • doRequest:在所有应用处理请求之前进行劫持;

  • doResponse:在所有应用处理请求之后进行劫持;

  • BlockHandlerChain:阻塞自当前handler以后的所有handler,此处的handler为注册在当前;

  • BlockFilterChain阻塞自当前Filter以后的所有Filter。

调用链借助于GlobalFilterHandler提供的前两个能力,实现了在应用处理请求之前和之后执行调用链逻辑的功能。

五、轻调用链实现

具体UML图如下:

request轻调用链怎么实现

从UML图中可以清晰地看到, InvokeChainSupporter(调用链实现逻辑入口和调用链所需资源初始化实现类)将中间件增强技术进行了二次增强。它允许使用者在其中注册不同的handler,并且在handler的preCap和doCap(中间件增强技术中的逻辑执行之前和之后的切点术语)方法之前和之后动态织入adapter,从而能够执行更多的定制化适配和个性化逻辑。所有supporter和adapter均采用反射调用方式,最大程度上减少了中间件增强技术的依赖。

有了二次增强技术,我们就可以开始下面的调用链绘制工作了。

轻调用链绘制实现主要依赖于注册在InvokeChainSupporter上的ServiceSpanInvokeChainHandler。主要绘制过程如下:

  • 解析请求信息,提取其中调用链关心的信息,并将解析出来的信息放入上下文中;

  • 通过解析出来的请求头信息进行逻辑分流,根据不同的协议类型就行不同的逻辑处理; ✔MQ逻辑 ✔Http逻辑 ✔dubbo逻辑

  • 初始化调用链上下文,并初始化main span上下文;

  • 在应用处理完请求之后,将调用链信息进行统一输出。

下面来看一下具体每一步都做了什么。

5.1 解析请求信息

对于像tomcat这类中间件容器,所有进入tomcat的请求都会被封装成httpservletRequest和HttpServletResponse(后面简称request和response)最终进入用户的servlet中。调用链借助于中间件增强技术会在用户逻辑处理之前将request和response进行一次拦截,并解析其中是否含有调用链信息。如果有则将调用链信息进行封装放入上下文中。

5.2 逻辑分流

由于不同协议对应的调用链绘制逻辑也不同,此处调用链会根据协议类型进行一次分发。

5.3 初始化调用链上下文

将调用链上下文中的信息进行解析:

  • 没有父节点则将当前节点当作初始化节点,并初始化记录当前服务内调用链信息的main span;

  • 有父节点则根据父节点信息初始化当前节点,并初始化记录当前服务内调用链信息的main span。

main span:在服务内可能会进行多次客户端通讯或服务间通讯,需要一个main span来记录当前服务内调用链最后一个节点的信息。

5.4 调用链信息输出

在用户逻辑处理结束之后,调用链记录器会从上下文中取出当前服务的调用链信息并将其输出到指定日志路径。

5.5 服务间上下文传递

对于不同协议调用链传递信息方式也略有不同,具体实现方式借助了中间件增强技术提供的另一个能力:AppFrkHook(简称hook,此功能在客户端调用链实现时会进行具体介绍)。它能够对用户使用的客户端技术进行劫持,如用户使用了httpclient进行通讯,则对httpclient进行劫持并动态织入代码,从而达到在http通讯的过程中注入调用链上下文信息的效果。目标服务在解析请求信息时,将调用链上下文进行解析;在初始化调用链上下文逻辑时,使用传递过来的信息初始化目标服务的调用链上下文,实现跨系统调用时调用链连接。

到此,关于“request轻调用链怎么实现”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: request轻调用链怎么实现

本文链接: https://lsjlt.com/news/240395.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • request轻调用链怎么实现
    这篇文章主要介绍“request轻调用链怎么实现”,在日常操作中,相信很多人在request轻调用链怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”request轻调用链怎么实现”的疑惑有所帮助!接下来...
    99+
    2023-06-04
  • Python怎么实现链式调用
    为什么是链式调用?链式调用,或者也可以称为方法链(Method Chaining),从字面意思上来说就是将一些列的操作或函数方法像链子一样穿起来的 Code 方式。我最开始感知链式调用的「美」,还要从使用 R 语言的管道操作符开始。libr...
    99+
    2023-05-15
    Python
  • Python如何实现链式调用
    本篇内容介绍了“Python如何实现链式调用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!为什么是链式调用?链式调用,或者也可以称为方法链(...
    99+
    2023-07-06
  • Node.js实现链式回调
    由于异步的关系,代码的书写顺序可能和执行顺序并不一样,可能想先执行A再执行B,但由于异步可能B要先于A执行.例如在OC中使用AFnetworking请求数据然后刷新页面,由于网络请求...
    99+
    2024-04-02
  • python中如何实现链式调用
    我们在使用Django的models查询数据库时,可以看到有这种写法: form app.models import XXX query ...
    99+
    2024-04-02
  • Python怎么用request库实现翻译接口
    request库的基本使用安装要使用Python中的requests库,首先需要使用pip安装它。您可以在终端中运行以下命令来完成此操作:pip install requests使用安装库后,您可以使用它来进行HTTP请求。以下是如何进行G...
    99+
    2023-05-14
    Python request
  • javascript如何实现简单链式调用
    小编给大家分享一下javascript如何实现简单链式调用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体如下:jQuery用...
    99+
    2024-04-02
  • jQuery如何实现链式插件调用
    这篇文章给大家分享的是有关jQuery如何实现链式插件调用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。链式插件调用jQuery允许“链式”插件的方法调用,以减轻反复查询DOM并...
    99+
    2024-04-02
  • python如何实现链式函数调用
    这篇文章主要介绍了python如何实现链式函数调用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。链式函数调用感谢你能够认真阅读完这篇文章,希...
    99+
    2024-04-02
  • python中实现链式调用的案例
    小编给大家分享一下python中实现链式调用的案例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!我们在使用Django的models查询数据库时,可以看到有这种写...
    99+
    2023-06-14
  • 怎么用rust实现单链表
    这篇文章将为大家详细讲解有关怎么用rust实现单链表,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言今天的目标是用rust实现一个简单的单链表LinkedList,同时为此链表提供从头部插入元素(头插法...
    99+
    2023-06-29
  • 如何在JavaScript中实现链式调用(chaining)?
    聚沙成塔·每天进步一点点 ⭐ 专栏简介⭐ JavaScript中的链式调用⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏...
    99+
    2023-09-14
    javascript 开发语言 ecmascript 前端框架 前端 原力计划
  • 怎么用Python实现单向链表
    这篇文章主要介绍“怎么用Python实现单向链表”,在日常操作中,相信很多人在怎么用Python实现单向链表问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Python实现单向链表”的疑惑有所帮助!接下来...
    99+
    2023-06-30
  • 怎么用Python实现双向链表
    这篇文章主要介绍“怎么用Python实现双向链表”,在日常操作中,相信很多人在怎么用Python实现双向链表问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Python实现双向链表”的疑惑有所帮助!接下来...
    99+
    2023-06-30
  • 怎么使用PHP实现长链接
    这篇文章主要介绍了怎么使用PHP实现长链接的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用PHP实现长链接文章都会有所收获,下面我们一起来看看吧。长链接(Long Connection),也称为持久连接(...
    99+
    2023-07-05
  • SpringBoot+MDC实现链路调用日志的方法
    目录1.首先介绍什么是MDC1.1MDC作用2.MDC结合logback的使用demo4.多线程下MDC工具类5.自定义线程池6.线程池配置类7.测试接口8.异步的业务类1.首先介绍...
    99+
    2022-12-20
    SpringBoot MDC链路调用日志 SpringBoot MDC链路调用日志
  • C++中怎么调用C链接库
    本篇文章给大家分享的是有关C++中怎么调用C链接库,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。C++调用C链接库,其实相对C调用C++。因为C++本来就向下兼容C吧但由于编译...
    99+
    2023-06-17
  • dubbo怎么实现rpc调用
    Dubbo是一个基于Java的高性能RPC框架,可以实现远程服务的调用。以下是使用Dubbo实现RPC调用的步骤:1. 定义服务接口...
    99+
    2023-10-23
    dubbo
  • Java 实现分布式服务的调用链跟踪
    目录为什么要实现调用链跟踪?如何实现?第一步,看图、看场景,用户浏览器的一次请求行为所走的路径是什么样的第二步,实现。不想看代码可直接拉最后看结果和原理测试一下结果:为什么要实现调用...
    99+
    2024-04-02
  • SpringBootMDC全链路调用日志跟踪实现详解
    目录MDC 介绍API 说明MDC 使用添加拦截器修改日志格式常见问题子线程日志打印丢失 traceIdMDC 介绍 MDC(Mapped Diagnostic Context,映...
    99+
    2023-02-08
    SpringBoot MDC日志跟踪 SpringBoot MDC全链路调用
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作