全链路跟踪之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