如图,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 一致吗?
此段注释是定义在 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。
希望以上解释能说明该段注释的意思。如果仍有疑问,欢迎继续提问。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。