【发布时间】:2022-11-03 05:29:31
【问题描述】:
我有一个运行微服务的 Kubernetes 集群。 当我调用基于 Java 的微服务时,Spring Boot 应用程序接收所有 HTTP 请求,在内部调用另一个后端服务作为 gRPC 请求,获取响应然后将 http 响应返回给用户。这类似于分布式系统的典型工作方式。
使用 Future.callback() 方法调用 gRPC 后端。
ExecutorService executorService = Executors.newFixedThreadPool(3);
Futures.addCallback(listenableFuture, new FutureCallback<ResponseType>() {
@Override
public void onSuccess(ResponseType result) {
}
@Override
public void onFailure(Throwable t) {
}
}, executorService);
由于使用了 Futures.addCallback,响应将被 executorService 中的任何可用线程接收。
在发出 gRPC 请求之前,我在上下文中设置了一些标头。 通过这种设置,每当我收到来自后端 grpc 服务的响应时,我都想访问服务器之前设置的一些标头字段。 接收后端 gRPC 响应的 executorService 中的线程没有来自之前设置的服务器的上下文。
当响应返回时,是否有一种机制可以访问服务器标头?
我尝试使用 Context.Key,但它不起作用,因为它使用引用相等。此信息丢失,因为线程不同。
【问题讨论】:
-
@eric-anderson 对此有任何想法吗?
-
您可以在请求中添加标头数据,并让服务器在响应中将它们返回给您吗?
-
为什么不直接进行一元调用并跳过线程。 gRpc 很快。由于您从不进行上下文切换,因此您的标题仍然存在。
标签: java spring-boot grpc grpc-java