1. Body size:json 字节数包含引号逗号方括号花括号、key 这些,字节数远大于 pb ,所以流量更浪费、对应的网络时间消耗也大一些
2. Codec:即使高性能的实现,通常后端相同语言 codec 性能也比 pb 差
json 胜在自释,更灵活;但是其他 rpc 也可以使用 pb ,比如 http+pb+rpc
3. Transport:grpc 绑定了 HTTP2.0 ; json rpc 可以用 tcp 或者其他可靠的协议,如果内网无所谓安全可以使用 4 层的 tcp ,json rpc 在 transport 这层上的消耗比 grpc 节省很多,性能可能更快
4. 工程性:强类型结构化,工程更规范。pb 默认这样子了,json 也可以工程规范约束使用强类型结构化,也可以规范
单说 grpc 的话,我觉得谷歌挺坑的。HTTP2.0 没有解决 4 层 TCP 的线头阻塞问题,对于 rpc 场景,多数是内网,直接 tcp 性能和消耗更友好。rpc 的交互模式就是残疾,对于更广阔的领域的交互需求支撑比较麻烦。
我的 arpc 除了多语言支持不够(只支持 golang 和前端 js ),其他各方面都比 grpc 强太多了:
1. transport 可定制,能使用 tcp/tls/kcp/utp/quic/websocket...各种实现了 net.Listener/net.Conn 的协议
2. codec 可定制,能使用 json/pb/msgpack...各种,你想用啥旧用啥
3. 交互方式多种多样,支持的业务场景丰富,除了支持传统 rpc 的 Client Call ,也支持 Client Notify/Server Call/Server Notify ,而且支持 CallAsync ,在这些丰富的交互模式下,可以做推送、IM 、游戏...各种业务
4. 支持中间件,比如你用 gin ,很多中间件,arpc 也可以各种定制
5. 其他扩展,比如你想单机百万连接,可以再基于 nbio 做网络层
6. 性能:请搜索参考鸟窝老师这个文章,三方压测比较客观:”2022 Go 生态圈 rpc 框架 Benchmark“。性能甩 grpc 简直不是一条街的,完全不屑于跟 grpc 比性能...
7. 易用性:3 中列举了支持各种交互模式和业务,使用上也非常简单,就像 golang 标准库 http handler 一样 easy ,不需要像 grpc 那样生成僵硬呆板的代码
8. 异步的粒度:arpc 支持最灵活的异步,请参考这里:
https://github.com/lesismal/arpc/issues/41...
真的有点不屑于跟其他 rpc 对比了。。。