目录1. MAVEN1.1. spring-cloud-starter-sleuth:2.0.0.RELEASE1.2. spring-cloud-starter-sleuth:3.0.02. 获取代码2.1. spring-cloud-starter-sleuth:2.0.0.RELEASE2.2. spring-cloud-starter-sleuth:3.0.03. 为何可以如此获取4. 实际项目中使用5. 日志中打印 traceId6. 特别注意1. MAVEN1.1. spring-cloud-starter-sleuth:2.0.0.RELEASEdependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-sleuth/artifactIdversion2.0.0.RELEASE/version/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-sleuth-core/artifactIdversion2.0.0.RELEASE/version/dependencydependencygroupIdio.zipkin.brave/groupIdartifactIdbrave-instrumentation-spring-webmvc/artifactIdversion5.1.0/version/dependencydependencygroupIdio.zipkin.brave/groupIdartifactIdbrave-instrumentation-servlet/artifactIdversion5.1.0/version/dependency1.2. spring-cloud-starter-sleuth:3.0.0dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-sleuth/artifactIdversion3.0.0/version/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-sleuth-brave/artifactIdversion3.0.0/version/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-sleuth-instrumentation/artifactIdversion3.0.0/version/dependency2. 获取代码2.1. spring-cloud-starter-sleuth:2.0.0.RELEASE// ServletServerHttpRequest requestTraceContexttraceContext(TraceContext)request.getServletRequest().getAttribute(TraceContext.class.getName());StringtraceIdtraceContext.traceIdString();// HttpServletRequest requestTraceContexttraceContext(TraceContext)request.getAttribute(TraceContext.class.getName());StringtraceIdtraceContext.traceIdString();2.2. spring-cloud-starter-sleuth:3.0.0// ServletServerHttpRequest requestTraceContexttraceContext(TraceContext)request.getServletRequest().getAttribute(TraceContext.class.getName());StringtraceIdtraceContext.traceId();// HttpServletRequest requestTraceContexttraceContext(TraceContext)request.getAttribute(TraceContext.class.getName());StringtraceIdtraceContext.traceId();3. 为何可以如此获取版本所在 jar全路径spring-cloud-starter-sleuth:2.0.0.RELEASEbrave-instrumentation-servletbrave.servlet.TracingFilterspring-cloud-starter-sleuth:3.0.0spring-cloud-sleuth-instrumentationorg.springframework.cloud.sleuth.instrument.web.servlet.TracingFilterpublicfinalclassTracingFilterimplementsFilter{finalServletRuntimeservletServletRuntime.get();finalCurrentTraceContextcurrentTraceContext;finalHttpServerHandlerHttpServerRequest,HttpServerResponsehandler;publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{HttpServletRequestreq(HttpServletRequest)request;HttpServletResponseresthis.servlet.httpServletResponse(response);TraceContextcontext(TraceContext)request.getAttribute(TraceContext.class.getName());if(context!null){CurrentTraceContext.Scopescopethis.currentTraceContext.maybeScope(context);try{chain.doFilter(request,response);}finally{scope.close();}}else{Spanspanthis.handler.handleReceive(newHttpServletRequestWrapper(req));request.setAttribute(SpanCustomizer.class.getName(),span.customizer());// 赋值 traceIdrequest.setAttribute(TraceContext.class.getName(),span.context());......}}}4. 实际项目中使用packagecom.zxguan.springcloud2.user.config;importorg.springframework.core.MethodParameter;importorg.springframework.core.annotation.Order;importorg.springframework.http.MediaType;importorg.springframework.http.server.ServerHttpRequest;importorg.springframework.http.server.ServerHttpResponse;importorg.springframework.web.bind.annotation.RestControllerAdvice;importorg.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;Order(0)RestControllerAdvicepublicclassApiResponseAdviceimplementsResponseBodyAdvice{/** * 判断需要处理的情况 * * param methodParameter * param selectedHttpMessageConverter * * return boolean true: false: */Overridepublicbooleansupports(MethodParametermethodParameter,ClassselectedHttpMessageConverter){//returnfalse;}/** * 消息体返回前处理 * * param body 返回的消息体 * param methodParameter 响应类型 * param mediaType 请求的响应 contentType * param selectedHttpMessageConverter 执行序列化的转换器 * param request * param response * * return Object 返回的消息体 */OverridepublicObjectbeforeBodyWrite(Objectbody,MethodParametermethodParameter,MediaTypemediaType,ClassselectedHttpMessageConverter,ServerHttpRequestrequest,ServerHttpResponseresponse){// 此处可以统一添加 traceId 到响应中returnnull;}}5. 日志中打印 traceId借助MDC机制, 实现traceId的打印pattern%d{yyyy-MM-dd HH:mm:ss.SSS} %X{X-B3-TraceId} %X{X-B3-SpanId}/pattern6. 特别注意MDC设置X-B3-TraceId, 可以通过自定义过滤器提前到过滤器级别但需要注意过滤器顺序自定义过滤器需排在TracingFilter之后Spring Cloud2 Sleuth 3 OpenFeign存在设计缺陷存在多个问题。其中就包括FeignClient的url写法会报错为了尽可能保留 Sleuth 功能需要使用RestTemplate或者HttpClient等实现接口访问而非全局禁用配置spring.sleuth.feign.enabledfalse