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

优采云 发布时间: 2021-10-10 03:36

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

  一、前言

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

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

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

  二、服务器信息采集

  服务器端信息采集的整体流程如下图所示。通过在应用容器(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(它为我们提供了第一次加载对象时动态修改字节码的能力。由于篇幅原因,不做详细解释,不明白的可以自行查阅资料)。在 UAV 中,通过 UAVServer 对外提供各种切点能力。

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

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

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

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

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

  五、轻量级调用链实现

  具体的UML图如下:

  

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

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

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

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

  5.1 分析请求信息

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

  5.2 逻辑导流

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

  5.3 初始化调用链上下文

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

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

  5.4 调用链信息输出

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

  5.5 服务间的上下文传输

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

  六、总结

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

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线