spring-boot - 如何使用 Feign.Builder 实现 Sleuth Tracing?

标签 spring-boot spring-cloud spring-cloud-netflix spring-cloud-sleuth feign

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

但是,我们有一些现有代码直接使用 Feign.Builder 和 Feign 注释接口(interface)(只是没有用 @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 header 。有什么简单的方法可以把它连接起来吗?

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

我是否需要做一个特殊的请求拦截器来手动注入(inject)这些(例如从 Autowiring 的 Tracer)?有没有一种干净的方法(或现有的类)来做到这一点?

最佳答案

我终于弄明白了。

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

当使用 Feign.Builder 时,它的 Client 需要被一个“Trace”实现包裹。

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

声明将类似于:

@Bean
public OkHttpClient okHttpClient() {
    return new OkHttpClient();
}

然后我们可以在构建客户端实现时将该客户端 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 服务。

关于spring-boot - 如何使用 Feign.Builder 实现 Sleuth Tracing?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48211360/

相关文章:

java - entityManager.flush()会清除二级缓存吗?

spring-boot - netflix zuul服务器和netflix Eureka 服务器有什么区别?

java - Spring 启动: Configuration Scan missing classes due to "weird" setup

spring-boot - Eureka 客户端异常 com.netflix.discovery.shared.transport.TransportException : Cannot execute request on any known server

spring-boot - Spring Boot + 云 | Zuul代理 |附加 URL/重写

spring-boot - 如何使用 Spring Cloud Stream 4.x 生产者和消费者检测 Spring Boot 3.x 以关联记录器中的跟踪信息

netflix-zuul - ZUUL 向下游应用程序发送基本身份验证

java - 如何在 zuul/ribbon 中获取请求将转发到的服务器的主机名

java - 如何将 JUnit TemporaryFolder @Rule 与 Spring @Value 属性一起使用?

java - 如何在 Spring Boot 中使用 CrudRepository 获取 5 个最新帖子