ServerServiceDefinition和具体的class有什么关系?

What's the relationship with ServerServiceDefinition and a concrete class?

最近在学习使用grpc,在实例化一个Server class named server:

后,对一件事感到困惑
server = ServerBuilder.forPort(port)
            .addService(new MetadataStoreImpl(this.config, port))
            .executor(Executors.newFixedThreadPool(numThreads))
            .build()
            .start();

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

public abstract T addService(ServerServiceDefinition service);

在这种情况下,我使用自己的class "MetadataStoreImpl" 来替换"ServerServiceDefinition" 但仍然不知道为什么。此外,如何从 class 服务器获取此 MetadataStoreImpl class 的成员变量的引用? 谁能帮帮我?

如果您的 MetadataStoreImpl 扩展生成的服务存根(例如,MetadataStoreImplBase),那么它将实现 gRPC 的 BindableService 接口。 ServerBuilder 还有一个 addService method that accepts a BindableService instead of a ServerServiceDefinition. Here 是我们生成的代码实现 bindService 方法的一个例子,它只是构建 returns 一个 ServerServiceDefinition.

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

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