初始 Envoy 项目
Envoy 是一个用 C++编写的云原生高性能边缘代理、中间代理和服务代理,作为专门为微服务架构设计的通信总线,定位是作为 Service Mesh 的数据平面,接管微服务通信的全部流量,对应用程序屏蔽网络和通信的复杂性。
Envoy 作为一个独立进程,设计与应用程序一起运行,所有的 Envoy 形成一个透明的通信网格,每个应用程序发送消息到本地 Envoy 代理或从本地 Envoy 代理接收消息,但不需要知道具体的网络拓扑。
Envoy 的核心设计理念是网络应该对应用服务透明,职责划分上比较明确,当网络和应用程序出现故障时,可以很容易定位问题的具体根源。
架构上 Envoy 内部可以分为数据平面、控制平面和管理平面 3 个部分。其中,控制平面用于对流量路由和转发相关的策略与配置进行管理;控制平面通过标准 API 获取最新的流量配置信息;数据平面的流量转发就是基于控制平面下发的配置规则进行。
为了方便对 Envoy 运行状态进行监控和管理,Envoy 内置一个 HTTP Server,作为 Envoy 的管理平面,HTTP Server 会注册一系列的 Handler,对外暴露管理平面的 API,用于外界查询当前 Envoy 各个维度的状态,比如外界可以通过管理平面 API 查询 Envoy 当前的集群和路由配置、当前的统计信息等。
Envoy 接收到 Downstream 客户端发过来的请求时,一般先经过类似 Iptables 的透明拦截机制,然后将流量交给 Envoy。Envoy 获取请求对应的原目的地址,根据目的地址信息获取对应的网络过滤链配置信息,根据网络过滤链配置建立新的连接,并通过网络过滤链对应的协议对请求进行解码和路由,选择合适的 Upstream 节点,将请求发送出去,同时建立 Downstream 连接和 Upstream 连接的对应关系,将 Upstream 返回的响应消息发送给 Downstream 客户端。
Envoy 具有如下的特性:
扩展性
Envoy 扩展性通过插件机制实现,Envoy 内部当前已经支持众多扩展点,通过网络协议插件和 HTTP 处理扩展插件,分别从通信协议和链路治理两个层面进行扩展。Envoy 插件机制是 Service Mesh 数据转发和数据处理的基石,基于插件扩展性机制进行扩展和定制开发非常方便,可以建立起强大的 Service Mesh 生态。
配置动态化
基于配置动态化设计,Envoy 集群管理与流量转发相关的所有配置均可以通过 XDS 协议动态下发和生效,不仅减少了运维复杂度,同时借助动态配置化能力,方便通过一定机制发现 Envoy 运行时的风险并快速调整,提高了 Envoy 的整体稳定性。
性能
Envoy 支持如此众多特性的同时,仍然可以提供优秀的性能指标,得益于良好的架构设计,Envoy 架构设计对性能的考虑随处可见。比如数据转发层面,Envoy 采用异步事件驱动的方式,并且保证一个请求只会在一个线程内处理,减少了请求在线程间切换的开销;此外通过数据平面和控制平面分离,配置变更时,通过无锁机制保证数据转发的性能不受任何影响。
Envoy 对 Service Mesh 的一大贡献是第一个提出了通用数据平面 API 的概念,通过通用数据平面 API,建立了数据平面和控制平面之间交互的标准,实现了数据平面和控制平面通信的标准化。只要基于数据平面 API 实现,可以根据需要方便地对数据平面或控制平面进行替换,有利于 Service Mesh 生态体系的建设。
版权声明: 本文为 InfoQ 作者【阿泽🧸】的原创文章。
原文链接:【http://xie.infoq.cn/article/1bc44b64189d8dfe7e4fc1aae】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论