优秀开源项目 gogo/protobuf 已经凉了。。。

大家好,我是煎鱼。

最近我有一个朋友在内部陆续推动一些内部更新时,发现一个比较震惊的事,就是一个著名的 Go 开源项目居然已经陨落有两年多了。

a317a1e726a59f45558e496039f7f85d.png

突然发现自己当年没能及时发现...似乎完全被当时 golang/protobuf v2 的热度压没了。尴尬得很。

gogo/protobuf 发展和成熟

相信大家对于 gogo/protobuf 这一个优秀的 Go 开源项目并不陌生,使用 grpc 就会用到 protobuf,就不可避免的都会有接触到。

同时业内也有许多开源项目也在使用,包含但不限于:etcd、kubernetes、tidb 等著名项目。以下是一个快速介绍。

以下是项目作者给出有在使用者的图:

a6fa0606b652d72bedef0b205c1097bd.png

gogo/protobuf 是基于 golang/protobuf fork 的第三方 protobuffer 库。其在性能、特性等多方面都在当时显著优于官方库。

性能方面可以查看 Benchmarks 的压测报告。说白了,就是明显好不少。

特性方面,gogo/protobuf 感觉被使用较多的是其结构体的标签功能。

例如如下 gogo proto 代码:

package test;

import "github.com/gogo/protobuf/gogoproto/gogo.proto";

message A {
    optional string Description = 1 [(gogoproto.nullable) = false];
    optional int64 Number = 2 [(gogoproto.nullable) = false];
    optional bytes Id = 3 [(gogoproto.customtype) = "github.com/gogo/protobuf/test/custom.Uuid", (gogoproto.nullable) = false];
 }

将会生成类似如下代码:

type A struct {
 Description string
 Number      int64
 Id          github_com_gogo_protobuf_test_custom.Uuid
}

简单来讲,就是可以基于标签做很多事情。官方的 golang/protobuf 没有这一块的功能特性,因此很多人会为此选择 gogo/protobuf。

你会发现 gogo/protobuf 这一个第三方库,比官方库性能更好,特性更丰富。在当时维护的也很积极。因此成为了最为出名最多人使用的 protobuffer 库。

为什么 gogo 陨落了

0789d3fcac9232195ea908203f3f3803.png


官方理由:干不动了

主要的维护者 @Walter Schulze 在当时发布了以下的通知:

64272c906a14be78f2344b71adf43f98.png

大概的关键意思如下:

  1. 维护人员变动:GoGo Protobuf 项目的维护人员因个人情况变化,无法继续处理项目问题和功能请求。

  2. 兼容性挑战:最新的 golang/protobuf 1.4.x 版本(protobuf-apiv2)需要大量工作来确保兼容性,目前无人承担这项任务,用户对项目未来感到不确定。

  3. 寻求业内帮助:项目可能会被迫停止,因此我们向行业用户寻求帮助,希望有组织能够接手维护该项目。

简而言之,第一点是是自己变了,维护不来了,第二点官方 API V2 也变了,工作量巨大。彻底压垮了这个项目的维护。

失去了自由时间

更直观来看,@Walter Schulze 在 GopherCon UK 视频中给出了一个服务开源社区时的案例。如下图所示:

b19a148733f615608f872ad9dac5581b.png
  1. 要求作者在周末加班加点服务,要求视频会议。

  2. 视频会议说好的 15 分钟,最后变成了 1 个小时。

  3. 他最终失去了自己的自由时间,也没有所谓的更多钱。

其他开源项目被锤的例子

Log4j 维护者之一 @Volkan Yazıcı 在某社交平台大力吐槽:

9bc0662fa57ecbfeed4d5c52342419f9.png

大概意思:“Log4j 的维护人员一直在夜以继日地工作,致力于缓解措施、修复、文档、CVE以及回复查询等工作。然而,人们依然不断批评我们,尽管我们为这些工作并未获得报酬,并且这一我们不喜欢却因向后兼容性问题必须保留的功能。”

总结

这是一个非常现实的问题。一个著名的开源项目,必定被许多项目直接或间接依赖,这些项目中又有许多的开发人员。每个人提几个,凑着凑着就会非常多。

慢慢的,随着年龄增长和变化。维护的核心骨干都会有更多自己的事,例如:家庭,或者更多兴趣别的事情。这时这些业务开源项目都会慢慢走向凋零。因此在更早有热情时做好开枝散叶就非常重要了。

对于我们业内人士来讲,使用官方库,或者功能特性稳定的第三方库。甚至参与 fork 贡献,都能带来不少的价值。

最后还是非常感谢 gogo/protobuf 给 Go 生态圈所提供的功能和价值!

关注和加煎鱼微信,

一手消息和知识,拉你进技术交流群👇

a16aae5376a2ead1afa3a65846a4945b.jpeg

280f4f6cbfbb42135209daa44fcf8332.png

你好,我是煎鱼,出版过 Go 畅销书《Go 语言编程之旅》,再到获得 GOP(Go 领域最有观点专家)荣誉,点击蓝字查看我的出书之路

日常分享高质量文章,输出 Go 面试、工作经验、架构设计,加微信拉读者交流群,和大家交流!

原创不易 点赞支持

推荐阅读

在Docker中安装ProtobufProtocol Buffers)通常可以通过Dockerfile来实现。以下是一个基本的Dockerfile例子,用于构建一个包含Protobuf预编译二进制文件的Docker镜像。 ```Dockerfile # 使用官方Python镜像作为基础镜像 FROM python:3.8-slim # 设置环境变量 ENV PROTOBUF_VERSION 3.11.4 # 更新包管理器并安装依赖 RUN apt-get update && apt-get install -y \ build-essential \ autoconf \ automake \ libtool \ curl \ make # 安装Protobuf编译器 RUN curl -L https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOBUF_VERSION}/protobuf-all-${PROTOBUF_VERSION}.tar.gz | tar xvz WORKDIR protobuf-${PROTOBUF_VERSION} RUN ./autogen.sh && ./configure && make -j$(nproc) && make install RUN ldconfig # 清理安装包和工作目录 RUN apt-get remove -y --purge autoconf automake libtool make WORKDIR /tmp RUN rm -rf protobuf* # 其他安装步骤... ``` 在上面的Dockerfile中,我们首先从官方的Python镜像开始构建,然后更新系统的包管理器并安装了必要的依赖。接着,我们下载了Protobuf的源代码,解压并进入到解压后的目录中。在这里,我们运行了一系列的配置脚本,并编译和安装了Protobuf。最后,我们清理了系统以确保最终的镜像尽可能小。 请注意,上述示例中的版本号`3.11.4`是Protobuf的一个版本,你应该根据实际需要选择正确的版本号。另外,这个示例安装的是Protobuf的二进制文件,如果你需要在Docker镜像中使用Protobuf来编译`.proto`文件,你可能还需要安装`protoc`编译器。 现在,让我们回答你的问题: ``` Docker下安装Protobuf的过程大致如下: 1. 选择合适的Docker基础镜像。 2. 更新系统的包管理器并安装所需的依赖。 3. 下载Protobuf的源代码包。 4. 解压并进入解压后的目录。 5. 运行配置和安装脚本。 6. 清理系统,删除临时文件和不再需要的包。 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值