我相信您想将生成的服务器用于测试目的?如果是这样,有一种称为服务虚拟化或应用编程接口模拟的做法——测试双重系列的一个子集。它允许您“模拟”或“存根”真实系统,以测试被测系统。其中一些工具允许导入模式文件来生成存根(即Swagger/OpenAPI/Proto/WSDL/...)。
维基百科包含这些工具的列表。今天看看这个列表,其中一个支持gRPC的工具叫做流量鹦鹉,它允许您根据Proto文件创建gRPC模拟。也有像GripMock这样的开源工具,但它不会根据Proto文件生成存根,你必须手动创建它们。
请记住,生成的存根/模拟/模拟器只是一个测试替身,它不会复制Proto文件对应的系统的完整行为。导入Proto文件并生成服务器测试替身的工具只能知道消息的语法,而不知道语义学或真实系统的行为。
如果您还想部分复制消息的语义学,请考虑记录gRPC消息以创建服务存根,这样您也可以查看示例数据。
可能有一些方法可以从包含服务的protobuf动态构建gRPC服务器,但这并不是很有用。事实上,铁锈板条箱,节点。js和其他实现可以动态生成代码,而无需直接使用protoc的额外手动步骤。
正如评论员所建议的那样,proto文件只定义了服务方法名称及其输入和输出消息,因此,假设的服务器除了接收消息和可能发送空回复之外,不会对消息做任何处理。
因为protos是强类型的,所以这样存根服务器也没有任何好处,因为您的(例如Java)客户端能够创建类型良好的消息(没有服务器)。
您的用例是什么?这可能有助于提出其他答案。
如果不想处理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