开发者社区 > 云原生 > 中间件 > 正文

如图,dubbo3 的 ConsumerContextFilter 的这段注释是什么意思?

如图,dubbo3 的 ConsumerContextFilter 的这段注释是什么意思?/* invocation.addAttachmentsIfAbsent(context){@link RpcInvocation#addAttachmentsIfAbsent(Map)}should not be used here, because the {@link RpcContext#setAttachment(String, String)} is passed in the Filter when the call is triggered by the built-in retry mechanism of the Dubbo. The attachment to update RpcContext will no longer work, which is a mistake in most cases (for example, through Filter to RpcContext output traceId and spanId and other information). /这段的意思是什么?只是提示说这里不能用 invocation.addAttachmentsIfAbsent(context) ,来防止在dubbo的重试场景下,在这个ClusterFilter 后的类似于设置traceId 的 Filter 会失效吗?只是提示吧,现在我们自己在 Filter 里 RpcContext#setAttachment 设置 traceId,在duubo3里的行为 和 dubbo 2.x 一致吗?
44d9b888b668a307b6715e2409d8b8a3.png

展开
收起
乐天香橙派 2023-08-01 17:07:05 98 0
1 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    此段注释是定义在 Dubbo 3 中 ConsumerContextFilter 过滤器中的。

    ConsumerContextFilter 用于在 Dubbo RPC 调用过程中,将 Consumer 端的上下文信息 aveched 到调用中,传递给 Provider 端。

    该段注释的意思是:

    在 ConsumerContextFilter 中,不应该使用 invocation.addAttachmentsIfAbsent(context) 这种方式 append 上下文信息。

    因为 DubboProviderFilter(Provider 端过滤器)是在 RPC 调用触发时传入的。

    而 invocation.addAttachmentsIfAbsent 在 RPC 调用触发之后才添加的 attachments,Provider 端无法获得。

    正确的做法应该是:

    直接在 RPC 调用触发前(即 Filter 执行前),使用 RpcContext.setAttachment(key,value) 将上下文信息设置到 RpcContext 中。

    Provider 端的 DubboProviderFilter 即可以从 RpcContext 中获得 Consumer 端的上下文信息。

    具体如下:

    java
    Copy
    public void filter(Invocation invocation) {
    // Wrong
    invocation.addAttachmentsIfAbsent(context);

    // Right
    RpcContext.getContext().setAttachment(key, value);
    }
    也就是说,要使 Provider 能获得 Consumer 端的上下文,应当在 Filter 调用前设置 RpcContext,而不是在 Filter 内部再添加attachments。

    希望以上解释能说明该段注释的意思。如果仍有疑问,欢迎继续提问。

    2023-08-02 20:01:25
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:

为企业提供高效、稳定、易扩展的中间件产品。

相关电子书

更多
Dubbo开源现状与2.7规划 立即下载
Dubbo分布式服务治理实战 立即下载
《Dubbo 3.0 前瞻》 立即下载