Envoy 是专为大型现代 SOA(面向服务架构)架构设计的 L7 代理和通信总线,体积小,性能高。它的诞生源于以下理念:
对应用程序而言,网络应该是透明的。当网络和应用程序出现故障时,应该能够很容易确定问题的根源。
核心功能
实际上,实现上述的目标是非常困难的。为了做到这一点,Envoy 提供了以下高级功能:
- 非侵入的架构 : Envoy 是一个独立进程,设计为伴随每个应用程序服务运行。所有的 Envoy 形成一个透明的通信网格,每个应用程序发送消息到本地主机或从本地主机接收消息,不需要知道网络拓扑,对服务的实现语言也完全无感知,这种模式也被称为 Sidecar。
边车模式
三丰,公众号:soft张三丰边车模式
- 由 C++ 语言实现,拥有强大的定制化能力和优异的性能。Envoy 是用 C++11 编写的。之所以选择(系统)原生代码是因为我们认为像 Envoy 这样的基础架构组件应该尽可能避让(资源争用)。由于在共享云环境中部署以及使用了非常有生产力但不是特别高效的语言(如 PHP、Python、Ruby、Scala 等),现代应用程序开发人员已经难以找出延迟的原因。原生代码通常提供了优秀的延迟属性,不会对已混乱的系统增加额外负担。与用 C 编写的其他原生代码代理的解决方案不同,C++11 具有出色的开发生产力和性能。
- L3/L4/L7 架构 : 传统的网络代理,要么在
HTTP
层工作,要么在 TCP
层工作。在 HTTP
层的话,你将会从传输线路上读取整个 HTTP
请求的数据,对它做解析,查看 HTTP
头部和 URL
,并决定接下来要做什么。随后,你将从后端读取整个响应的数据,并将其发送给客户端。但这种做法的缺点就是非常复杂和缓慢,更好的选择是下沉到 TCP
层操作:只读取和写入字节,并使用 IP
地址,TCP
端口号等来决定如何处理事务,但无法根据不同的 URL
代理到不同的后端。Envoy
支持同时在 3/4 层和 7 层操作,以此应对这两种方法各自都有其实际限制的现实。
Envoy 的核心是一个 L3/L4 网络代理。可插入 filter 链机制允许开发人员编写 filter 来执行不同的 TCP 代理任务并将其插入到主体服务中。现在已有很多用来支持各种任务的 filter,如原始 TCP 代理、HTTP 代理、TLS 客户端证书认证等。
HTTP 是现代应用程序体系结构的关键组件,Envoy 支持额外的 HTTP L7 filter 层。可以将 HTTP filter 插入执行不同任务的 HTTP 连接管理子系统,例如缓存,速率限制,路由/转发,嗅探 Amazon 的 DynamoDB 等等。
当以 HTTP 模式运行时,Envoy 同时支持 HTTP/1.1 和 HTTP/2。Envoy 可以作为 HTTP/1.1 和 HTTP/2 之间的双向透明代理。这意味着它可以桥接 HTTP/1.1 和 HTTP/2 客户端以及目标服务器的任意组合。建议配置所有服务之间的 Envoy 使用 HTTP/2 来创建持久连接的网格,以便可以复用请求和响应。随着协议的逐步淘汰,Envoy 将不支持 SPDY。
当以 HTTP 模式运行时,Envoy 支持一种路由子系统,能够根据路径、权限、内容类型、运行时及参数值等对请求进行路由和重定向。这项功能在将 Envoy 用作前端/边缘代理时非常有用,同时,在构建服务网格时也会使用此功能。
- 顶级 HTTP/2 支持 : 它将
HTTP/2
视为一等公民,并且可以在 HTTP/2
和 HTTP/1.1
之间相互转换(双向),建议使用 HTTP/2
。 - 服务发现和动态配置 : 与
Nginx
等代理的热加载不同,Envoy
可以通过 API
来实现其控制平面,控制平面可以集中服务发现,并通过 API
接口动态更新数据平面的配置,不需要重启数据平面的代理。不仅如此,控制平面还可以通过 API 将配置进行分层,然后逐层更新,例如:上游集群中的虚拟主机、HTTP
路由、监听的套接字等。 - gRPC 支持 : gRPC[1] 是一个来自
Google
的 RPC
框架,它使用 HTTP/2
作为底层多路复用传输协议。Envoy 完美支持 HTTP/2,也可以很方便地支持 gRPC
。 - 特殊协议支持 : Envoy 支持对特殊协议在 L7 进行嗅探和统计,包括:MongoDB[2]、DynamoDB[3] 等。
MongoDB 是一种用于现代 Web 应用程序的流行数据库。Envoy 支持对 MongoDB 连接进行 L7 嗅探、统计和日志记录。
DynamoDB 是亚马逊的托管键/值 NOSQL 数据存储。Envoy 支持对 DynamoDB 连接进行 L7 嗅探和统计。
- 可观测性 :
Envoy
的主要目标是使网络透明,可以生成许多流量方面的统计数据,这是其它代理软件很难取代的地方,内置 stats
模块,可以集成诸如 prometheus/statsd
等监控方案。还可以集成分布式追踪系统,对请求进行追踪。 - 服务发现和动态配置: Envoy 可以选择使用动态配置 API 的分层集合实现集中管理。这些层为Envoy 提供了以下内容的动态更新:后端集群内的主机、后端集群本身、HTTP 路由、监听套接字和加密材料。对于更简单的部署,可以通过DNS 解析(甚至完全跳过)发现后端主机,静态配置文件将替代更深的层。
- 健康检查
:
推荐使用将服务发现视为最终一致的过程的方式来建立 Envoy 网格。Envoy 包含了一个健康检查子系统,可以选择对上游服务集群执行主动健康检查。然后,Envoy 联合使用服务发现和健康检查信息来确定健康的负载均衡目标。Envoy 还通过异常检测子系统支持被动健康检查。 - 高级负载均衡:负载均衡是分布式系统中不同组件之间的一个复杂问题。由于 Envoy 是一个独立代理而不是库,因此可以独立实现高级负载均衡以供任何应用程序访问。目前,Envoy 支持自动重试 、熔断、通过外部速率限制服务的全局速率限制、请求映射和异常点检测。未来还计划支持请求竞争。
- 前端/边缘代理支持:尽管 Envoy 主要设计用来作为一个服务间的通信系统,但在系统边缘使用相同的软件也是大有好处的(可观察性、管理、相同的服务发现和负载均衡算法等)。Envoy 包含足够多的功能,使其可作为大多数现代 Web 应用程序的边缘代理。这包括 TLS 终止、HTTP/1.1 和 HTTP/2 支持,以及 HTTP L7 路由。
- 最佳的可观察性: 如上所述,Envoy 的主要目标是使网络透明。但是,问题在网络层面和应用层面都可能会出现。Envoy 包含对所有子系统强大的统计功能支持。目前支持 statsd(和兼容的提供程序)作为统计信息接收器,但是插入不同的接收器并不困难。统计信息也可以通过管理端口查看。Envoy 还通过第三方提供商支持分布式追踪。
OSI七层模型
七层模型,亦称OSI(Open System Interconnection)参考模型,是参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系。它是一个七层的、抽象的模型体,不仅包括一系列抽象的术语或概念,也包括具体的协议。
七层模型从上到下依次是:
- 应用层:协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP
- 表示层:数据的表示、安全、压缩。格式有,JPEG、ASCll、DECOIC、加密格式等
- 会话层:建立、管理、终止会话。对应主机进程,指本地主机与远程主机正在进行的会话
- 传输层:定义传输数据的协议端口号,以及流控和差错校验。协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层
- 网络层:进行逻辑地址寻址,实现不同网络之间的路径选择。协议有:ICMP IGMP IP(IPV4 IPV6) ARP RARP
- 数据链路层:建立逻辑连接、进行硬件地址寻址、差错校验等功能。将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。
- 物理层:建立、维护、断开物理连接。
七层模型传输数据过程:
四层负载均衡( L4 load balancing )
主要工作于处于OSI模型中间位置的传输层( transport layer ),它主要处理消息的传递,而不管消息的内容。在互联网上,TCP就是HTTP传输方式的四层协议( Layer 4 Protocol )。四层负载均衡只针对由上游服务发送和接收的网络包,而并不检查包内的具体内容是什么。四层负载均衡可以通过检查TCP流中的前几个包,从而决定是否限制路由。
七层负载均衡( L7 load balancing )
主要工作于处于OSI模型顶层位置的应用层( application layer ),它主要处理每条消息中的真正内容。在互联网上,HTTP是网络通讯中占据主导地位的七层协议( Layer 7 Protocol )。七层负载均衡在路由网络传输时比四层负载均衡更加复杂和巧妙,特别适合像HTTP这种基于TCP传输的方式。一个七层负载均衡器终止网络传输并读取消息中的内容。它可以基于消息中内容( 比如URL或者cookie中的信息 )来做出负载均衡的决定。之后,七层负载均衡器建立一个新的TCP连接来选择上游服务( 或者再利用一个已经存在的TCP连接,通过 HTTP keepalives 的方式,并向这个服务发出请求。
七层负载均衡的优势
七层负载均衡的CPU密集程度比基于包的四层负载均衡更高,但是在现代服务中却极少降低其性能。七层负载均衡能够让均衡器做更小的负载均衡决定,并且会根据消息的内容( 比如压缩和加密 )利用最优化方式做出改变。它运用缓存的方式来卸载上游服务较慢的连接,并显著地提高了性能。使用七层负载均衡的设备经常被用于反向代理。
我们来看个例子:用户访问一个繁忙的网站。在这个用户 session 的航向上,他或她可能会请求静态内容——比如图片或者视频,动态内容——比如新闻递送,甚至是事务型信息——比如外卖点单的状态。七层负载均衡允许均衡器依据请求自身的信息进行路由,比如被请求内容的类型。所以现在一个针对图片和视频的请求可以被路由到存储并高度优化的多媒体内容服务器上。对于事物型信息比如商品折后价,可以被路由到响应管理价格的应用服务器上。用了七层负载均衡,网络和应用的架构师可以建立一个高速调整且高度优化的、针对需求可靠且可有效延展的服务基础架构或应用递送网络。
Prometheus监控(1)
三丰,公众号:soft张三丰Prometheus监控(1)
热部署原理与实现
三丰,公众号:soft张三丰热部署原理与实现
一文看懂service mesh
三丰,公众号:soft张三丰一文看懂service mesh
事件驱动
三丰,公众号:soft张三丰事件驱动
微服务之划分原则
三丰,公众号:soft张三丰微服务之划分原则
关注公众号 soft张三丰