如何用Feign.Builder实现Sleuth跟踪?

问题描述 投票:2回答:2

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

但是,我们有一些现有的代码使用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并重新修改所有自定义拦截器,编码器等的应用程序,但最终可能需要大量工作才能承担很多风险。)

我需要做一个特殊的请求拦截器来手动注入这些(例如来自自动装配的Tracer)吗?是否有干净的方式(或现有的类)来做到这一点?

spring-boot spring-cloud spring-cloud-netflix spring-cloud-sleuth feign
2个回答
4
投票

我终于弄明白了。

答案就在这里:https://github.com/spring-cloud/spring-cloud-sleuth/issues/594

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

为了实现这一点,我们可以声明一个Client bean,然后spring / 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");

在这之后,一切似乎都有效。我可以看到Trace Id传播到远程REST服务。


0
投票

我一直在与Feign,FeignBuilder和zipkin挣扎。对我来说,使用FeignClient并在属性文件中配置Feign,它起作用了。

@FeignClient(value = "ms-common--zipkin-test2")
public interface Client2 {

@GET
@Path("/request1")
String request1(@QueryParam("payload") String payload);
}

在application.yml中

feign:
  client:
    config:
      ms-common--zipkin-test2:
        connectTimeout: 5000
        readTimeout: 5000
        loggerLevel: full
        requestInterceptors:
         - com.organization.mscommonzipkintest1.framework.client.FeignUserAgentInterceptor

我在该包中创建了一个FeignUserAgentInterceptor。

© www.soinside.com 2019 - 2024. All rights reserved.