如何用Feign.Builder实现侦查跟踪?

我正在尝试将Sleuth集成到我们的系统中。如果我使用带有注释的接口@FeignClient,则一切正常。这些接口会自动进行检测,并且Sleuth头会通过REST调用传播。

但是,我们有一些现有代码直接使用Feign.Builder和Feign带注释的接口(只是没有带注释@FeignClient)。此代码添加了一些自定义请求拦截器,编码器,代理等。

例如:

// Feign REST interface

public interface MyService {

@RequestMapping(method = RequestMethod.GET, value = "/version")

String getVersion();

}

// Creating the builder

Feign.Builder builder = Feign.builder();

builder.requestInterceptor(new MyCustomInterceptor());

// + adding proxy, encoder, decoder, etc

// Using the builder

MyService myService = builder.target(MyService.class, "http://localhost:8080/myservice");

myService.getVersion();

我希望这个较旧的代码传播Sleuth标头。有一些简单的方法可以连接起来吗?

(我想一个选择是重新设计我们的Feign接口以使用@FeignClient并重新设计所有自定义拦截器,编码器等的应用方式,但是最终这可能会带来很多工作,但风险很大。)

我是否需要做一个特殊的请求拦截器来手动注入(例如从自动连线的示踪剂中)?有没有一种干净的方法(或现有的类)来做到这一点?

回答:

我终于弄明白了。

答案几乎在这里:https://github.com/spring-cloud/spring-cloud-

sleuth/issues/594

使用Feign.Builder时,其客户端需要由“跟踪”实现包装。

为此,我们只需声明一个Client bean,然后spring / sleuth将自动处理它的包装(因为sleuth在依赖列表中)。

该声明将类似于:

@Bean

public OkHttpClient okHttpClient() {

return new OkHttpClient();

}

然后,我们可以在构建客户端实现时将Client Bean传递给构建器。

例如:

// autowiring the Client bean

@Autowired

private Client client;

// using the Client bean to build the Feign client

DemoClient demoClient = Feign.builder()

.client(client)

.target(DemoClient.class, "http://localhost:8200/demo");

完成之后,一切似乎都正常了。我可以看到跟踪ID正在传播到远程REST服务。

以上是 如何用Feign.Builder实现侦查跟踪? 的全部内容, 来源链接: utcz.com/qa/401045.html

回到顶部