本文将为 RPC 框架集成调用链追踪功能,支持链路 ID 透传、服务调用耗时分析、错误定位等,打通链路透明化的“最后一公里”。
一、为什么需要链路追踪?
在微服务环境中,一个请求可能会经过多个服务节点:
客户端 → 服务A → 服务B → 服务C
如果出现错误或性能瓶颈,没有调用链信息,我们将很难定位是哪一环出了问题。
✅ 链路追踪的好处:
日志打通:请求链条统一记录
问题定位:快速分析慢请求或异常服务
性能分析:识别瓶颈服务
二、链路追踪核心设计
1. 全局唯一请求 ID(TraceId)
每次请求生成一个 UUID,在调用过程中携带并透传。
2. RpcRequest 中增加 traceId 字段
public class RpcRequest implements Serializable {
private String serviceName;
private String method;
private Object[] params;
private String traceId; // 新增字段
// ...
}
3. 服务端读取 traceId 并记录日志
if (request.getTraceId() != null) {
MDC.put("traceId", request.getTraceId());
}
log.info("收到 RPC 请求:{}", request);
三、自动生成 traceId
我们可以使用 Filter 或拦截器的方式实现自动化:
public class TraceInterceptor {
public static RpcRequest wrapRequest(RpcRequest req) {
if (StringUtils.isEmpty(req.getTraceId())) {
req.setTraceId(UUID.randomUUID().toString());
}
return req;
}
}
使用示例:
RpcRequest wrapped = TraceInterceptor.wrapRequest(originalRequest);
channel.writeAndFlush(wrapped);
四、集成日志 MDC(Mapped Diagnostic Context)
建议使用 logback 日志框架,并在 logback.xml 中加上 traceId:
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - [%X{traceId}] %msg%n</pattern>
这样日志中就会自动记录每次请求的 traceId。
五、日志效果示例
11:03:21.873 [nioEventLoopGroup-3-1] INFO RpcServerHandler - [d5af2f29-4c7f-4d20-bf80-1ff4ea6c8e0a] 收到 RPC 请求:HelloService.hello("Netty")
11:03:21.876 [nioEventLoopGroup-3-1] INFO RpcServerHandler - [d5af2f29-4c7f-4d20-bf80-1ff4ea6c8e0a] RPC 响应已发送
六、统一日志追踪上下文封装
我们可以封装一个 RpcContext 类:
public class RpcContext {
private static final ThreadLocal<String> TRACE_ID = new ThreadLocal<>();
public static void setTraceId(String id) {
TRACE_ID.set(id);
MDC.put("traceId", id);
}
public static String getTraceId() {
return TRACE_ID.get();
}
public static void clear() {
TRACE_ID.remove();
MDC.remove("traceId");
}
}
然后在服务端收到请求时:
RpcContext.setTraceId(request.getTraceId());
在服务端返回后:
RpcContext.clear();
七、与外部追踪系统整合(可选)
可将 traceId 透传到 Zipkin、SkyWalking 等系统
提供 HTTP → RPC → MQ 等链路打通能力
推荐在 header/元数据中统一携带 traceId
八、总结
通过本篇内容,我们为 Netty RPC 框架增加了链路追踪能力,实现了:
✅ 请求唯一 ID 自动生成与透传
✅ 日志追踪上下文自动注入
✅ 多服务节点日志打通能力
✅ 可拓展对接 SkyWalking/Zipkin 的能力