当前位置: 首页 > news >正文

关于repeater录制的流量子调用的identity中带有~S的情况

前段时间同事问我,我们录制的流量中,尤其是dubbo的子调用显示经常他的末尾会带上一个小尾巴这个是什么意思呢,其实之前我没有太在意这个事情,只是同事这么疑问了,确实激起了好奇心,所以就差了下 到底是什么

我们先看下是什么样的现象, 如下图所示:
在这里插入图片描述

如上, 这里就会跟上一个~AP 的小尾巴,那这个到底是什么意思呢,是某个hash的结果吗?要了解这个,其实也不难,我们就看下dubbo子调用的identity是怎么赋值的就好了。所以我们来看下具体的逻辑

在录制过程中,事件过来的时候,如果是Before的情况下,就会进入如下内容,

protected void doBefore(BeforeEvent event) throws ProcessControlException {// 回放流量;如果是入口则放弃;子调用则进行mockif (RepeatCache.isRepeatFlow(Tracer.getTraceId())) {processor.doMock(event, entrance, invokeType);return;}Invocation invocation = initInvocation(event);invocation.setStart(System.currentTimeMillis());invocation.setTraceId(Tracer.getTraceId());invocation.setIndex(entrance ? 0 : SequenceGenerator.generate(Tracer.getTraceId()));invocation.setIdentity(processor.assembleIdentity(event));invocation.setEntrance(entrance);invocation.setType(invokeType);invocation.setProcessId(event.processId);invocation.setInvokeId(event.invokeId);invocation.setRequest(processor.assembleRequest(event));invocation.setResponse(processor.assembleResponse(event));invocation.setSerializeToken(ClassloaderBridge.instance().encode(event.javaClassLoader));try {// fix issue#14 : useGeneratedKeysif (processor.inTimeSerializeRequest(invocation, event)) {SerializerWrapper.inTimeSerialize(invocation);}} catch (SerializeException e) {Tracer.getContext().setSampled(false);log.error("Error occurred serialize", e);}RecordCache.cacheInvocation(event.invokeId, invocation);
}

所以identity 是经过各自的子调用处理器处理后生成的标识。这里我们具体的就是dubbo的调用,所以我们看下 DubboConsumerInvocationProcessor 的逻辑

public Identity assembleIdentity(BeforeEvent event) {Object invoker;Object invocation;if (ON_RESPONSE.equals(event.javaMethodName)) {// for record identity assemble// onResponse(Result appResponse, Invoker<?> invoker, Invocation invocation) {}invoker = event.argumentArray[1];invocation = event.argumentArray[2];} else {// for repeater identity assemble// invoke(Invoker<?> invoker, Invocation invocation)invoker = event.argumentArray[0];invocation = event.argumentArray[1];}try {// methodNameString methodName = (String) MethodUtils.invokeMethod(invocation, "getMethodName");Class<?>[] parameterTypes = (Class<?>[]) MethodUtils.invokeMethod(invocation, "getParameterTypes");// interfaceNameString  interfaceName = ((Class)MethodUtils.invokeMethod(invoker, "getInterface")).getCanonicalName();return new Identity(InvokeType.DUBBO.name(), interfaceName, getMethodDesc(methodName, parameterTypes), getExtra());} catch (Exception e) {// ignoreLogUtil.error("error occurred when assemble dubbo request", e);}return new Identity(InvokeType.DUBBO.name(), "unknown", "unknown", null);
}

我们看到Identity 直接就是通过 new Identity(InvokeType.DUBBO.name(), interfaceName, getMethodDesc(methodName, parameterTypes), getExtra()) 完成的。 所以这的参数按照前面截图的来看的话,

  1. InvokeType.DUBBO.name()dubbo,

  2. interfaceName 则是 com.xx.xx.api.service.UserAgreementApiService

  3. getMethodDesc(methodName, parameterTypes) 这个看了下实现原来就是我们一直在寻找的带小尾巴的原因了, 我们来看下。

    protected String getMethodDesc(String methodName, Class<?>[] parameterTypes) {StringBuilder builder = new StringBuilder(methodName);if (parameterTypes != null && parameterTypes.length > 0) {builder.append("~");for (Class<?> parameterType : parameterTypes) {String className = parameterType.getSimpleName();builder.append(className.subSequence(0, 1));}}return builder.toString();}
    

    我们可以看到它这里就是就是在拼接方法跟参数类型,不过他没有拿参数类型的所有内容,而是参数类型的类名,比如说 Java.lang.String 结果就是string 了, 然后取这里的第一个字符。

  4. getExtra() 暂时位置,看着是http的query的字段, 不过看到所有的录制的子调用录制逻辑基本都是null, 我们这里暂时就先忽略了。

那我们就直接看下Identity 的构造函数是怎么样的吧。

public Identity(String scheme, String location, String endpoint, Map<String, String> extra) {this.scheme = scheme;this.location = location;this.endpoint = endpoint;this.extra = extra;StringBuilder sb = new StringBuilder();sb.append(scheme).append(HOST_SPLITTER).append(Joiner.on("/").join(location, endpoint));if (extra != null && !extra.isEmpty()) {boolean firstKey = true;for (Map.Entry<String, String> entry : extra.entrySet()) {if (firstKey) {firstKey = false;sb.append(QUERY_STRING_COLLECTOR);} else {sb.append(KEY_VALUE_SPLITTER);}sb.append(entry.getKey()).append(KEY_VALUE_COLLECTOR).append(entry.getValue());}}this.uri = sb.toString();}

可以看到构造函数里面的逻辑其实重点是在构造一个uri, 而这个uri 应该就是我们最开始截图的时候看到的identity的内容了。 其实就是通过各个分隔符连接起来,构成我们传参进来的数据。

相关文章:

关于repeater录制的流量子调用的identity中带有~S的情况

前段时间同事问我&#xff0c;我们录制的流量中&#xff0c;尤其是dubbo的子调用显示经常他的末尾会带上一个小尾巴这个是什么意思呢&#xff0c;其实之前我没有太在意这个事情&#xff0c;只是同事这么疑问了&#xff0c;确实激起了好奇心&#xff0c;所以就差了下 到底是什么…...

Java面试题队列

Java中的队列都有哪些&#xff0c;有什么区别 1. ArrayDeque, &#xff08;数组双端队列&#xff09; 2. PriorityQueue, &#xff08;优先级队列&#xff09; 3. ConcurrentLinkedQueue, &#xff08;基于链表的并发队列&#xff09; 4. DelayQueue, &#xff08;延期…...

大型Saas系统的权限体系设计(二)

X0 上期回顾 上文《大型Saas系统的权限体系设计(一)》提到2B的Saas系统的多层次权限体系设计的难题&#xff0c;即平台、平台的客户、客户的客户&#xff0c;乃至客户的客户的客户如何授权&#xff0c;这个可以通过“权限-角色-岗位”三级结构来实现。 但这个只是功能权限&am…...

HTML(四) -- 多媒体设计

目录 1. 视频标签 2. 音频标签 3. 资源标签&#xff08;定义媒介资源 &#xff09; 1. 视频标签 属性值描述autoplayautoplay如果出现该属性&#xff0c;则视频在就绪后马上播放。controlscontrols表示添加标准的视频控制界面&#xff0c;包括播放、暂停、快进、音量等…...

设置苹果电脑vsode在新窗口中打开文件

0、前言 最近切换到mac电脑工作&#xff0c;又得重新安装一些工具软件并设置。虽然这些设置并表示啥复杂的设置&#xff0c;但是久了不设置还是会忘记。于是记录之&#xff0c;也希望给能帮助到需要的人。 我们使用vscode阅读或者编辑文件时&#xff0c;有时候希望同时打开多…...

第二章创建模式—单例设计模式

文章目录 单例模式的结构如何控制只有一个对象呢怎么设计这个类的内部对象外部怎么访问 单例模式的主要有以下角色 单例模式的实现饿汉式 1&#xff1a;静态变量饿汉式 2&#xff1a;静态代码块懒汉式 1&#xff1a;线程不安全懒汉式 2&#xff1a;线程安全—方法级上锁懒汉式 …...

数据结构学习记录——堆的插入(堆的结构类型定义、最大堆的创建、堆的插入:堆的插入的三种情况、哨兵元素)

目录 堆的结构类型定义 最大堆的创建 堆的插入 堆的插入的三种情况 代码实现 哨兵元素 堆的结构类型定义 #define ElementType int typedef struct HNode* Heap; /* 堆的类型定义 */ struct HNode {ElementType* Data; /* 存储元素的数组 */int Size; /* 堆中…...

netperf测试

netperf测试 目录 批量网络流量性能测试 TCP_STREAM测试UDP_STREAM 测试请求/应答网络流量测试 TCP_RR TCP_CRR Netperf 是一个网络性能测试工具&#xff0c;它可以测试网络协议栈的性能&#xff0c;例如TCP和UDP协议。Netperf可以测量网络吞吐量、延迟和CPU利用率等指标。…...

ORACLE常用语句

1.修改用户密码 alter user 用户名 identified by 新密码; 2.表空间扩容 1.增加数据文件 alter tablespace AA add datafile ‘DATA’ size 20G autoextend off; 2.修改数据文件大小 ALTER DATABASE DATAFILE ‘E:\ORACLE\PRODUCT\10.2.0\ORADATA\aa\aa.DBF’ RESIZE 400M;…...

[论文笔记]C^3F,MCNN:图片人群计数模型

(万能代码)CommissarMa/Crowd_counting_from_scratch 代码&#xff1a;https://github.com/CommissarMa/Crowd_counting_from_scratch (万能代码)C^3 Framework开源人群计数框架 科普中文博文&#xff1a;https://zhuanlan.zhihu.com/p/65650998 框架网址&#xff1a;https…...

HCIP-7.2VLAN间通信单臂、多臂、三层交换方式学习

VLAN间通信单臂、多臂、三层交换方式学习 1、单臂路由2、多臂路由3、三层交换机的SVI接口实现VLAN间通讯3.1、VLANIF虚拟接口3.2、VLAN间路由3.2.1、单台三层路由VLAN间通信&#xff0c;在一台三层交换机内部VLAN之间直连。3.2.2、两台三层交换机的之间的VLAN通信。3.2.3、将物…...

PHP快速入门17-用spl_autoload_register实现类的自动加载

文章目录 前言实现过程创建两个类创建入口文件 总结 前言 本文已收录于PHP全栈系列专栏&#xff1a;PHP快速入门与实战 PHP类自动载入是指在PHP应用程序中&#xff0c;当需要使用某个类文件时&#xff0c;系统会自动加载该类文件&#xff0c;无需手动引入。 在PHP中&#xf…...

【黑马程序员 C++教程从0到1入门编程】【笔记8】 泛型编程——模板

https://www.bilibili.com/video/BV1et411b73Z?p167 C泛型编程是一种编程范式&#xff0c;它的核心思想是编写通用的代码&#xff0c;使得代码可以适用于多种不同的数据类型。 而模板是C中实现泛型编程的一种机制&#xff0c;它允许我们编写通用的代码模板&#xff0c;然后在需…...

分享10个精美可视化模板,解决95%的大屏需求!

前段时间和朋友一起喝茶&#xff0c;我吐槽着excel表格做报表的繁琐&#xff0c;他惊讶的问我竟然不知道大屏模板这种东西&#xff0c;说是直接套用数据就可以&#xff0c;我震惊的同时吃下了这个安利。 回来之后&#xff0c;我好好研究了一番这个叫可视化大屏的“新鲜玩意儿”…...

好用的项目管理软件的具体功能有哪些

随着企业规模不断的扩大&#xff0c;项目管理往往会面临更多的挑战与难题&#xff0c;最常见的会出现以下几个问题&#xff1a;资源消耗失控&#xff0c;而项目部门和相关部门之间沟通越来越困难&#xff1b;团队凝聚力下降、项目进度难以把控&#xff0c;项目成本几乎失控&…...

< 每日小技巧: 基于Vue状态的过渡动画 - Transition 和 TransitionGroup>

》基于Vue状态的过渡动画 - Transition 和 TransitionGroup &#x1f449; 一、Vue Transition 简介> Transition 和 TransitionGroup 之间的区别 &#x1f449; 二、<Transition> 组件> 触发 <Transition> 组件的场景&#xff1a;> 基于 CSS 的过渡效果&…...

vmware安装redhat 8

vmware安装redhat 8 1、下载镜像文件1.1 镜像文件 2、安装系统2.1、选择自定义安装2.2、兼容性选择2.3、选择镜像文件导入2.4、设置用户名密码2.5、选择虚拟机在磁盘上的位置2.6、选择处理器数量2.7、选择内存大小2.8、选择桥接或NAT2.9、选择SCSI控制器类型2.10、选择虚拟机磁…...

OpenCV C++案例实战三十一《动态时钟》

OpenCV C案例实战三十一《动态时钟》 前言一、绘制表盘二、绘制刻线三、获取系统时间四、结果展示五、源码总结 前言 本案例将使用OpenCV C实现动态时钟效果。原理也很简单&#xff0c;主要分为绘制表盘、以及获取系统时间两步。 一、绘制表盘 首先为了效果显示美观一点&…...

字节后端入门 - Go 语言原理与实践

1.1什么是Go语言 1.2Go语言入门 环境 1.3基础语法 1.3.1变量 var name"value" 自己推断变量类型&#xff1b; 也可以显式类型 var c int 1 name: type(value) 常量&#xff1a; const name "value" g : a"foo" 字符串拼接 1.3.2 if else {}花括号…...

锂电材料浆料匀浆搅拌设备轴承经常故障如何处理?

锂电材料浆料匀浆搅拌设备是锂电池生产中重要的设备之一&#xff0c;用于将活性材料、导电剂、粘结剂和溶剂混合成均匀的浆料&#xff0c;是电极制备过程中不可或缺的步骤。然而&#xff0c;由于高速搅拌和化学腐蚀等因素的影响&#xff0c;轴承经常会出现故障&#xff0c;导致…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...