Envoy
是专为大型现代 SOA(面向服务架构)架构设计的 L7 代理和通信总线,体积小,性能高。它的诞生源于以下理念:
对应用程序而言,网络应该是透明的。当网络和应用程序出现故障时,应该能够很容易确定问题的根源。
核心功能
实际上,实现上述的目标是非常困难的。为了做到这一点,Envoy 提供了以下高级功能:
非侵入的架构 :
Envoy
是一个独立进程,设计为伴随每个应用程序服务运行。所有的Envoy
形成一个透明的通信网格,每个应用程序发送消息到本地主机或从本地主机接收消息,不需要知道网络拓扑,对服务的实现语言也完全无感知,这种模式也被称为Sidecar
。由
C++
语言实现,拥有强大的定制化能力和优异的性能。L3/L4/L7 架构 : 传统的网络代理,要么在
HTTP
层工作,要么在TCP
层工作。在HTTP
层的话,你将会从传输线路上读取整个HTTP
请求的数据,对它做解析,查看HTTP
头部和URL
,并决定接下来要做什么。随后,你将从后端读取整个响应的数据,并将其发送给客户端。但这种做法的缺点就是非常复杂和缓慢,更好的选择是下沉到TCP
层操作:只读取和写入字节,并使用IP
地址,TCP
端口号等来决定如何处理事务,但无法根据不同的URL
代理到不同的后端。Envoy
支持同时在 3/4 层和 7 层操作,以此应对这两种方法各自都有其实际限制的现实。顶级 HTTP/2 支持 : 它将
HTTP/2
视为一等公民,并且可以在HTTP/2
和HTTP/1.1
之间相互转换(双向),建议使用HTTP/2
。服务发现和动态配置 : 与
Nginx
等代理的热加载不同,Envoy
可以通过API
来实现其控制平面,控制平面可以集中服务发现,并通过API
接口动态更新数据平面的配置,不需要重启数据平面的代理。不仅如此,控制平面还可以通过 API 将配置进行分层,然后逐层更新,例如:上游集群中的虚拟主机、HTTP
路由、监听的套接字等。gRPC 支持 : gRPC 是一个来自
Google
的RPC
框架,它使用HTTP/2
作为底层多路复用传输协议。Envoy 完美支持 HTTP/2,也可以很方便地支持gRPC
。可观测性 :
Envoy
的主要目标是使网络透明,可以生成许多流量方面的统计数据,这是其它代理软件很难取代的地方,内置stats
模块,可以集成诸如prometheus/statsd
等监控方案。还可以集成分布式追踪系统,对请求进行追踪。
设计目标
Envoy 官方的设计目标是这么说的:
虽然 Envoy
没有把追求极致的性能作为首要目标,但并不表示 Envoy
是没有追求的,只是扩展性优先,性能稍微靠边。Envoy 和 Nginx
一样,也采用了 多线程 + 非阻塞 + 异步IO(Libevent) 的架构,性能仍然很强悍。