将 OpenFeign 与 AppMesh 和 AWS 服务发现结合使用时,AWS XRay 服务映射错误

AWS XRay wrong service map when using OpenFeign with AppMesh and AWS Service Discovery

我正在测试与 Spring Boot Rest 服务的服务间通信,这些服务部署在 AWS 上并启用了 AppMesh 和服务发现。为了能够从服务 a 向服务 b 发送消息,我必须使用 OpenFeign 客户端生成代理 class.

技术栈

预期行为

在 AWS XRay 中,它应该显示调用跟踪:

客户端 -> 服务 A -> 服务 B

实际行为

在 AWS XRay 中,我可以看到调用痕迹:

客户端 -> 服务 A 客户端 -> 服务 B

另一个问题是如何告诉 OpenFeign 使用来自 AWS SDK 的 HttpClient?

其他信息

存储库位于:https://github.com/czetsuya/lab-microservice-spring-aws

不确定您是否找到解决方案,下面的代码片段可以帮助您:

首先你需要使用Feign Http Client:

implementation 'io.github.openfeign:feign-httpclient:9.5.0'

创建使用来自 aws xray 的 apache http 客户端的 Feign Builder


    @Bean
    public Feign.Builder feignBuilder() {
        //aws xray http client
        CloseableHttpClient client = HttpClientBuilder.create().build();
        return Feign.builder()
                .retryer(Retryer.NEVER_RETRY)
                .client(new ApacheHttpClient(client));
    }

初始化您的客户端:

@Bean
    CallingService TestSnsPushNotificationApis(@Autowired Feign.Builder builder) {
        return builder.target(CallingService.class, "http://localhost:8081");
    }

我能够通过在 tracingFilter 中使用 dynamicNamingStrategy 来解决这个问题

@Bean
  public Filter tracingFilter(final AWSXRayRecorder awsxRayRecorder) {

    log.info("Setting up AWS Xray tracing filter");
    return new AWSXRayServletFilter(SegmentNamingStrategy.dynamic(Optional.ofNullable(AWS_XRAY_SEGMENT_NAME).orElse(
        "xray-filter")));
  }

并创建一个 HttpClientBuilder bean。

@Bean
  public HttpClientBuilder xrayHttpClientBuilder() {

    log.info("Setting up AWS xray http client configuration");
    return HttpClientBuilder.create();
  }

AWS XRay 现在应该在跟踪中显示 HTTP 请求:

项目代码位于 https://github.com/czetsuya/lab-microservice-spring-aws