V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
chaleaochexist
V2EX  ›  程序员

GRPC + json 如何实现?

  •  
  •   chaleaochexist · 2023-03-24 11:54:00 +08:00 · 2132 次点击
    这是一个创建于 370 天前的主题,其中的信息可能已经有所发展或是发生改变。

    官网是这么说的 Can I use gRPC with my favorite data format (JSON, Protobuf, Thrift, XML) ?

    Yes. gRPC is designed to be extensible to support multiple content types. The initial release contains support for Protobuf and with external support for other content types such as FlatBuffers and Thrift, at varying levels of maturity

    有大佬给个例子吗? 我实在是想不出来.且 ChatGPT 也不会...

    不是 http/json 转 GRPC 啊 是 GRPC+JSON

    如果你问为什么. 因为我要对接一个系统, 那个系统只提供两种序列化方式一种是 json 一种是 gob...

    那个对接的系统文档也有限 我还没研究明白.

    如果我的需求不可能实现也可以告诉我. 我告诉我老板实现不了.

    第 1 条附言  ·  2023-03-25 23:31:29 +08:00
    真正的需求是这样的:
    有一个系统, 调用我们提供的回调. 方式有 kafka 和 GRPC
    kafka 好理解, 把消息丢给 kafka 就不管了. 我们从 kafka 读消息.
    如果是 GRPC 序列化方式是 json 没有 protobuf. 也没有回调函数名. 也没有文档. 也没有例子.
    我现在需要做得是写一个 grpc server 收对方的消息. 消息格式是啥不知道. 对方怎么调用的不知道. 就知道是一个 json.


    我感觉无法实现啊.
    18 条回复    2023-03-25 23:43:34 +08:00
    aw2350
        1
    aw2350  
       2023-03-24 12:02:04 +08:00
    我的理解 grpc 用自己的 protoc 序列化协议,压缩了最终生成的 json 数据,你们对接系统,他们肯定得给你 proto 文件吧?
    tool2d
        2
    tool2d  
       2023-03-24 12:22:09 +08:00
    "不是 http/json 转 GRPC 啊 是 GRPC+JSON"

    是一个意思,gRPC 是一种调用规范,而序列化格式是可以转换的,对外不一定非要 Protobuf 。你可以把结果转成 json ,也就是官方推荐的 web 转接层。

    用 json 的系统很多的,包括 http1 也多。gRPC 不可能单单依靠 http2 通吃市场,不现实。
    chaleaochexist
        3
    chaleaochexist  
    OP
       2023-03-24 12:40:42 +08:00   ❤️ 1
    @tool2d 也就是说 如果我是一个 GRPCserver.
    我的客户端 可能都不知道我是一个 GRPC server.
    我的客户端 可能把我当 HTTP serveri 用了. 只不过服务端的我, 通过一个 proxy 譬如 GRPC gateway, 转换成 GRPC 的形式了.

    我可以这么理解吗?
    youngxhui
        4
    youngxhui  
       2023-03-24 13:12:47 +08:00 via Android
    grpc 与编码方式无关,protobuf 只是一个默认的编解码方式,可以替换,实现相关接口就可以。官方文章 https://grpc.io/blog/grpc-with-json/
    joesonw
        5
    joesonw  
       2023-03-24 13:22:21 +08:00 via iPhone
    GRPC 只是在 http/2 上封装的,传输什么无所谓的,和普通 http 请求一样,都是用请求头来判断 codec ,只是默认都是用 protobuf codec 而已。
    joesonw
        6
    joesonw  
       2023-03-24 13:23:44 +08:00 via iPhone
    chaleaochexist
        7
    chaleaochexist  
    OP
       2023-03-24 14:02:26 +08:00
    @youngxhui 实不相瞒 我没看懂...
    eightyfive
        8
    eightyfive  
       2023-03-24 15:25:00 +08:00
    grpc 本身就可 json 格式数据,走 http 的接口就能调通了
    rev1si0n
        9
    rev1si0n  
       2023-03-24 18:16:56 +08:00
    我认为我对 JSONRPC 、GRPC 算有点了解,你的问题,实不相瞒,我看不懂。
    youngxhui
        10
    youngxhui  
       2023-03-24 18:21:32 +08:00 via Android
    @chaleaochexist #7 你的需求不是将 protobuf 换成 json 吗?
    rev1si0n
        11
    rev1si0n  
       2023-03-24 18:27:09 +08:00
    我第一个想到的是你准备使用网关将 gRPC 转换成类 JSONRPC ,grpc 用的 protobuf 是可以转换成 JSON 的,如果你想的是将 gRPC 用的 protobuf 格式使用 JSON 格式替代,不明白你为什么会做这种事情,为什么不直接用 jsonRPC 呢,自废武功。
    lambdaq
        12
    lambdaq  
       2023-03-24 18:32:59 +08:00
    定义一个 bp ,写一个字段叫 data ,把 json 序列化成 string 丢进去即可。
    chaleaochexist
        13
    chaleaochexist  
    OP
       2023-03-24 18:37:23 +08:00
    @youngxhui 我觉得应该定义一个 codec 但是我没在代码里看到.
    哎 总之我不是很懂 java...
    solitude2
        14
    solitude2  
       2023-03-25 03:13:37 +08:00 via Android
    @youngxhui 前公司遇到过这种场景:有一个代理(类似于 grpc-gateway),把 http 请求体 json 传给 grpcgo ,得到的响应体也是 http body(json 格式)
    solitude2
        15
    solitude2  
       2023-03-25 03:18:19 +08:00 via Android
    @chaleaochexist 任何 api 网关想想支持反向代理 grpc 服务端,都需要做这种协议转换的处理的。
    solitude2
        16
    solitude2  
       2023-03-25 03:21:38 +08:00 via Android
    @joesonw op 说的应该不是框架内部数据的序列化,而是调用方无感知 protobuf 这个格式,想使用 json 通用格式。关键在于怎么把 grpc 的接口请求和响应结果都抽象成 http1.1 server 一样
    chaleaochexist
        17
    chaleaochexist  
    OP
       2023-03-25 23:30:44 +08:00
    @solitude2 还真不是如果是这个需求 用 grpc-gateway 就解决了.

    目前我的需求我自己都不知道是啥了 我就感觉无法实现.


    真正的需求是这样的:
    有一个系统, 调用我们提供的回调. 方式有 kafka 和 GRPC
    kafka 好理解, 把消息丢给 kafka 就不管了. 我们从 kafka 读消息.
    如果是 GRPC 序列化方式是 json 没有 protobuf. 也没有回调函数名. 也没有文档. 也没有例子.
    我现在需要做得是写一个 grpc server 收对方的消息. 消息格式是啥不知道. 对方怎么调用的不知道. 就知道是一个 json.


    我感觉无法实现啊.
    solitude2
        18
    solitude2  
       2023-03-25 23:43:34 +08:00 via Android
    @chaleaochexist 假设调用方完全没接触过 grpc ,那肯定是 json 这种更通用且简单。你需要写一个 proxy_server 做协议转换,把 json 转 pb ,pb 转 json
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   982 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 21:59 · PVG 05:59 · LAX 14:59 · JFK 17:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.