3

我正在使用 gRPC,我需要从 ServerInterceptor 获取请求的服务名称,但似乎不可能。

基本上,从ServerInterceptor的实现中,我需要知道将被调用的 ServiceGrpc 的名称(作为字符串)。

public class PermissionInterceptor implements ServerInterceptor {

        @Override
        public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(
                ServerCall<ReqT, RespT> serverCall, Metadata metadata, ServerCallHandler<ReqT, RespT> handler
        ) {
            // here I need the name of RPC service that has been requested

            return handler.startCall(serverCall, metadata);
        }
}

请注意,我已经尝试使用serverCall.getMethodDescriptor()但它返回原始服务的名称而不是(java)服务的真实名称。

它返回:

co.test.domain.transaction.TransactionService

但我需要这个:

co.test.domain.transaction.TransactionNeoBasicImpl

谢谢

4

2 回答 2

2

有一种方法可以做到这一点。

String fullMethodName = serverCall.getMethodDescriptor().getFullMethodName();
String serviceName = MethodDescriptor.extractFullServiceName(fullMethodName);

基本上 fullMethodName 具有完全限定的服务名称作为前缀(后跟一个' /')。像这样的东西fullyqualified.ServiceName/MethodName

于 2018-09-16T12:20:36.400 回答
1

这是不可能的。

如果您的拦截器是应用程序之前的最后一个拦截器,您可能能够检查handler“类”并查看其父类的名称。但这非常有限,不一定支持。

于 2018-02-16T16:46:13.453 回答