调用链系列(2):服务端信息收集以及服务间上下文传递

优采云 发布时间: 2021-08-17 05:10

  调用链系列(2):服务端信息收集以及服务间上下文传递

  一、前言

  调用链系列(1):UAVStack中贪吃蛇的解读

  上一篇文章分享了调用链的模型设计和模型时序图。相信大家通过上一篇文章对调用链有了一个整体的了解,比如:调用链是什么,能做什么,总体实现策略。

  在这个文章我们继续介绍调用链的服务端信息采集和服务间的上下文传递。

  二、server 信息采集

  服务端信息采集的整体流程如下图所示。通过在应用容器(tomcat等)的启动过程中植入切入点,可以在应用逻辑执行前后对请求进行劫持。

  

  三、切点植入

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

  

  图片来源于网络

  Connector 收到连接并转换成请求(Request)后,会将请求传递给 Engine 的管道(Pipeline)的阀门(ValveA)。该请求将被传递到引擎管道中的引擎阀门。然后请求将从 Engine Valve 传递到 Host 管道,并在管道中传递到 Host Valve 阀门。然后从Host Valve传递给一个Context管道,再传递给管道中的Context Valve。接下来,请求将被传递到收录在 Wrapper C 中的管道中的 Wrapper Valve,在那里它会通过一个过滤器链,最后发送到一个 Servlet。借助tomcat的这种架构设计,我们可以通过在tomcat处理请求的生命周期中植入我们自己的逻辑,即无人机中间件增强技术,来增强tomcat的外部能力。

  中间件增强技术除了巧妙利用了tomcat容器的架构设计之外,还使用了java Instrumentation(它为我们提供了在第一次加载对象时动态修改字节码的能力,由于空间原因原因这里就不详细解释了,不明白的可以自行查资料)。在无人机中,通过UAVServer对外提供各种切点能力。

  采用中间件增强技术,应用逻辑执行前后都有切点。下一步是在这些切点处执行我们自己的调用链逻辑。

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

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

  GlobalFilterHandler:这里的GlobalFilterHandler是中间件增强技术中的一种能力,与传统过滤器无关。它提供了四种外部功能:

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

  五、Light 调用链实现

  具体的UML图如下:

  

  从UML图中可以明显看出InvokeChainSupporter(调用链实现逻辑入口的实现类和调用链所需的资源初始化实现类)对中间件增强技术进行了第二次增强。它允许用户在其中注册不同的处理程序,并在处理程序的 preCap 和 doCap(中间件增强技术中的逻辑执行前后的切入点术语)方法之前和之后将适配器动态编织到适配器中,以便能够执行更多定制化适配和个性化逻辑。所有支持者和适配器都采用反射调用方式,最大限度地减少了对中间件增强技术的依赖。

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

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

  我们来看看每一步都做了什么。

  5.1 解析请求信息

  对于像tomcat这样的中间件容器,所有进入tomcat的请求都会被封装成HttpServletRequest和HttpServletResponse(以下简称请求和响应),最后进入用户的servlet。借助中间件增强技术,调用链会在处理用户逻辑之前拦截一次请求和响应,并分析其中是否收录调用链信息。如果是,则将调用链信息封装到上下文中。

  5.2 逻辑分流

  因为不同协议对应的调用链的绘制逻辑也不同,这里会根据协议类型分配一次调用链。

  5.3 初始化调用链上下文

  分析调用链上下文中的信息:

  主span:服务中可能有多个客户端通信或服务间通信,需要一个主span来记录当前服务中调用链最后一个节点的信息。

  5.4 调用链信息输出

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

  5.5 服务间的上下文传输

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

  六、Summary

  阅读本文后,读者应该对中间件增强技术的实现有一个大致的了解,对其提供的GlobalFilterHandler能力有一定的了解。对于调用链,你应该了解绘制服务器和服务之间调用链的整个过程。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线