Envoy 是为大型现代服务导向架构设计的 L7 代理和通信总线。该项目诞生于以下信念:
网络应该对应用程序是透明的。当发生网络和应用程序问题时,应该很容易确定问题的根源。
实际上,实现上述目标是非常困难的。Envoy 试图通过提供以下高级功能:
- 过程架构:Envoy 是一个独立的进程,旨在与每个应用程序服务器一起运行。所有的使能形成一个透明的通信网格,每个应用程序在其中发送和接收来自 localhost 的消息,并且不知道网络拓扑。过程架构与传统的库服务服务沟通有两大优势:
- Envoy 使用任何应用程序语言。单一的Envoy部署可以形成 Java、C++、Go、PHP、Python 等之间的网格。面向服务的架构使用多种应用程序框架和语言变得越来越普遍。Envoy 透明地弥合了差距。
- 任何与大型面向服务架构合作的人都知道,部署库升级可能会非常痛苦。Envoy 可以透过整个基础架构快速部署和升级。
- 现代 C++ 11 代码库:Envoy 是用 C++ 11 编写的。选择了本地代码,因为我们认为,诸如 Envoy 等架构组件应该尽可能地摆脱困境。现代应用程序开发人员已经处理了由于在共享云环境中的部署而难以推理的尾部延迟,以及使用非常有效但不是特别执行良好的语言(如 PHP,Python,Ruby,Scala 等)。原生代码通常非常优秀,延迟属性不会对已经混乱的情况造成额外的混乱。与 C 编写的其他原生代码代理解决方案不同,C++ 11 提供了卓越的开发人员的生产力和性能。
- L3/L4 滤波器架构:Envoy 的核心核心是 L3/L4 网络代理。可插拔的过滤器链机制允许写入过滤器来执行不同的 TCP 代理任务并插入主服务器。过滤器已经被写入以支持诸如原始 TCP 代理、HTTP 代理、TLS 客户端证书认证等各种任务。
- HTTP L7 过滤器架构:HTTP 是现代应用程序体系结构的关键组件,Envoy 支持一个额外的 HTTP L7 过滤器层。 HTTP 过滤器可以插入 HTTP 连接管理子系统,执行不同的任务,如缓冲,速率限制,路由/转发,嗅探亚马逊的 DynamoDB 等。
- 第一类 HTTP/2 支持:在 HTTP 模式下工作时,Envoy 支持 HTTP/1.1 和 HTTP/2。Envoy 可以在两个方向上作为 HTTP/1.1 透明 HTTP/2 代理。这意味着可以桥接 HTTP/1.1 和 HTTP/2 客户端和目标服务器的任何组合。推荐的服务配置使用所有 Envoys 之间的 HTTP/2 来创建一个可以复用请求和响应的持久连接的网格。Envoy 不支持正在淘汰的 SPDY 协议。
- HTTP L7 路由:当以 HTTP 模式运行时,Envoy 支持一个路由子系统,该路由子系统能够根据路径、权限、内容类型,运行时值等路由和重定向请求。使用 Envoy 作为前端/边缘时,此功能最为有用代理,但在构建服务网格时也被利用。
- gRPC 支持:gRPC 是 Google 使用 HTTP /2 作为底层多路传输的 RPC 框架。 Envoy 支持所有需要用作 gRPC 请求和响应的路由和负载平衡基板的 HTTP/2 功能。这两个系统是非常互补的。
- MongoDB L7 支持:MongoDB 是用于现代 Web 应用程序的流行数据库。Envoy 支持 L7 嗅探、统计生产和日志记录 MongoDB 连接。
- DynamoDB L7 支持:DynamoDB 是 Amazon 的托管键/值 NOSQL 数据存储。Envoy 支持 L7 嗅探和 DynamoDB 连接的统计生产。
- 服务发现:服务发现是面向服务架构的重要组成部分。 Envoy 支持多种服务发现方法,包括通过服务发现服务进行的异步 DNS 解析和基于 REST 的查找。
- 健康检查:建议使用网格的推荐方法是将服务发现视为最终一致的过程。Envoy 包括一个健康检查子系统,可以选择对上游业务集群进行主动健康检查。Envoy 然后使用服务发现和健康检查信息的联合来确定健康的负载均衡目标。Envoy 还通过异常检测子系统支持被动健康检查。
- 高级负载平衡:分布式系统中的不同组件之间的负载平衡是一个复杂的问题。因为 Envoy 是一个独立的代理而不是一个库,它能够在一个地方实现高级的负载平衡技术,并且可以让任何应用程序访问它们。目前,Envoy 包括支持自动重试,断路,外部速率限制服务的全局速率限制,请求镜像和异常值检测。未来的支持计划是要求赛车。
- 前端/边缘代理支持:虽然 Envoy 主要被设计为服务于通信系统,但是在边缘使用相同的软件(可观察性,管理,相同的服务发现和负载平衡算法等)是有好处的。特使包括足够的功能,使其可用作大多数现代Web应用程序用例的边缘代理。这包括 TLS 终止,HTTP/1.1 和 HTTP/2 支持以及 HTTP L7 路由。
- 最佳的可观察性:如上所述,特使的主要目标是使网络透明化。但是,在网络级别和应用级别都会出现问题。特使包括对所有子系统的强大统计支持。 statsd(和兼容的提供商)是目前支持的统计信息汇聚,尽管插入不同的数据不会困难。统计数据也可通过管理端口查看。 Envoy 还通过第三方提供商支持分布式跟踪。
- 动态配置:Envoy 可选择消耗一组分层的动态配置 API。如果需要,实现者可以使用这些 API 来构建复杂的集中管理的部署。
设计目标
关于代码本身的设计目标的简短说明:尽管特使绝非缓慢(我们花了相当多的时间来优化某些快速路径),但代码已被编写为模块化,易于测试,而针对最大可能的绝对性能。我们认为,这是更有效的使用时间,因为典型的部署将与语言和运行时相比慢许多倍,内存使用量更多。
文档
- 官方文档
- FAQ
- 非官方中文文档
- 请观看 Envoy 概述的视频 (transcript)),了解更多关于 Envoy 的起源故事和设计理念
- 关于线程模型的博客
- 关于热重启的博客
- 关于stats架构的博客
- 关于通用数据平面API的博客
- 在 Lyft 的 Envoy 仪表板上的 博客
相关
- data-plane-api:v2 API 定义作为一个独立的存储库。这是 api 的一个只读镜像。
- envoy-perf:性能测试框架。
- envoy-filter-example:如何添加新的过滤器并链接到主仓库的例子。