欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

全链路跟踪之Dubbo

程序员文章站 2022-07-03 14:50:03
...

首先简单认识下@Activate及RpcContext
@Activate:主要使用在有多个扩展点实现、需要同时根据不同条件被**的场景中,如Filter需要多个同时**,因为每个Filter实现的是不同的功能。
RpcContext:上下文信息

1、Activate注解详细说明

参数名 描述
String[] group() URL中的分组如果匹配,则**
String[] value() URL中如果包含该key值,则**
String[] before() 填写扩展点列表,表示哪些扩展点要在本扩展点之前**
String[] after() 表示哪些扩展点需要在本扩展点之后**
int order() 排序信息

2、RpcContext上下文
本质上是一个ThreadLocal,当接收到RPC请求或发起RPC请求时,RpcContext的状态会变化。比如A调用B,B再调用C,则B机器上,在B调用C之前,RpcContext记录的是A调用B的信息,在B调用C之后,RpcContext记录的是B调用C.

3、全链路TraceId跟踪(透传参数)

服务消费方
第一步:新建扩展类

@Activate
public class RpcTraceFilter implements Filter {
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        String traceId = RpcContext.getContext().getAttachment("traceId");
        if(StringUtils.isEmpty(traceId)){
            traceId = UUID.randomUUID().toString();
            RpcContext.getContext().setAttachment("traceId",traceId);
        }
        return invoker.invoke(invocation);
    }
}

第二步:工程下resources新建 META-INF/dubbo目录
第三步:在dubbo目录下新建com.alibaba.dubbo.rpc.Filter文件(文件名必须固定),文件内容

自定义KEY=扩展类的全路径名
如:
traceFilter=com.ab.cd.RpcTraceFilter

服务提供方
第一步:新建扩展类

@Activate
public class RpcTraceFilter implements Filter {

    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        String traceId = RpcContext.getContext().getAttachment(Constants.TRACE_ID);
        if (StringUtils.isNoneBlank(traceId)) {
            MDC.put(Constants.TRACE_ID, traceId);
        }
        return invoker.invoke(invocation);
    }
}

第二步:工程下resources新建 META-INF/dubbo目录
第三步:在dubbo目录下新建com.alibaba.dubbo.rpc.Filter文件(文件名必须固定),文件内容

自定义KEY=扩展类的全路径名
如:
traceFilter=com.ab.ef.RpcTraceFilter