java gRPC服务器获取请求头

h43kikqp  于 2023-01-07  发布在  Java
关注(0)|答案(1)|浏览(391)

我构建了Java gRPC的服务器,想通过请求头获取客户端传输的数据,目前只能使用ServerInterceptor类来拦截解析请求头Metadata,但想在服务运行时获取,解决方案是什么?
我尝试过通过redis访问和传输数据,但是我写的gRPC是多数据源的,同一个客户端请求有多个,如果不同的客户端向我发出一个请求,但是他们携带不同的请求头,其他接口名称和参数都是一样的,很可能后面一个请求的请求头会覆盖前面一个请求头的redis结果,所以我不能保证请求和请求头的一致性!

rlcwz9us

rlcwz9us1#

使用io.grpc.Context将值传播到服务实现,使用Contexts.interceptCall()。jwt-auth示例以及其他一些StackOverflow questionsandanswers执行此操作。
本质上,您只需创建一个包含您想要通信的信息的新Context,并使用Contexts.interceptCall()将其作为ThreadLocal提供给服务。如果您的服务在另一个线程上进行处理,则需要将Context传播到另一个线程或提前保存值。

public class AddToContextInterceptor implements ServerInterceptor {
  // Context keys use reference equality, so the consumer of the value
  // must use this specific object.
  public static final Context.Key<MyObject> MY_KEY = Context.key("MY_KEY");

  @Override
  public <ReqT,RespT> ServerCall.Listener<ReqT> interceptCall(
      ServerCall<ReqT,RespT> call, Metadata headers,
      ServerCallHandler<ReqT,RespT> next) {
    Context newContext =
        Context.current().withValue(MY_KEY, metadata.get(SOME_KEY));
    return Contexts.interceptCall(newContext, call, headers, next);
  }
}

// In the service:
MyObject o = AddToContextInterceptor.MY_KEY.get();

相关问题