gRPC服务器获取请求报头



我搭建Java gRPC服务器,想通过请求头获取客户端传输的数据。目前,我只能使用ServerInterceptor类来拦截解析请求头元数据,但我希望在服务操作期间获得它。解决方案是什么?

我尝试通过redis访问和传输数据,但是我写的gRPC是多数据源的,同一个客户端请求有多个,如果不同的客户端给我一个请求,但是他们携带不同的请求报头,其他接口名称和参数都是一样的,有可能后面一个请求的请求报头会覆盖前一个请求报头的redis结果,所以我不能保证请求和请求报头的一致性!

使用io.grpc.Context将值传播到服务实现,使用Contexts.interceptCall()。jwt-auth示例做了这个,以及其他一些StackOverflow问题和答案。

本质上,您只需创建一个包含您想要通信的信息的新上下文,并使用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();

最新更新