WeClient请求适配

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

1. 澄清需求

1.1. 需求描述

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

1.2. 需求环境

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

使用依赖包:

org.springframework

spring-webflux

5.2.9.RELEASE

1.3. 需求详情及基础了解

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

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

2. 适配开发思路

构建两个类InboundWrapper、InboundWrapper 分别去获取请求头(header)信息以及响应信息,这两个类分别实现InboundHeaders、InboundWrapper,使用装饰器模式,去包装源码框架中包含请求头信息和响应信息的类。

找要适配的框架中执行发出请求的真正方法以及能够获取到请求头信息的和响应信息的类。webClient框架中发出请求的入口只有一个,就是RequestHeadersSpec.exchange()

整体插码结构如下图所示 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());

trace返回 return;

if (tracer != null) {

tracer.finish(177/* RETURN */, response);

}

返回源代码方法返回的值或者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

执行响应信息处理

判断是否有响应

记录响应状态

小于400,则正常返回。 设置状态码http.status_code :

构建该类 InboundWrapper进行包装。获取响应的请求头,判断

解析服务端返回得响应头

代码:

执行请求头信息处理

解析请求端的请求头。

3. 遇到的问题

1. 对webClient框架没接触过,不够了解其原理以及使用。

2. 不熟悉使用,写代码时,对于代码调用的逻辑考虑不够,导致写代码时考虑的可能导致问题的点不够。

3. 对于插码@BrWeave的使用还需要更深入的理解和多阅读server源码。

4. 没有考虑线程安全并发修改的问题,导致阻塞在一个uri的获取上时间很久。

5. 测试项目没有相关代码,需自己重新搭建一个。

6. 查找webClient项目源代码,并找到相关入口。

压测遇到的问题。

agent日志查找是否weave,插码、打印等相关问题。

4.遇到问题的解决

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

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

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

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

在github上面查找。

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

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

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

建议的开发思路

先去找找server项目中是否有类似的例子或者同产品中的源代码,理解相关的插码思路。

熟悉要开发或者要适配的框架,相关原理以及使用例子。

编写前,先把整体适配逻辑写出来。

找要适配的框架的要进行插码的入口以及需要或许相关信息的入口

整合起来后,把整体思路在理一遍,进行编写。

开发完,在测试项目中进行跑一遍,同时压测下。在agent日志以及测试平台查看相关打印信息。

整理相关报告。

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

webclient java_Spring5-WebClient之java探针开发总结复盘相关推荐

  1. java探针开发使用_Java探针技术-retransformclasses的介绍

    下一代USB接口将支持双向拔插,于明年亮相 近日,USB接口标准制定组织表示新一代USB接口将于明年年中亮相,而其名称目前被暂定为了USB Type-C.该组织表示USB Type-C标准将允许制造商 ...

  2. SAP CRM WebClient UI和Hybris backoffice UI开发的相同点

    CRM WebClient和Hybris backoffice的UI开发都不需要开发人员手写原生的html代码. CRM WebClient UI 在CRM WebUI workbench里,开发人员 ...

  3. java webclient post_Java WebClient.post方法代碼示例

    本文整理匯總了Java中org.apache.cxf.jaxrs.client.WebClient.post方法的典型用法代碼示例.如果您正苦於以下問題:Java WebClient.post方法的具 ...

  4. java探针之修改类字节码文件

    java探针利用了javaAgent + ASM字节码注入工具实现了动态修改类文件的功能.像skywalking和arthas都使用到了这个技术. 具体原理为: jdk1.5以后引入了javaAgen ...

  5. java agent 开发_IDEA + maven 零基础构建 java agent 项目

    Java Agent(java 探针)虽说在 jdk1.5 之后就有了,但是对于绝大多数的业务开发 javaer 来说,这个东西还是比较神奇和陌生的:虽说在实际的业务开发中,很少会涉及到 agent ...

  6. 【JAVA基础☞探针技术】Java探针-Java Agent技术

    个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 1.原理:基于javaAgent和Java字节码注入技术的java探针工具技术原理 2.原理分析 动态代理功能实现说明,我们利用ja ...

  7. jeecgboot前端开发_一款基于代码生成器的Java快速开发平台【jeecg-boot】

    原标题:一款基于代码生成器的Java快速开发平台[jeecg-boot] 今天给大家介绍一个后台脚手架框架:jeecg-boot 来看看官方怎么介绍的. 一款基于代码生成器的Java快速开发平台!全新 ...

  8. java基础(十三)-----详解内部类——Java高级开发必须懂的

    java基础(十三)-----详解内部类--Java高级开发必须懂的 目录 为什么要使用内部类 内部类基础 静态内部类 成员内部类 成员内部类的对象创建 继承成员内部类 局部内部类 推荐博客 匿名内部 ...

  9. 【JAVA零基础入门系列】Day2 Java集成开发环境IDEA

    [JAVA零基础入门系列](已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day ...

最新文章

  1. bootstrap3 商品列表_Bootstrap3基础 list-inline 无序列表横向显示
  2. jupyternotebook运行python_jupyter notebook参数化运行python方式
  3. php新建文件在指定目录下,PHP在获取指定目录下的目录,在获取的目录下面再创建文件,多平台...
  4. python登录网页账号密码_遇到需要登录的网站怎么办?学好python,用这3招轻松搞定...
  5. oracle pctlist,oracle pctfree和pctused详解
  6. 公开课精华 | 无人驾驶中感知的挑战与尝试
  7. hdu 3371 Connect the Cities(prim算法)
  8. 熊猫删除重复行– drop_duplicates()函数
  9. win7安装Python所需资源
  10. 把java代码导成pdf_Java将Excel导出成pdf文件
  11. excel筛选中文或者筛选数字
  12. base scroll横向滚动_微信小程序实践:2.3 可滚动的容器组件之 scroll-view
  13. 华三交换机怎么样?H3C交换机产品系列介绍!
  14. 软著申请--学生以学校名义申请软著
  15. 近10年NBA球队常规赛排名变化——tableau 实现bump chart
  16. ASCⅡCharacters (ASCⅡ码对照表)
  17. 在线阅读-阿里Java开发手册最强版本【泰山版】
  18. 使用unity粒子系统制作烟花
  19. python绘制气象等值线图_气象要素场等值线图自动绘制
  20. C++ Reference: Standard C++ Library reference: C Library: cstdio: stdout

热门文章

  1. sql 删除最早的一条记录
  2. csharp 遇到的问题及解决方法:
  3. 霍尼韦尔将为新西兰最高的地标公寓建筑提供楼宇管理系统
  4. 怎么独立使用Modelsim进行工程仿真
  5. 华为云号码隐私保护AXB AXYB模式代码二次封装
  6. 基于ssm框架超市销售管理系统
  7. WPS 2007艺术字实用操作技巧
  8. Linux学习——流刷新定位、格式化输入和输出
  9. 轻松调节磁盘大小--利用diskgenius实现磁盘空间再分配
  10. iOS开发中利用AFNetWorking判读网络是否连接