GRPC + json 如何实现? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
请不要在回答技术问题时复制粘贴 AI 生成的内容
chaleaochexist

GRPC + json 如何实现?

  •  
  •   chaleaochexist Mar 24, 2023 3126 views
    This topic created in 1130 days ago, the information mentioned may be changed or developed.

    官网是这么说的 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...

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

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

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


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

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

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

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

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


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


    我感觉无法实现啊.
    solitude2
        18
    solitude2  
       Mar 25, 2023 via Android
    @chaleaochexist 假设调用方完全没接触过 grpc ,那肯定是 json 这种更通用且简单。你需要写一个 proxy_server 做协议转换,把 json 转 pb ,pb 转 json
    About     Help     Advertise     Blog     API     FAQ     Solana     5086 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 98ms UTC 05:40 PVG 13:40 LAX 22:40 JFK 01:40
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86