如何在gRPC C++拦截器中获取调用方法名称?
gRPCpp拦截器获取调用方法名称的解决方案
问题说明
gRPC拦截器最常用的场景之一就是日志记录,但很多开发者在grpcpp框架中找不到获取当前调用方法名称的途径,会疑惑这是不是框架缺失的功能(包括grpc::experimental模块),或是自己遗漏了相关用法。
相关Issue情况
GitHub Issue #17520正好匹配该问题,该Issue已被关闭,官方回复如下:
你想要的功能可以通过拦截API实现,请参考对应拦截器头文件。
但不少开发者查看指定头文件后,并未直接找到对应的实现指引。
实际可行的实现方式
在grpcpp的拦截器中,你可以通过InterceptorBatchMethods对象提供的GetMethod()方法直接获取当前调用的方法名称,示例代码如下:
#include <grpcpp/grpcpp.h> #include <grpcpp/experimental/interceptor.h> #include <iostream> class LoggingInterceptor : public grpc::experimental::Interceptor { public: void Intercept(grpc::experimental::InterceptorBatchMethods* methods) override { // 选择合适的拦截点,这里以接收初始元数据前为例 if (methods->QueryInterceptionHookPoint( grpc::experimental::InterceptionHookPoints::PRE_RECV_INITIAL_METADATA)) { const char* full_method_name = methods->GetMethod(); std::cout << "当前调用方法:" << full_method_name << std::endl; // 如果需要提取短方法名(如从"/com.example.Service/DoSomething"中得到"DoSomething") std::string method_str(full_method_name); size_t last_slash = method_str.find_last_of('/'); if (last_slash != std::string::npos) { std::string short_method_name = method_str.substr(last_slash + 1); std::cout << "短方法名:" << short_method_name << std::endl; } } // 必须调用Proceed()让请求继续流转 methods->Proceed(); } };
需要注意:
GetMethod()返回的是包含完整服务路径的方法名(格式为/包名.服务名/方法名),可根据需求自行截取短名称。- 确保使用的grpc版本为较新的稳定版,该API已被正式支持,无需依赖未公开的实验性接口。
内容的提问来源于stack exchange,提问作者OLEGSHA
相关产品推荐
相关产品推荐

