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

这篇具有很好参考价值的文章主要介绍了关于repeater录制的流量子调用的identity中带有~S的情况。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

我们先看下是什么样的现象, 如下图所示:
关于repeater录制的流量子调用的identity中带有~S的情况

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

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

protected void doBefore(BeforeEvent event) throws ProcessControlException {
    // 回放流量;如果是入口则放弃;子调用则进行mock
    if (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 : useGeneratedKeys
        if (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 {
        // methodName
        String methodName = (String) MethodUtils.invokeMethod(invocation, "getMethodName");
        Class<?>[] parameterTypes = (Class<?>[]) MethodUtils.invokeMethod(invocation, "getParameterTypes");
        // interfaceName
        String  interfaceName = ((Class)MethodUtils.invokeMethod(invoker, "getInterface")).getCanonicalName();
        return new Identity(InvokeType.DUBBO.name(), interfaceName, getMethodDesc(methodName, parameterTypes), getExtra());
    } catch (Exception e) {
        // ignore
        LogUtil.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的内容了。 其实就是通过各个分隔符连接起来,构成我们传参进来的数据。文章来源地址https://www.toymoban.com/news/detail-429241.html

到了这里,关于关于repeater录制的流量子调用的identity中带有~S的情况的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于loadrunner火狐浏览器录制脚本无法打开或者无代码的问题

    此处用的火狐浏览器为 1.检查loadrunner的服务器有没有打开  2.查看自己安装的火狐目录 3.把火狐浏览器全部关闭查看任务管理器中的火狐进程 4.如果不行的话打开loadrunner页面(在选择浏览器的左下角)  5.此处在重试一次 亲测有效

    2024年02月12日
    浏览(49)
  • 使用ffmpeg调用电脑自带的摄像头和扬声器录制音视频

    1、打开cmd,执行 chcp 65001 ,修改cmd的编码格式为utf8,避免乱码 2、执行指令 ffmpeg -list_devices true -f dshow -i dummy ,查看当前window的音频和视频名称 3、打开windows系统的\\\"打开声音设置\\\"–“麦克风隐私设置”–\\\"允许应用访问你的麦克风\\\"点击开启 录制视频: 录制音频: 录制音视频:

    2024年02月04日
    浏览(56)
  • Vue调用摄像头录制视频和音频并上传给后端或下载到本地

    调用摄像头 开始结束录制 对录像时长进行记录 停止录像时终止录制器,关闭媒体流并清除时长记录定时器 回放 下载视频 指定且只能指定,下载后的默认文件名字和文件后缀。注意,可以不指定后缀名,浏览器会根据数据类型自动为其匹配后缀名,但是最好指定后缀。 下载

    2024年02月15日
    浏览(69)
  • 关于Linux系统中使用Kazam录制的视频在Win系统中无法播放的问题解决办法

            今天在linux系统【ubuntu】中录制了一段视频,想要在win系统中进行剪辑,但是发现无法打开,使用的是Kazam录制的mp4格式视频。 安装方式——linux终端输入: 使用方式——linux终端输入: 使用Kazam录制好了一段视频,将mp4格式的视频文件移动到win系统中,打开时出现这

    2024年04月12日
    浏览(43)
  • Flutter 3.16 中带来的更新

    Flutter 3.16 中带来的更新 从此版本开始,Material 3 成为新的默认主题。你可以通过在 MaterialApp 主题中指定 useMaterial3: false 来选择不使用 Material 3,但 Material 2 最终将被弃用并删除。 你仍然可以通过在主题中指定来选择退出 M3 版本的 Material 库MaterialApp,但 Material 2 最终将被弃用

    2024年02月04日
    浏览(49)
  • 在Microsoft Excel中带单位的数字如何求和

    使用 Excel 中的 SUM 函数对一系列单元格、整列或非连续单元格求和。要创建出色的 SUM 公式,请将 SUM 函数与其他 Excel 函数结合使用,然而 SUM 函数不能直接对带单位的数字进行求和。 当直接相加带单位的几个数字会出现如下错误: 错误的原因是数字里带了中文,不能直接用

    2024年02月13日
    浏览(32)
  • ADS中带通滤波器模型参数含义学习笔记

    1、 Fcenter 中心频率 2、 BWpass 通带带宽 3、 Apass 衰减量时的通带带宽 这两个是对应的,比如说是80MHz,3dB,那么就是3dB时的带宽为80MHz,如果改为0.1dB,那么带宽就是0.1dB时的带宽为80MHz 4、 BWstop :阻带带宽 5、 Astop:衰减量时的阻带带宽 这个值从仿真上看时更改参数值没有变化

    2024年02月09日
    浏览(46)
  • Go中带标签的break/continue以及goto的差别

    带标签的 continue : 直接跳到标签所标记的最外层循环的下一个迭代,忽略当前迭代剩余的代码。 带标签的 break : 直接跳出标签所标记的最外层循环,继续执行该循环之后的代码。 goto goto 可以无条件地跳转到程序中指定的标签处。在这种情况下,可以使用任意标签

    2024年02月12日
    浏览(29)
  • 我与smardaten | 百天无码路,苦逼中带点小美好

    大家好,我是云华(化名),一个不太懂技术的无代码开发者,游走在无码世界的自由闲散人。现今是我从事无码开发的第四个月,已经从小白蜕变成了熟手。前两天,睿睿老师找到我,说最近计划办场无代码训练营,希望我能写一篇文章,分享一下我学习smardaten的经历,给

    2024年02月03日
    浏览(27)
  • Pytorch中的repeat以及repeat_interleave用法

    repeat和repeat_interleave都是pytorch中用来复制的两种方法,但是二者略有不同,如下所示。 torch.tensor().repeat()里面假设里面有3个参数,即3,2,1,如下所示: 用repeat时,应当从后往前看,即先复制最后一维,依次向前。 ①最后一个数字为1,复制一次,还是[1,2,3]. ②倒数第二个数

    2023年04月12日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包