当前位置: 首页 > 知识库问答 >
问题:

如何直接从protobuf创建GRPC服务器,而无需将其编译为java代码

张鸿志
2023-03-14

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

找不到与服务器类似的内容,仅针对客户端。

非常感谢!

共有3个答案

鲜于德业
2023-03-14

我相信您想将生成的服务器用于测试目的?如果是这样,有一种称为服务虚拟化或应用编程接口模拟的做法——测试双重系列的一个子集。它允许您“模拟”或“存根”真实系统,以测试被测系统。其中一些工具允许导入模式文件来生成存根(即Swagger/OpenAPI/Proto/WSDL/...)。

维基百科包含这些工具的列表。今天看看这个列表,其中一个支持gRPC的工具叫做流量鹦鹉,它允许您根据Proto文件创建gRPC模拟。也有像GripMock这样的开源工具,但它不会根据Proto文件生成存根,你必须手动创建它们。

请记住,生成的存根/模拟/模拟器只是一个测试替身,它不会复制Proto文件对应的系统的完整行为。导入Proto文件并生成服务器测试替身的工具只能知道消息的语法,而不知道语义学或真实系统的行为。

如果您还想部分复制消息的语义学,请考虑记录gRPC消息以创建服务存根,这样您也可以查看示例数据。

佘辰龙
2023-03-14

可能有一些方法可以从包含服务的protobuf动态构建gRPC服务器,但这并不是很有用。事实上,铁锈板条箱,节点。js和其他实现可以动态生成代码,而无需直接使用protoc的额外手动步骤。

正如评论员所建议的那样,proto文件只定义了服务方法名称及其输入和输出消息,因此,假设的服务器除了接收消息和可能发送空回复之外,不会对消息做任何处理。

因为protos是强类型的,所以这样存根服务器也没有任何好处,因为您的(例如Java)客户端能够创建类型良好的消息(没有服务器)。

您的用例是什么?这可能有助于提出其他答案。

越涵衍
2023-03-14

如果不想处理protobuf消息,则需要创建一个序列化到/从字节[]的封送拆收器,为要支持的每个方法创建一个MethodDescriptor,并为应用程序逻辑创建一个ServerCallHandler。您可能会发现grpc代理模型很有用。这些可以组合在一起传递给serverBuilder。添加服务(ServerServiceDefinition)。您还可以使用ServerCalls帮助创建一个ServerCallHandler。

java prettyprint-override">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());

如果您想解析原型,那么您可以将DynamicMessage与gRPC的Pro buf Marshaller一起使用。一个类似的客户端问题解释了这个过程。

 类似资料:
  • 我试图使用gRPC来构建一个简单的CRUD服务,但我一直发现自己创建了大量重叠的消息。 这最好用一个例子来描述: 这是使用gRPC构建类似CRUD的资源的好方法吗?也就是说,有一条代表资源的消息(),并将该消息包装为每个操作的响应/请求类型。 待办事项类型消息是否应该包含所有请求/响应所涵盖的所有字段,而不是设置每个都不使用的字段?

  • 我有一个方法,可以启动一个简单的cpp grpc服务器。 我想做

  • 在我从原来的问题发展到现在时更新问题。 第1步。我已经使用此链接编译并安装了Protobuf编译器for mac。 步骤2.目前卡在gRPCJavaCodecen Plugin for Pro buf Compiler链接: 成功<代码>/gradlew java\u插件不可执行 错误<代码>/gradlew测试(屏幕截图1) ***构建codegen需要Protobuf版本3.9.0 <代码>哪

  • 我想将protobuf序列化消息转换为人类可读的JSON格式。我面临的主要问题是,我需要这样做,而无需事先将proto描述符编译成Go代码。我有权访问 来自

  • 我们正在使用proto3创建grpc服务器。并将其编译成ruby函数。我们已经使用activerecord protobuf gem将活动记录消息转换为protobuf消息(通过调用“activerecord.to_proto”方法获得)。然而,在创建protobuf消息以创建ruby服务器时,我们无法传递“activerecord”。在定义输入值的类型时,我们没有别的办法,只能将它定义为prot

  • 我想在我的项目中使用谷歌protobuf。 关键是我必须设置每个消息的第一个字节,因为底层代码拒绝或接受基于第一个字节的消息,而它不知道protobuf。 所以这页说https://developers.google.com/protocol-buffers/docs/proto#scalar我必须使用与Java中的ByteString相对应的bytes字段。 字节可以包含任意字节序列。字符串By