与ServerServiceDefinition和具体类有什么关系?

时间:2018-06-01 18:18:04

标签: java grpc distributed-system grpc-java

我正在学习最近使用grpc,并在实例化名为server的Server类后感到困惑:

template<typename U = T,
         typename = std::enable_if_t<
            !std::is_reference_v<U>
            && std::is_same_v<U, T>>>
void f(T&& x){}

template <typename U = T>
std::enable_if_t<
   !std::is_reference_v<U>
   && std::is_same_v<U, T>> f(T&& x)
 { }

我阅读了java doc并找到了ServerBuilder.addService:

server = ServerBuilder.forPort(port)
            .addService(new MetadataStoreImpl(this.config, port))
            .executor(Executors.newFixedThreadPool(numThreads))
            .build()
            .start();

在这种情况下,我使用自己的类“MetadataStoreImpl”来替换“ServerServiceDefinition”,但仍然不知道原因。此外,如何从类服务器引用此MetadataStoreImpl类的成员变量? 谁能帮助我?

1 个答案:

答案 0 :(得分:1)

如果您的MetadataStoreImpl扩展了生成的服务存根(例如MetadataStoreImplBase),那么它将实现gRPC的BindableService接口。 ServerBuilder有另一种addService方法接受BindableService而不是ServerServiceDefinitionHere是我们生成的bindService方法代码实现的一个示例,它只构建并返回ServerServiceDefinition

对于您的第二个问题,您可以通过Server#getServices获取ServerServiceDefinitions的列表,但这不会直接让您原来的MetadataStoreImpl,而是{{} 1}}由生成的代码ServerServiceDefinition方法返回。通常情况下,您不会使用bindService,因为您只需在将服务添加到构建器后保留对服务的引用。

您可以在https://grpc.io/docs/reference/java/generated-code.html找到更多信息gRPC Java生成的代码。