问题说明
在zuul中使用apache client请求时,traceid | spanid | parentspanid都能传递到下一个服务中,当切换到okhttp时,以上信息没有传递过去,在下一个服务中出现新的traceid,对于服务的链路从gateway开始跟踪产生了影响。现象如下:
ribbon:
http:
client:
enabled: false
okhttp:
enabled: true
原有分析
使用apache client,链路追踪相关的id会随着handler传递到下一个服务,但是使用okhttp就忽略了链路追踪的id;handler中并没有包含任何id,这样在下一个服务中,就会产生一个新的id,从而是链路追踪断链。
解决方案
以下就是解决该问题的一种方式。
首先定义一个Interceptor,用于将拦截到的请求头里面添加上traceid | spanid | parentspanid等信息:
import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import brave.Tracer;
import brave.internal.HexCodec;
import brave.internal.Platform;
import brave.propagation.TraceContext;
import okhttp3.Headers;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
/**
* okhttp过滤器,添加与trace集成的功能。 实现方式参考see also
* @see brave.propagation.B3Propagation
* @see org.springframework.cloud.netflix.ribbon.okhttp.OkHttpRibbonRequest
*/
public class OkhttpTraceInterceptor imple