java - 如何直接从protobuf创建GRPC服务器而不将其编译成java代码
问题描述
有必要将通用 GRPC 服务器实现为存根。
没有为服务器找到类似的东西,仅适用于客户端。
非常感谢!
解决方案
如果您不想处理 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,可以使用DynamicMessage
gRPC 的 Protobuf Marshaller。一个类似的客户端问题解释了该过程。
推荐阅读
- mysql - 遍历 SQL 中的数据
- jenkins - Sonarqube webhook 对 Jenkins Localhost 无效
- python - 在断开连接之前等待读取命名管道
- laravel - 如何使路由接受 # 以访问长页面中的各个段落
- sql-server - 使用 cluster.exe 为 MS SQL 故障转移 AOAG 创建批处理脚本
- android - 三星可穿戴 Tizen 应用拒绝无深层链接
- cmake - CMake - 将 add_library 设置为 SHARED 会导致致命错误 U1073:不知道如何制作
- c# - 如果 XML 文件不再可用,C# 会中断 XML 读取功能
- excel - VBA SpecialCells 代码适用于家用电脑,但不适用于工作电脑
- google-api - GSuite - 使用非管理员访问令牌检索组织中的组