Envoy 整体架构概述
Envoy 最重要的设计原则是网络透明性,网络对于应用程序来说应该是透明的,应用程序只需要按照标准化的方式使用网络,不需要感知网络的具体实现细节,这样当发生应用程序或者网络故障时,很容易区分问题的边界,从而很容易定位出问题的根源。
网络透明是 Envoy 架构层面总的指导原则,架构设计的各个维度都围绕这个指导原则展开,比如对出入 Envoy 流量的透明拦截、对通信安全的透明支持以及完善的链路治理支持等,Envoy 架构设计和实现层面处处可见网络透明的影子,目的是把用户体验放在第一位,最大程度地提高业务使用 Envoy 时的易用性。
Envoy 架构设计的另外一个重要指导原则是最终一致性。Envoy 在配置处理、统计子系统等多个场景都会采用基于最终一致性的设计。通过最终一致性,可以简化 Envoy 的架构设计,通过牺牲一些不太重要的指标,可以换来架构易用性和性能上的巨大提升。
最后一个设计原则是对性能的折中考虑,Envoy 语言选型、架构层面的优秀设计已经可以保证 Envoy 有非常优异的性能表现。性能对于通用的代理服务来说无疑是非常重要的,Envoy 重视性能的同时,不会执着于极限性能,不会为了性能考虑,牺牲架构上的简单和易用性设计,不会为了极限性能牺牲代码的可维护性。
Envoy 线程模型由负责控制流的主线程和负责数据流的工作线程组成,其中工作线程池的线程个数和 CPU 核数相当即可。所有工作线程同时监听 Iptables 透明拦截的 Downstream 客户端请求,监听器信息由监听发现服务 LDS 负责管理,监听到客户端请求后在当前线程中创建连接,后续该连接上的请求消息处理均在这个线程内完成,以减少请求处理过程中的线程切换开销。请求处理采用的是异步事件驱动模型,通过各自线程的事件调度器进行事件调度。
Envoy 的扩展性由 Filter 插件机制负责,每个监听器下对应两类插件:一类是监听器相关的过滤插件,用于对监听行为进行扩展;另一类是网络过滤插件,负责建立请求连接、协议解析和路由工作。
当前 Envoy 实现最完整的是 HTTP 网络过滤插件,通过路由发现服务 RDS 管理 HTTP 协议的路由,HTTP 路由是个多层的树状结构,对应的是每个集群以及相应的匹配条件,其中集群信息由集群发现服务 CDS 管理。Envoy 集群有多种类型,其中服务发现模式的集群,其集群节点信息由节点发现服务 EDS 管理。通过集群的负载均衡算法获取到相应的目标节点后,将 Downstream 请求信息转发给 Upstream。
Envoy 请求处理需要的 LDS、RDS、CDS 和 EDS 配置信息由控制平面通过 XDS 协议动态下发给 Envoy。
版权声明: 本文为 InfoQ 作者【阿泽🧸】的原创文章。
原文链接:【http://xie.infoq.cn/article/1a503b25891ce9c3d21c5b664】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论