获取 python 中已注册的 gRPC 服务名称和方法列表
Get the list of registered gRPC service name and methods in python
grpc-core for java 可以选择从 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]
grpc-core for java 可以选择从 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]