目录
一、简介
这篇文章总结一下mvc链路跟踪器的实现,这篇文章的内容相对比较简单。
二、思路
上一篇文章其实已经顺带把mvc链路跟踪器的思路说了
1、初始化上下文,新建ThreadLoacal
2、从http中获取traceId信息
如果有说明是被别的服务调用,将http中的traceId和rpceId保存到上下文
如果没有说明请求来自于客户端,新建链路跟踪信息,保存到上下文
3、处理结束后将上下文销毁
《springCloud微服务系列——链路跟踪第一篇——设计思路以及通用链路跟踪器》
三、spring mvc
如果controller层为spring mvc,那么可以使用拦截器拦截请求进行链路跟踪,非常简单。
四、示例代码
public class MvcTracker implements Tracker<MvcHolder> {
private static final FastDateFormat ISO_DATETIME_TIME_ZONE_FORMAT_WITH_MILLIS = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss.SSSZZ");
protected static final String BEGIN_TIME_KEY = "beginTime";
protected static final String RPC_TRACE_INFO_VO_KEY = "rpcTraceInfoVO";
protected TraceClient traceClient;
public MvcTracker(TraceClient traceClient) {
this.traceClient = traceClient;
}
@Override
public void preHandle(MvcHolder holder) {
initTraceData(holder.getRequest(), holder.getHandler(), holder.getProfile());
}
@Override
public void postHandle(MvcHolder holder) {
finishTraceData(holder.getRequest(), holder.getResponse(), holder.getException());
}
private void initTraceData (HttpServletRequest request, Object handler, String profile) {
// 开始时间
req