Envoy vs Nginx vs HAProxy

Mar 19, 2020 18:00 · 1331 words · 3 minute read Gateway Nginx

七层世界

在今天的云上世界,业务逻辑通常分布在各个微服务中。这些服务需要通过网络相互通讯,它们使用的核心网络协议就是所谓的“七层”协议,例如 HTTP、HTTP/2、gRPC、Kafka、MongoDB 等等。这些协议都基于经典的传输层协议 TCP。因为大部分云应用程序的 API 都依赖七层流量,所以能够管理和观察应用流量是至关重要的需求。

三分天下

如果我们不想自己写一个代理的话,能选择的并不多,也就只有 HAProxy、Nginx 和 Envoy。在某种程度上,它们经历过实战的检验,都是非常可靠的,而 Envoy 是该领域最年轻的。

我们首先评估三种代理的不同特性,意识到七层代理在很多方面都是基础设施。所有的代理在可靠且有效地路由七层流量方面都表现出色,这点毋庸置疑。虽然它们不尽相同,但如果必要的话我们可以在代理本身中实现任何缺失的重要功能,毕竟它们都是开源的!我们将考量标准放在每个项目的社区、推进速度和设计哲学,希望看到一个项目有着良好的前进速度,因为这表明该项目随着客户的需求在迅速发展。最后,我们想要一个以七层协议为中心的微服务世界紧密相关的项目。

HAProxy

几年前,有人根据 AirbBnb 的 SmartStack 基于 HAProxy 开发了名为 Baker Street 的客户端负载均衡器。HAProxy 很靠谱而且速度飞快。虽然我们对 HAProxy 很满意,但是也有些长期的担忧。这东西在 2006 年就发布了,当时的互联网和今天截然不同。他们的社区看起来有点跟不上脚步,举个例子,四年后 v1.5 版才支持 SSL。热重载(无需重启代理就重载配置)是最大的问题,直到 2017 年底都仍未彻底解决。HAProxy 团队通过 v1.8 版开始追赶满足微服务的最低需求,但 1.8 直到 2017 年底才发布。

Nginx

Nginx 大家都很熟悉,性能好而且支持热重载。Nginx 最初被设计为 web 服务器,并随着时间的推移已经发展到支持更多的传统代理用例。Nginx 开源版也有不少限制,包括有限的可观察性和健康检查,为了克服 Nginx 开源版的局限甚至还有人搞出了同时部署 HAProxy 和 Nginx 这样的骚操作。

总体上来看,尽管 Nginx 的推进速度比 HAProxy 要快,也要担心 Nginx Plus(商业版)会锁定很多我们需要的功能。Nginx 的业务模型在开源产品和商业产品之间造成了差别,有一定的不确定性。(虽然 HAProxy 也有企业版,但 EE 和 CE 的功能差距没那么大)

Envoy

Envoy 是名单里最新的,但是已在 Lyft、Apple、Google、Salesforce 等公司上生产。现在来看,2016 年 9 月 Envoy 发布开启了代理领域的一轮激烈的创新和竞争。

Envoy 就是专为微服务设计的,天生有热重载、可观察、可伸缩和高级负载均衡等功能。Envoy 也拥抱了分布式架构,将一致性作为核心设计原则,并暴露了用于配置的动态 API。传统的代理一般是用静态文件来配置的,Envoy 支持静态配置模型的同时还允许通过 gRPC/protobuf API 进行配置。这样大大简化了规模化的管理,还使 Envoy 可以在有临时服务的环境中更好地工作。

我们非常喜欢 Envoy 的功能和对产品的前瞻性,我们还发现相比 HAProxy 和 Nginx,Envoy 的社区很独特。与其他两款代理不同,Envoy 不属于任何单个商业实体,Envoy 最初是 Lyft 搞出来的,Lyft 并不直接靠 Envoy 赚钱。Envoy 的创造者 Matt Klein 声明他不会创办 Envoy 平台公司。社区以最佳代码实现正确的功能为首要目标,没有任何商业考虑。最后,Lyft 将 Envoy 捐赠给了 CNCF,确保打造最好的七层代理的初心不变。