获取python中已注册的gRPC服务名称和方法的列表

问题描述

Java的

grpc-core可以选择从grpc服务器对象获取服务描述符列表。从中可以收集服务名称和方法名称。

    for (ServerServiceDefinition serverServiceDefinition: server.getServices()) {
        ServiceDescriptor serviceDescriptor = serverServiceDefinition.getServiceDescriptor();
        Collection<MethodDescriptor<?,?>> methods = serviceDescriptor.getMethods();
        LOG.info("Service Name: {}",serviceDescriptor.getName());
        for (MethodDescriptor<?,?> methodDescriptor : methods) {
            LOG.info("\t{}",methodDescriptor.getFullMethodName());
        }
    }

我正在寻找在python中实现类似功能的方法,但并不那么明显。理想情况下,我希望不借助反射或通过生成的protobuf python文件进行黑客攻击。

一种方法是从protobuf文件中获取信息,但这将需要更多的手动工作:

    import service_pb2

    a = service_pb2._<service_name>
    print(a.name)
    for m in a.methods:
        print(f'\t{m.name}')

,通过服务器对象本身获取注册的服务会更有意义。

例如,我希望能够输出与应用程序相关的所有注册服务和服务方法。

Server Name: ServiceName1
    serviceMethod1
    serviceMethod2
    serviceMethod3
    serviceMethod4
Server Name: ServiceName2
    serviceMethod1
    serviceMethod2
    serviceMethod3
Server Name: ServiceName3
    serviceMethod1
    serviceMethod2

解决方法

如果我正确理解了您的需求,以下代码段可能会对您有所帮助。

# server is the configured grpc server object.

for service in server._state.generic_handlers:
    print("Service Name:",service.service_name())
    for method in service._method_handlers:
        print(4*" " + method)

如果您不希望方法的全名,请使用以下代码:

method.split('/')[-1]

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...