美文网首页
Spring5-WebClient之java探针开发总结复盘

Spring5-WebClient之java探针开发总结复盘

作者: 先生zeng | 来源:发表于2020-09-29 19:02 被阅读0次

WeClient请求适配

本文主要是对WeClient适配过程的一个总结,适配思路和注意点记录下来,以便后续开发。

1. 澄清需求

1.1. 需求描述

需要添加一个适配Springflux框架中的webClient,上报其请求相关调用链路以及参数。

1.2. 需求环境

webClient是Spring5框架相关的,jdk环境适配环境为:1.8及以上

使用依赖包:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webflux</artifactId>
  <version>5.2.9.RELEASE</version>
</dependency>

1.3. 需求详情及基础了解

WebClient是从Spring WebFlux 5.0版本开始提供的一个非阻塞的基于响应式编程的进行Http请求的客户端工具。它的响应式编程的基于Reactor的。WebClient中提供了标准Http请求方式对应的get、post、put、delete等方法,可以用来发起相应的请求。

可以参考HttpClient相关代码去获取对应的信息。

2. 适配开发思路

  1. 构建两个类InboundWrapper、InboundWrapper 分别去获取请求头(header)信息以及响应信息,这两个类分别实现InboundHeaders、InboundWrapper,使用装饰器模式,去包装源码框架中包含请求头信息和响应信息的类。
  1. 找要适配的框架中执行发出请求的真正方法以及能够获取到请求头信息的和响应信息的类。webClient框架中发出请求的入口只有一个,就是RequestHeadersSpec.exchange()
  2. 整体插码结构如下图所示 2-3:

图2-3:


补充说明: 正常在入口类都会有请求头等,响应信息的入参。webClient封装的比较特殊,需要在这两个类中获取到对应的uri入口信息。 这里我们可以看到了,所以我们在OutboundWrapper类中获取请求头信息的包装类就是WebClient$RequestHeadersSpec。

步骤四(核心):

插码的逻辑:

1.获取trace跟踪,跟踪方法,需要方法的类的字节码

ExitTracer tracer = AgentBridge.instrumentation.createTracer(this, WebClientUtils.exchangeMethod, null, TracerFlags.BACKEND_CALL | TracerFlags.LEAF);

2.获取跨容器状态

CrossProcessState crossProcessState = AgentBridge.getAgent().getCrossProcessState();

3.上报后端请求信息(tracer、当前调用链路(URI)信息)

WebClientUtils.report((BackendCall) tracer, brURI);

4.记录跨容器信息、trace信息

WebClientUtils.processOutboundHeader(crossProcessState, (BackendCall) tracer, (WebClient.RequestHeadersSpec) this);

5: 执行源代码逻辑

6.结束Trace探测

7.上报响应的信息

WebClientUtils.processResponse(crossProcessState, (BackendCall) tracer, response.block());
  1. trace返回 return;

    
    if (tracer != null) {
        tracer.finish(177/* RETURN */, response);
    }
    
  2. 返回源代码方法返回的值或者void

上报后端调用链路逻辑

注意(webClient 框架一般是记录http或者https)

拼接访问uri以及协议类型后,上报记录到trace

BackendCallParameter becp =
        BackendCallParameter.create(Backend.createBackend(BackendType.BACKEND_TYPE_HTTP, "HTTP", host, port, connURL), uri, uri);
backendCallTracer.reportBackendCall(becp);

把调用uri以及适配的类型加入到HTTP_URL、COMPONENT

执行响应信息处理

  1. 判断是否有响应

  2. 记录响应状态

    1. 小于400,则正常返回。 设置状态码http.status_code :
  3. 构建该类 InboundWrapper进行包装。获取响应的请求头,判断

    1. 解析服务端返回得响应头
代码:

执行请求头信息处理

解析请求端的请求头。

3. 遇到的问题

  1. 对webClient框架没接触过,不够了解其原理以及使用。
     2. 不熟悉使用,写代码时,对于代码调用的逻辑考虑不够,导致写代码时考虑的可能导致问题的点不够。
     3. 对于插码@BrWeave的使用还需要更深入的理解和多阅读server源码。
     4. 没有考虑线程安全并发修改的问题,导致阻塞在一个uri的获取上时间很久。
     5. 测试项目没有相关代码,需自己重新搭建一个。
     6. 查找webClient项目源代码,并找到相关入口。
  1. 压测遇到的问题。
  2. agent日志查找是否weave,插码、打印等相关问题。

4.遇到问题的解决

  1. 网站找最好官网去找例子,以及相关资料。

  2. 可以去gitlab上面找已经部署的项目使用webClient的例子,熟悉webClient相关的使用,思考编写时需要注意的问题。

  3. 对阅读关于@BrWeave的使用,平时多看看项目代码。

  4. 因为编写的是提供方,需要考虑一些线程安全的情况。

  5. 在github上面查找。

  6. 在官网下载源代码以及相关依赖。

  7. 开发完需要多多进行多种调用场景的压测。

  8. 借此多熟悉日志的使用,可以查看该项目下apm_proto 去找对应的信息打印。

建议的开发思路

  1. 先去找找server项目中是否有类似的例子或者同产品中的源代码,理解相关的插码思路。
  2. 熟悉要开发或者要适配的框架,相关原理以及使用例子。
  3. 编写前,先把整体适配逻辑写出来。
  4. 找要适配的框架的要进行插码的入口以及需要或许相关信息的入口
  5. 整合起来后,把整体思路在理一遍,进行编写。
  6. 开发完,在测试项目中进行跑一遍,同时压测下。在agent日志以及测试平台查看相关打印信息。
  7. 整理相关报告。

最重要的还是复盘: 提高开发效率。

相关文章

  • Spring5-WebClient之java探针开发总结复盘

    WeClient请求适配 本文主要是对WeClient适配过程的一个总结,适配思路和注意点记录下来,以便后续开发。...

  • 5/21 - 杏梅-复盘之总结经验篇

    5/21 - 杏梅-复盘之总结经验篇 复盘四步法: 回顾目标-评估结果-分析原因-总结经验 今天是了解复盘的最后一...

  • 【读书清单】虚舟 复盘 Day18

    #笨笨部落共读 复盘第二遍 什么是复盘 复盘=总结? 一提到复盘,很多人就会想到总结。其实,复盘不等于总结,复盘只...

  • 复盘的重要性

    坚持每天对工作,生活学习 复盘,复盘,复盘 总结,总结,总结 改进,改进,改进 提升,提升,提升

  • 复盘管理

    什么是复盘管理? 每天复盘,每周复盘,每月复盘。 复盘的作用是什么? 复盘就是让我们总结经验,总结失败,更好的策略...

  • 《如何成为专家》总结出牛人

    毛泽东说:我靠总结吃饭。 总结,即复盘。 01.时间点:即时 001.对人:年复盘、季度复盘、月复盘、周复盘、日复...

  • 读虚舟《复盘》有感:我们不是缺思考,而是缺复盘

    复盘误区 1,复盘不等于总结。 总结有很多形式,复盘是总结的一种。 无论复盘 调研还是头脑风暴都是总结的一种形式,...

  • Day4《复盘》虚舟

    #笨笨部落读书营 读书进展:第三章 1.复盘误区 ①复盘=总结? 复盘不等同于总结,复盘只是总结的一部分。 复盘是...

  • 【读书清单】虚舟 复盘Day5

    #笨笨部落共读 读书进度第三章 复盘的常见误 1.复盘=总结? 复盘不第于总结,复盘只是总结的一部分。 2.复盘=...

  • 2021-06-15读虚舟《复盘》第三、四章

    #读虚舟《复盘》#笨笨部落 DAY8 001 复盘不是总结 我们通常会把总结当成复盘,但复盘不等于总结,它仅作为总...

网友评论

      本文标题:Spring5-WebClient之java探针开发总结复盘

      本文链接:https://www.haomeiwen.com/subject/nyaeuktx.html