【问题标题】:How can I send a gRPC message whose format is determined at runtime?如何发送格式在运行时确定的 gRPC 消息?
【发布时间】:2019-02-21 10:17:12
【问题描述】:

我主要对在 Java 中执行此操作感兴趣,但看到任何语言的解决方案都会有所帮助。

根据我正在阅读使用 gRPC 的默认工作流程的各种文档是

  • 写一个.proto文件
  • 从该文件生成客户端和/或服务器代码
  • 编写程序并与生成的代码一起编译

我想做的是以编程方式读取消息架构(从.proto 文件或通过其他方式),然后将根据该架构布局的一些数据发送到某个地址。

我现在能看到的唯一方法是脱壳,在临时目录中生成代码,调用编译器,加载编译后的代码,并使用反射来获得预期的功能。

这对我来说听起来像是一种极端的黑客行为。有没有更简单的选择?

【问题讨论】:

  • 我不确定我是否理解这个问题。如果您使用 proto 定义,则格式始终为 Protobuf,而不是在运行时确定
  • 您打算如何使用未知模式填充对象?
  • 这是已知的——只是在程序编译的时候还没有。本质上,我正在尝试编写一个工具来 ping 不同的服务。编译工具时我无法生成代码,因为那时我不知道我将与哪些服务进行交互。
  • 我们有一个类似的用例:一个当前基于输入测试配置执行 REST 调用的测试工具,并且应该能够对 gRPC 调用执行相同的操作。速度并不重要。

标签: java grpc


【解决方案1】:

在 gRPC Java 中,生成的代码和 protos 是可选的,您实际上并不需要它们(尽管它们很方便)。要动态解释消息,您需要定义自己的Marshaller,它与InputStream 一起使用以访问原始消息字节。从这里您可以将它们缓冲到一个数组中,并决定如何解析它们。

作为一个类似的练习,我写了一篇关于使用JSON with gRPC 的更深入的教程。您的代码的原理应该相同。

【讨论】:

    猜你喜欢
    • 2021-05-10
    • 2020-03-12
    • 1970-01-01
    • 2022-08-16
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多