写点什么

云原生时代的流量入口:Envoy Gateway

  • 2020 年 7 月 29 日
  • 本文字数:4637 字

    阅读完需:约 15 分钟

云原生时代的流量入口:Envoy Gateway

流量入口代理作为互联网系统的门户组件,具备众多选型:从老牌代理 HAProxy、Nginx,到微服务 API 网关 Kong、Zuul,再到容器化 Ingress 规范与实现,不同选型间功能、性能、可扩展性、适用场景参差不齐。当云原生时代大浪袭来,Envoy 这一 CNCF 毕业数据面组件为更多人所知。那么,优秀“毕业生”Envoy 能否成为云原生时代下流量入口标准组件?


背景 —— 流量入口的众多选型与场景

在互联网体系下,凡是需要对外暴露的系统几乎都需要网络代理:较早出现的 HAProxy、Nginx 至今仍在流行;进入微服务时代后,功能更丰富、管控能力更强的 API 网关又成为流量入口必备组件;在进入容器时代后,Kubernetes Ingress 作为容器集群的入口,是容器时代微服务的流量入口代理标准。关于这三类典型的七层代理,核心能力对比如下:



从上述核心能力对比来看:


  • HAProxy&Nginx 在具备基础路由功能基础上,性能、稳定性经历多年考验。Nginx 的下游社区 OpenResty 提供了完善的 Lua 扩展能力,使得 Nginx 可以更广泛的应用与扩展,如 API 网关 Kong 即是基于 Nginx+OpenResty 实现。

  • API 网关作为微服务对外 API 流量暴露的基础组件,提供比较丰富的功能和动态管控能力。

  • Ingress 作为 Kubernetes 入口流量的标准规范,具体能力视实现方式而定。如基于 Nginx 的 Ingress 实现能力更接近于 Nginx,Istio Ingress Gateway 基于 Envoy+Istio 控制面实现,功能上更加丰富(本质上 Istio Ingress Gateway 能力上强于通常的 Ingress 实现,但未按照 Ingress 规范实现)。


那么问题来了:同样是流量入口,在云原生技术趋势下,能否找到一个能力全面的技术方案,让流量入口标准化?


Envoy 核心能力介绍

Envoy是一个为云原生应用设计的开源边缘与服务代理(ENVOY IS AN OPEN SOURCE EDGE AND SERVICE PROXY, DESIGNED FOR CLOUD-NATIVE APPLICATIONS,@envoyproxy.io),是云原生计算基金会(CNCF)第三个毕业的项目,GitHub 目前有 13k+ Star。


Envoy 有以下主要特性:


  • 基于现代 C++开发的 L4/L7 高性能代理。

  • 透明代理。

  • 流量管理。支持路由、流量复制、分流等功能。

  • 治理特性。支持健康检查、熔断、限流、超时、重试、故障注入。

  • 多协议支持。支持 HTTP/1.1,HTTP/2,GRPC,WebSocket 等协议代理与治理。

  • 负载均衡。加权轮询、加权最少请求、Ring hash、Maglev、随机等算法支持。支持区域感知路由、故障转移等特性。

  • 动态配置 API。提供健壮的管控代理行为的接口,实现 Envoy 动态配置热更新。

  • 可观察性设计。提供七层流量高可观察性,原生支持分布式追踪。

  • 支持热重启。可实现 Envoy 的无缝升级。

  • 自定义插件

  • 能力。Lua 与多语言扩展沙箱 WebAssembly。


总体来说,Envoy 是一个功能与性能都非常优秀的“双优生”。在实际业务流量入口代理场景下,Envoy 具备先天优势,可以作为云原生技术趋势流量入口的标准技术方案:


1. 较 HAProxy、Nginx 更丰富的功能

相较于 HAProxy、Nginx 提供流量代理所需的基本功能(更多高级功能通常需要通过扩展插件方式实现),Envoy 本身基于 C++已经实现了相当多代理所需高级功能,如高级负载均衡、熔断、限流、故障注入、流量复制、可观测性等。更为丰富的功能不仅让 Envoy 天生就可以用于多种场景,原生 C++的实现相较经过扩展的实现方式性能优势更为明显。


2. 与 Nginx 相当,远高于传统 API 网关的性能

在性能方面,Envoy 与 Nginx 在常用协议代理(如 HTTP)上性能相当。与传统 API 网关相比,性能优势明显。如下为 Envoy 与几种业务常用的 API 网关选型在 8 核物理机容器运行环境下,简单路由代理性能对比数据:(网易内部环境实测数据,仅供参考)


Envoy Gateway:



基于 Java 的异步化 API 网关:



Kong:



APISIX:



从以上性能数据可以看出,相同条件下:


  • Envoy 的 TPS 可以达到 12W 左右;

  • 基于 Java 的异步化 API 网关最高可到 2.8W 左右;

  • 基于 Nginx 的 Kong,TPS 可以到 5W 左右;

  • 基于 Nginx 并相较 Kong 有一定优化的 APISIX 可以到 9W 左右。


可以看出:


  • 简单路由代理场景下,Envoy 性能优势已经比较明显;

  • 复杂路由与治理功能场景下,Envoy 原生 C++实现功能的性能较通过 Java Filter、OpenResty 等扩展相比,优势会更加明显。


3. 动态管控能力强,具备数据面标准 xDS 协议

Envoy 具备静态配置与动态 API 两种配置模式。动态 API 方式灵活性更强,作为 Envoy 推荐的配置方式。Envoy 以 xDS(x Discovery Service)作为动态 API 的标准协议,其中包括了多种维度资源的发现协议:


  • LDS(Listener Discovery Service)

  • RDS(Route Discovery Service)

  • CDS(Cluster Discovery Service)

  • EDS(Endpoint Discovery Service)

  • ADS(Aggregated Discovery Service)


xDS 的多种协议覆盖了包括监听器(Listener)、路由(Route)、后端集群(Cluster)、后端实例(Endpoint),可以通过协议对代理所需所有配置进行动态管控。其中 ADS 不是一个实际意义上的 xDS,它提供了一个汇聚的功能,以实现需要多个同步 xDS 访问的时候可以在一个 stream 中完成的作用。


由于 Envoy 已经以 CNCF 毕业项目的姿态成为了云原生数据面的事实标准组件,xDS 也相应成为云原生数据面事实动态 API 标准。这里不对 xDS 协议进行深入的介绍,感兴趣的同学可以通过社区与博客深入了解。


4. 天然亲和容器环境

Envoy 作为云原生社区的数据面标准组件,其本身并没有直接与 Kubernetes 或容器耦合。通过 xDS 协议的对接,Istio Pilot 等容器亲和的控制面组件可以将服务、实例、路由等配置信息推送至 Envoy。即使是在容器环境,Envoy 也很快能实现服务发现,即实现容器环境服务的代理和治理。所以,Envoy 天然亲和容器环境,可以作为容器环境 API 网关和 Ingress 的数据面选型。


5. 多语言扩展沙箱——WASM

WASM,即 WebAssembly,是由主流浏览器厂商组成的 W3C 社区团体制定的一个新的规范,首先看下来自 Mozilla 的官方定义:


WebAssembly 是一种新的编码方式,可以在现代的网络浏览器中运行


它是一种低级的类汇编语言,具有紧凑的二进制格式,可以接近原生的性能运行,并为诸如 C/C ++等语言提供一个编译目标,以便它们可以在 Web 上运行。它也被设计为可以与 JavaScript 共存,允许两者一起工作。


使用 WebAssembly 扩展 Envoy 的好处是:


  • 避免修改 Envoy;

  • 避免网络远程调用(check & report);

  • 通过动态装载(重载)来避免重启 Envoy;

  • 隔离性;

  • 实时 A/B 测试;


WASM 为 Envoy 带来了使用多语言扩展数据面的能力,即可以不局限地通过 C++、Java、Lua、JS 等语言进行数据面扩展,这对于流量代理数据面将是一个巨大的彩蛋。该特性已在 2020 年正式发布落地。相信在不远的未来,开发者使用自己最为擅长的语言进行流量入口能力扩展不再是梦想!


Envoy Gateway 设计解析

基于云原生时代的技术趋势以及 Envoy 的功能、性能的“双优”特性,网易轻舟云原生团队提出基于 Envoy 实现标准的流量入口设计,并基于此进行了大规模业务生产落地。


逻辑架构

逻辑架构设计如下图所示:



整体架构主要包括数据面、控制面两部分,实现方面则是扩展了 Istio ingressgateway:


  • 数据面


以 Envoy 作为数据面组件,负责南北向数据流量的代理、路由、治理、遥测等;通过 filterchain 进行扩展,目前支持基于 Lua、C++语言编写插件,WASM 落地后支持多语言方式扩展;通过 xDS 与控制面组件进行配置下发等动态控制。


  • 控制面


以 Istio Pilot 作为基本控制面组件,同时提供 API 层、控制台供用户或第三方平台接入。


Istio Pilot 在这里主要包括如下作用:


1、作为 xDS Server。与 Envoy 的 xDS Client 建立 GRPC 通信连接,是与 Envoy 交互的基础控制面。可支持控制不同场景下 Envoy(ServiceMesh Sidecar & API 网关 Gateway & Ingress & 入口七层代理)。


2、对接注册中心(Discovery)。支持对接 Kubernetes API Server(K8S 注册中心能力),具备扩展 Consul、Eureka 等其他注册中心能力。支持同时对接多种注册中心,并将注册信息经过配置转换,下发至 Envoy。


3、配置处理(Config)。对于要下发至 Envoy 的所有配置,均通过 Pilot 进行配置处理,再下发至 Envoy。


4、模型抽象与接口封装(Mesh Configuration Protocol & Service Mesh Interface,简称 MCP & SMI)。Pilot 对 Envoy 的基础模型进行了抽象,并进行基础接口的封装,使得其他平台对 Envoy 的控制可以更加清晰与优雅。对外暴露的接口包括 GRPC 与 Kubernetes CRD 两种形式。


API Plane 作为 API 平面,主要⽤于对 K8S CRD、MCP 或 SMI 接口做面向业务功能的 API 组合、转换处理。


管理控制台是控制面最上层组件,也是研发、运维人员直接操作的平台组件。


场景地图

在 Envoy Gateway 技术栈基础上,可以适应入口七层代理、API 网关、Ingress、单元化机房路由、FaaS 函数路由等多种场景落地应用。



1、入口七层代理



在流量入口场景下,可以承担 HAProxy、Nginx 等传统代理职责。


2、API 网关



在微服务场景下,承担分解流量、路由、治理、审计等丰富职责。


3、Ingress



在容器化场景下,可以作为能力更丰富的 Ingress 实现。


4、通用网关



在完整使用 Envoy Gateway 方案下,可以省去原有入口七层代理 -> API 网关/Ingress 的链路,由一层通用网关(Envoy Gateway)完成。


落地路线

目前 Envoy 以两类角色在业界落地:一是作为 Service Mesh 数据面组件选型,目前在 Istio 等多种服务网格框架落地;二是作为流量入口代理,目前较多的是以 API 网关形式实现,如 Gloo、Ambassador 等。网易内部多个业务团队已经实现了数据面技术栈从 Java 异步化代理、Kong 到 Envoy 的升级,基于网易轻舟 Envoy Gateway 作为流量入口标准组件。


由于 Envoy Gateway 与 Service Mesh 使用了相同的 Envoy+Istio 技术栈,使得不论 Envoy 作为 Gateway,或 Service Mesh 中的 Sidecar,都可以被统⼀控制面管控,在提升了该技术栈整体可维护性基础上,还可以帮助业务逐步演进到 Service Mesh 架构:如果业务对 Service Mesh 架构尚存疑虑,可以先落地 Envoy Gateway,后续待时机成熟再引入 Service Mesh 架构,完成整体微服务技术架构的演进与统一。


网易轻舟 Envoy Gateway 大规模落地

基于以上背景与设计,网易轻舟云原生团队实现了 Envoy Gateway,并且已经在网易多个核心业务大规模落地:


  • 网易传媒(新闻)已经实现全站流量通过轻舟 Envoy Gateway 暴露

  • 网易严选已经实现上云服务全部流量通过轻舟 Envoy Gateway 暴露

  • 网易有道、云信、Lofter 等网易核心互联网业务流量通过轻舟 Envoy Gateway 暴露


如下为网易轻舟 Envoy Gateway 控制台部分线上业务管理视图:




写在最后

Envoy Gateway 能否真正意义成为云原生时代流量入口标准目前尚不得知,但在业务落地过程中,我们已经看到了这套技术栈为业务所能带来的架构、性能、治理、可观测性等方面的红利。在越来越多业务接入 Envoy Gateway、Service Mesh 过程中,相关的工程化平台建设、排障工具等也在不断完善,我们拭目以待。


参考链接


Envoy 官方文档:https://www.envoyproxy.io/docs


Istio 官方文档:https://istio.io/docs


Envoy 实践:https://www.jianshu.com/p/90f9ee98ce70


WebAssembly 中文官方文档:https://www.wasm.com.cn


Service Mesh 发展趋势(续):棋到中盘路往何方:https://msd.misuland.com/pd/3545776840385758572_


作者简介:


裴斐,网易杭州研究院轻舟云原生技术专家、架构师。10 年企业级平台架构和开发经验,目前主要负责网易轻舟微服务治理团队,专注于企业微服务架构及云原生技术的研究与落地工作。带领团队完成网易轻舟 Service Mesh、微服务框架 NSF、API 网关等多个项目在网易集团落地及商业化产品输出。


2020 年 7 月 29 日 11:445210

评论 4 条评论

发布
用户头像
> 复杂路由与治理功能场景下,Envoy 原生 C++ 实现功能的性能较通过 Java Filter、OpenResty 等扩展相比,优势会更加明显。
这个猜测其实是不对的。复杂路由和复杂场景下,语言并不是问题所在。使用的算法、JIT 的优化、代码的逻辑等,都会是问题所在。比如 Apache APISIX 使用的路由是基数树,与路由的个数无关。

多提一句,kong 和 Apache APISIX 都是基于 OpenResty 的,为啥性能相差这么多呢?可见性能和语言无关。
另外,对于测试,简单的转发测试是不够全面的,如果加上几千个路由和一些常见的插件,再做对比,就会更加贴近真实情况。
利益相关:我是 Apache APISIX 项目 VP,欢迎大家尝试:https://github.com/apache/incubator-apisix
展开
2020 年 07 月 30 日 16:51
回复
作者 裴斐回复:感谢APISIX社区大佬的关注。
由于网易多个互联网业务近年在从Java异步化、OpenResty技术栈向Envoy体系迁移,相关复杂路由与治理规则场景下Envoy C++原生实现性能优势并非猜测,都是有实际生产数据积累的,生产上也由于性能的提升为业务生产环境部署网关节省了较多节点的部署成本。文章中更多是从整体上讲Envoy对云原生背景的价值,所以性能方面更为全面的数据篇幅原因没有全部给出。
当然,我们很早就已经注意到APISIX社区在持续优化nginx+openresty体系、基于基数树等逻辑优化带来性能提升的成果,文中我们的基准测试中已有体现。我们自身在针对Envoy Lua扩展过程中也进行了大量Lua功能插件与原生C++实现的性能对比、验证与调优工作,算法、JIT优化等逻辑优化在相同条件下由C++原生实现存在的优势也确实是客观存在的。有机会可以深入交流一下。
展开
2020 年 07 月 31 日 10:12
回复
多谢回复:)相对于 lua-nginx-module,Envoy 的 Lua 扩展还是比较弱的。
我新建了一个 issue:https://github.com/apache/incubator-apisix/issues/1942,公开了 Apache APISIX 和 Envoy 之间一些简单 benchmark,里面有机器型号、参数配置、压测工具和具体结果,欢迎一起技术交流。
2020 年 07 月 31 日 16:09
回复
期待看到更多 Proxy 的性能对比,及其在 Service Mesh 中的集成度等。这里有个网站在做这个事情,https://smp-spec.io/ 大家也可以关注下。
2020 年 08 月 04 日 17:33
回复
没有更多了
发现更多内容

理解 Mysql 索引底层原理只需这一篇就够了

小谈

MySQL 数据结构 面试 Spring Cloud Spring Boot

忘掉 Snowflake,感受一下性能高出 587 倍的全局唯一 ID 生成算法

穿甲兵

redis 架构 分布式 CAP Go 语言

测试开发工程师修炼手册—测试技能大盘点

Zoe

测试工程师产出

游戏夜读 | 互动剧的黎明到了?

game1night

向女朋友解释乐观锁与悲观锁的小妙招!

小闫

spring 面试 Spring Cloud 乐观锁 悲观锁

系统架构师week04 Homework - 互联网架构技术手段和方案

尔东雨田

极客大学架构师训练营

AndroidStudio真机调试 - Waiting for Debugger

麦洛

Android Studio 真机调试

Kafka 消息丢失与消费精确一次性

古月木易

kafka

原创 | TDD工具集:JUnit、AssertJ和Mockito (二十五)运行测试-在IDE中运行测试

编程道与术

Java intellij-idea 编程 TDD 单元测试

太阳马戏团在疫情下的组合式创新

石云升

商业模式 组合式创新 思想实验

四面阿里巴巴回来分享面经总结,定级P7架构师

小吴选手

架构 技术 面试 Spring Boot 阿里

高效程序员的七个好习惯——你有吗?

小谈

程序员 面试 JVM springboot SpringCloud

分布式柔性事务之最大努力通知事务详解

奈学教育

分布式事务

2.3万个MongoDB数据库遭黑客比特币勒索,你中招了吗?中招怎么办?

墨天轮

比特币 数据库 oracle mongodb 黑客

nightingale安装详解

曾祥斌

自动特征工程在推荐系统中的研究

天枢数智运营

人工智能 推荐系统

分布式柔性事务之最大努力通知事务详解

古月木易

分布式事务

数据产品经理的具象化

松子(李博源)

大数据 产品经理 数据产品

ThreadPoolExecutor 线程池使用

郭儿的跋涉

线程 多线程 线程池

Kafka 消息丢失与消费精确一次性

奈学教育

kafka

架构师训练营第4周总结

aoeiuvzcs

信创舆情一线--印度封禁59款中国App

统小信uos

App 舆情 印度

听说你还没学Spring就被源码编译劝退了?30+张图带你玩转Spring编译

程序员DMZ

spring Spring源码编译

猿灯塔:疫情冲击,去体验远程面试被怼10分钟,今年Java开发找工作真难

猿灯塔

Redis分布式锁课堂开课了!

小闫

redis Spring Cloud Redis项目

五分钟让你搞懂Nginx负载均衡原理及四种负载均衡算法

架构大数据双料架构师

马匹、马镫、马车,和华为的数据基础设施革新

脑极体

2020年7月国产数据库排行:华为、腾讯发新品,中兴、阿里结硕果

墨天轮

数据库 阿里 排行榜

区块链正处于手脚并用攀爬的“攻坚时刻”

CECBC

数据上链 市场选择

java基础思维导图,让java不再难懂 (建议收藏))

码哥小胖

面试 Spring Boot Java 分布式

一致性hash

彭阿三

一致性hash

React Native 核心原理及跨端选型思路

React Native 核心原理及跨端选型思路

云原生时代的流量入口:Envoy Gateway-InfoQ