【问题标题】:gRPC - Accessing headers in async communicationgRPC - 在异步通信中访问标头
【发布时间】: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


【解决方案1】:

使用Context.fixedContextExecutor

包装一个 Executor 以便它始终以这个上下文作为当前的()语境。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 2020-03-25
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    • 2012-07-29
    相关资源
    最近更新 更多