> For the complete documentation index, see [llms.txt](https://wtifs.gitbook.io/diva-notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wtifs.gitbook.io/diva-notes/network/protobuf.md).

# Protobuf

**p\_siwliu**：

互联网起来初期，web服务使用http + json对外，后端再接个数据库就可以了。那个时候也没有微服务的概念，一个单体跑跑，不需要服务之间rpc调用，也就不太需要请求/响应序列化，反序列化。对于内部的非web服务，服务之间可能直接把struct序列化然后传输就可以了，也不考虑版本兼容性，甚至大小端都不考虑。

直到2000年左右Google之类大型互联网公司起来，他们自己内部有大量的服务，之间需要互相调用。

内部服务调用的一个特点是：传输所花费的时间比外部服务更少一些，因此序列化/反序列化的时间占比就提高了。内部调用凸显出 rpc 的重要性，也凸显出高效序列化、反序列化，和版本兼容的重要性。所以大厂们都采用IDL来对数据进行描述，比如，百度当时自己也有一套IDL，但是没有protobuf好用。google内部很早就在使用protobuf了，做了很多优化，并在2008年左右进行了开源（没有开源rpc部分），也就是protobuf 2.0。由于是Google家的开源产品，支持各种语言，在当时也确实是优化最好的IDL了（字节编码这些东西，在当时确实是眼前一亮，尽管不是什么新技术）。所以慢慢就流行开来，很多大厂也开始使用。

大厂的人跳槽，创业，继续推广开来。后来大家看google一直不开源rpc，那么我们自己来吧，但没人会从IDL开始搞，自然就直接使用protobuf作为rpc的IDL了，进一步推广了protobuf。另外，Google自己的产品当然也会首选protobuf最为数据格式了，google本身又是个热衷于开源的公司，当然也就更近一步推广了（比如Tensorflow）。

没有什么东西是one-fit-all的，用的人多了，业务场景多了，自然吐槽的就多了。同时Facebook等新的大厂也加入到了开源队伍（Thrift，同时还开源了rpc），互相卷，互相拆桥。当然protobuf自身也存在一些问题，所以后来google自己又搞了protobuf 3.0，另外还搞了个flatbuffer。

又过了好多年，google才开源了终于开源了GRPC……

所以个人认为，之所以会流行是因为：开源得早 + 确实做得好（尽管存在各种问题）+ 生态
