protobuf gRPC 这种写配置文件生成代码的形式 "流行"的原因是什么?

2021-06-12 00:01:15 +08:00
 chaleaoch
再比如 mybatis 用 xml 写 sql.
在比如 spring 初期用 xml 做 IOC...
诸如此类. 这么做的目的是什么?

作为一个 python 程序员不是很习惯.


第二个问题是, 为什么讲 go 和 node 什么的 从 gRPC 里面扯出去新搞了一个仓库.
类似的还有 protoc vs protobuf-gen-go


谢谢大佬们.
6324 次点击
所在节点    程序员
39 条回复
Mitt
2021-06-12 00:08:17 +08:00
Protobuf 是二进制,并且在 protobuf 基础上还有各种 rpc 通讯等定义,protoc 和 protobuf-gen-go 分工不同,后者才是编译生成最终文件的,每个语言都有各自的 gen 工具
abcysn
2021-06-12 00:17:30 +08:00
我 go 、c 、Python 都用,稍大点的工程还是偏好编译型的语言,也喜欢 protobuf 这种做法,感觉这样比较严谨,很多低级错误编译阶段就发现了,会省不少调试时间
chaleaoch
2021-06-12 00:21:16 +08:00
@Mitt 谢谢,但是为什么分仓库呢... python 就没有分仓库啊.
dcoder
2021-06-12 00:23:48 +08:00
protobuf 是跨语言的,所以搞成这样. 都是语言太多整出来的麻烦.
你说的分库是 protobuf 各个语言生成器么? 多个库方便不同的 team 管理吧.
chaleaoch
2021-06-12 00:27:45 +08:00
@Mitt 而且 protoc 安装一次就可以了 go 需要安装两个东西.
chaleaoch
2021-06-12 00:29:52 +08:00
@dcoder 谢谢 就是说 从某种角度上来说将来各个语言都有可能单独拆出去.


但是我不明白 gRPC-go 为什么要用 Go 重写一遍实现. 直接用 gRPC 不好吗? 这不是重复劳动吗?
no1xsyzy
2021-06-12 00:46:27 +08:00
@chaleaoch 重复造轮子是程序员常态
http://paulgraham.com/own.html
... It's easy for something new to feel like a project of your own. That's one of the reasons for the tendency programmers have to rewrite things that don't need rewriting, and to write their own versions of things that already exist. ...
CSM
2021-06-12 00:50:36 +08:00
生成代码是因为目标语言不是动态语言,并且没有强大的宏系统
agagega
2021-06-12 00:51:36 +08:00
对于表达能力强的语言,完全可以用 DSL,而不是用这种生成器来搞一堆代码出来
billlee
2021-06-12 01:23:32 +08:00
时代的遗产吧,当时没有好用的编译期反射 /宏。

ORM 方面,hibernate 就用 annotation processor. 序列化方面 java / golang 的 json 都用反射而不是代码生成了.

Scala 甚至可以不写 proto 直接根据 case class 定义序列化成 protobuf
jim9606
2021-06-12 02:58:36 +08:00
第一个问题:这些场景的 xml 其实是当成 DSL 用的。因为当时的环境直接用编程语言表达这个很不直观。

考虑下用执行代码描述一个用户界面,你得用这种顺序描述:
A.init,A.setP1,A.setP2,B.init,B.setP1,C.init,B.addChild(C),A.addChild(B)

如果换成 xml 能更好地体现层次结构,更好维护。

第二个问题:protoc 项目支持(proto->C/C++/OC/C#/Py/Ruby/java),protobuf-gen-go 项目支持(proto->go),项目本身用啥语言跟支持输出啥代码没有必然联系,你要愿意的话在 protoc 上扩充一下实现输出 go 也是有可能的。
chinvo
2021-06-12 04:13:01 +08:00
protobuf .net 就不需要写 proto 文件, 可以直接定义 class 和 interface. 但是如果你要和其他语言通信, 你还是得用 proto 文件.
wellsc
2021-06-12 05:46:00 +08:00
花里胡哨的,json +http 他不香吗
suantong
2021-06-12 06:10:46 +08:00
来源于游戏
Leigg
2021-06-12 08:59:33 +08:00
因为是跨语言通讯数据格式,需要媒介连接,.proto 文件就是媒介
horsley
2021-06-12 09:46:25 +08:00
@chaleaoch 关键点在于你说的 直接用“grpc”,是说用 C++版本,而 Go 里面虽然是可以用 C++的库,但是会在编译上增加麻烦,并且影响构建二进制的平台兼容性。因此 Go 的习惯里面我们希望能用纯 Go 就纯 Go,系统库也是这么干的,例如说加解密相关的,很多程序都会依赖 openssl,而 Go 则不依赖 openssl 自行实现了
LazyWolfLin
2021-06-12 10:54:55 +08:00
很多原因共同导致的。首先是前后端有跨语言的需求,当然跨语言格式有很多:xml 、 @wellsc 说的 json 、protobuf 。但是网络通道并不是一开始就是光纤和 4G 网,xml 、json 同 protobuf 在消息长度上有两倍甚至三倍的差距,这意味着使用 xml 和 json 会导致更大的网络延迟。
LazyWolfLin
2021-06-12 11:03:45 +08:00
而 protobuf 相比于 xml 和 json 能够有更小的体积则是通过编码的方式达成的。为了保证同一份 proto 协议在前后端不同编码解码实现能够有一致表现,同时也为了减少程序员的编码负担,代码生成器 protoc 就必不可少了。
bwangel
2021-06-12 15:37:17 +08:00
@wellsc json 真的一点都不香。

前端要什么,后端就返回什么,一个字段不许少,一个字段不许多。

“一个字段不许多”。这一点很多接口都做不到。
wellsc
2021-06-12 16:30:33 +08:00
@bwangel 这。。。不是框架自己做的限制?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/783023

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX