首页 > 解决方案 > 如何直接从protobuf创建GRPC服务器而不将其编译成java代码

问题描述

有必要将通用 GRPC 服务器实现为存根。

没有为服务器找到类似的东西,仅适用于客户端。

非常感谢!

标签: javaprotocol-buffersgrpcgrpc-javaproto

解决方案


如果您不想处理 protobuf 消息,那么您需要创建一个Marshaller序列化 to/from byte[]MethodDescriptor为您想要支持的每个方法创建一个,以及ServerCallHandler为您的应用程序逻辑创建一个。您可能会发现grpc 代理模型很有帮助。这些可以组合在一起传递给serverBuilder.addService(ServerServiceDefinition). 您也可以使用ServerCalls来帮助制作ServerCallHandler.

class ByteMarshaller implements MethodDescriptor.Marshaller<byte[]> {
  @Override public byte[] parse(InputStream stream) {
    try {
      return ByteStreams.toByteArray(stream);
    } catch (IOException ex) {
      throw new RuntimeException();
    }
  }

  @Override public InputStream stream(byte[] value) {
    return new ByteArrayInputStream(value);
  }
};
class YourHandler extends ServerCallHandler<byte[],byte[]> {...}

MethodDescriptor<> desc = MethodDescriptor.<byte[], byte[]>newBuilder()
    // UNKNOWN is fine, but specify the type if you know it
    .setType(MethodDescriptor.MethodType.UNKNOWN)
    .setFullMethodName("package.YourService/Method"))
    .setRequestMarshaller(new ByteMarshaller())
    .setResponseMarshaller(new ByteMarshaller())
    .build();
serverBuilder.addService(
    ServiceDescriptor.newBuilder("package.YourService")
      .addMethod(ServerMethodDefinition.create(desc, new YourHandler()))
      .build());

如果要解析 protobuf,可以使用DynamicMessagegRPC 的 Protobuf Marshaller。一个类似的客户端问题解释了该过程。


推荐阅读