将 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.
技术栈
- Spring 启动 OpenFeign
- AWS XRay
- ECS
- ECR
- 侦探
- AppMesh(虚拟节点、虚拟服务)
- AWS 服务发现(而不是 Eureka)
预期行为
在 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。
我正在测试与 Spring Boot Rest 服务的服务间通信,这些服务部署在 AWS 上并启用了 AppMesh 和服务发现。为了能够从服务 a 向服务 b 发送消息,我必须使用 OpenFeign 客户端生成代理 class.
技术栈
- Spring 启动 OpenFeign
- AWS XRay
- ECS
- ECR
- 侦探
- AppMesh(虚拟节点、虚拟服务)
- AWS 服务发现(而不是 Eureka)
预期行为
在 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。