官网是这么说的 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
aw2350 2023-03-24 12:02:04 +08:00
我的理解 grpc 用自己的 protoc 序列化协议,压缩了最终生成的 json 数据,你们对接系统,他们肯定得给你 proto 文件吧?
|
2
tool2d 2023-03-24 12:22:09 +08:00
"不是 http/json 转 GRPC 啊 是 GRPC+JSON"
是一个意思,gRPC 是一种调用规范,而序列化格式是可以转换的,对外不一定非要 Protobuf 。你可以把结果转成 json ,也就是官方推荐的 web 转接层。 用 json 的系统很多的,包括 http1 也多。gRPC 不可能单单依靠 http2 通吃市场,不现实。 |
3
chaleaochexist OP @tool2d 也就是说 如果我是一个 GRPCserver.
我的客户端 可能都不知道我是一个 GRPC server. 我的客户端 可能把我当 HTTP serveri 用了. 只不过服务端的我, 通过一个 proxy 譬如 GRPC gateway, 转换成 GRPC 的形式了. 我可以这么理解吗? |
4
youngxhui 2023-03-24 13:12:47 +08:00 via Android
grpc 与编码方式无关,protobuf 只是一个默认的编解码方式,可以替换,实现相关接口就可以。官方文章 https://grpc.io/blog/grpc-with-json/
|
5
joesonw 2023-03-24 13:22:21 +08:00 via iPhone
GRPC 只是在 http/2 上封装的,传输什么无所谓的,和普通 http 请求一样,都是用请求头来判断 codec ,只是默认都是用 protobuf codec 而已。
|
6
joesonw 2023-03-24 13:23:44 +08:00 via iPhone
例如 go client 的就在这 https://pkg.go.dev/google.golang.org/grpc#CallCustomCodec
|
7
chaleaochexist OP @youngxhui 实不相瞒 我没看懂...
|
8
eightyfive 2023-03-24 15:25:00 +08:00
grpc 本身就可 json 格式数据,走 http 的接口就能调通了
|
9
rev1si0n 2023-03-24 18:16:56 +08:00
我认为我对 JSONRPC 、GRPC 算有点了解,你的问题,实不相瞒,我看不懂。
|
10
youngxhui 2023-03-24 18:21:32 +08:00 via Android
@chaleaochexist #7 你的需求不是将 protobuf 换成 json 吗?
|
11
rev1si0n 2023-03-24 18:27:09 +08:00
我第一个想到的是你准备使用网关将 gRPC 转换成类 JSONRPC ,grpc 用的 protobuf 是可以转换成 JSON 的,如果你想的是将 gRPC 用的 protobuf 格式使用 JSON 格式替代,不明白你为什么会做这种事情,为什么不直接用 jsonRPC 呢,自废武功。
|
12
lambdaq 2023-03-24 18:32:59 +08:00
定义一个 bp ,写一个字段叫 data ,把 json 序列化成 string 丢进去即可。
|
13
chaleaochexist OP @youngxhui 我觉得应该定义一个 codec 但是我没在代码里看到.
哎 总之我不是很懂 java... |
14
solitude2 2023-03-25 03:13:37 +08:00 via Android
@youngxhui 前公司遇到过这种场景:有一个代理(类似于 grpc-gateway),把 http 请求体 json 传给 grpcgo ,得到的响应体也是 http body(json 格式)
|
15
solitude2 2023-03-25 03:18:19 +08:00 via Android
@chaleaochexist 任何 api 网关想想支持反向代理 grpc 服务端,都需要做这种协议转换的处理的。
|
16
solitude2 2023-03-25 03:21:38 +08:00 via Android
@joesonw op 说的应该不是框架内部数据的序列化,而是调用方无感知 protobuf 这个格式,想使用 json 通用格式。关键在于怎么把 grpc 的接口请求和响应结果都抽象成 http1.1 server 一样
|
17
chaleaochexist OP @solitude2 还真不是如果是这个需求 用 grpc-gateway 就解决了.
目前我的需求我自己都不知道是啥了 我就感觉无法实现. 真正的需求是这样的: 有一个系统, 调用我们提供的回调. 方式有 kafka 和 GRPC kafka 好理解, 把消息丢给 kafka 就不管了. 我们从 kafka 读消息. 如果是 GRPC 序列化方式是 json 没有 protobuf. 也没有回调函数名. 也没有文档. 也没有例子. 我现在需要做得是写一个 grpc server 收对方的消息. 消息格式是啥不知道. 对方怎么调用的不知道. 就知道是一个 json. 我感觉无法实现啊. |
18
solitude2 2023-03-25 23:43:34 +08:00 via Android
@chaleaochexist 假设调用方完全没接触过 grpc ,那肯定是 json 这种更通用且简单。你需要写一个 proxy_server 做协议转换,把 json 转 pb ,pb 转 json
|