购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

4.1 Envoy整体架构

4.1.1 关键设计约束

Envoy的定位是“云原生时代的高性能边缘/中间/服务代理” ,作为云原生时代的通用代理服务器,需要能够适应和支持云原生用户的高速增长以及由此带来的多样化需求。功能是一切的基础,除了满足基本的功能需求之外,架构设计层面还需要考虑下面这些重要的非功能约束。

(1)易用性

除了完成自身的功能需求之外,对Service Mesh最重要的一个诉求就是易用性。简单易用,方便运维,系统只有做到简单易用,学习曲线不陡峭,容易上手,才能赢得用户的青睐。

具体到使用上,对于没有特殊要求的普通用户来说,需要能够真正做到Service Mesh接入过程完全透明,业务完全无感知,不需要修改任何代码和配置。

(2)可用性

可用性是系统竞争力的关键一环,一个频繁出故障的系统会给用户带来很大的业务损失,这样的系统对用户来说是没有价值的。

(3)可观测性

可观测性和可管理性使得我们可以查看系统的内部运行状态。基于可观测性,我们可以使用数据驱动的思维,对系统的故障进行分析和定位,系统地精细化管控和运营。

(4)扩展性

对于很多平台性的产品来说,只有具备了良好的扩展性,才能随着不断变化的需求,构建起强大的生态,因此很多系统会把扩展性作为最重要的目标来对待,其实这是有一定误区的。一个系统的基础目标用户是比较确定的,扩展性主要用来提升系统的增量目标用户。易用性、可用性和可观测性是提供基础目标用户体验的基石,也是系统的核心竞争力所在。在没有夯实基础的前提下过分注重扩展,会很容易丢掉赖以生存的根基。虽然基于良好的扩展性,系统的边界范围可以不断扩大和延伸,但是应该在保证基础用户的体验的前提下进行,尤其不能以牺牲95%用户的体验,而过分注重对5%增量用户的扩展和支持,得不偿失。

此外,对于扩展性来说,需要尽可能做到平台无关。虽然Mesh技术在某些平台下可以最大程度地发挥它的优势,但Mesh技术本身不应该和平台绑定,如果绑定就会失去一定的灵活性。

(5)性能

随着硬件性能的不断提升,加上分布式技术的广泛应用,性能问题一般都可以通过横向与纵向扩展来解决,性能问题貌似不像以前那么重要了。对系统性能的要求,不能成为制约业务发展的短板,很多时候性能往往是一张入场券,性能可能不是系统竞争力的主要组成部分,但如果性能不能满足业务要求,可能拿不到竞争的入场券。

(6)其他

其他方面还有很多,这里主要提一下兼容性。良好的兼容性会使Service Mesh的迁移和推广路径更加清晰。比如,如果能够做到Service Mesh体系和非Service Mesh体系之间兼容与互通,会使存量服务的迁移更顺畅。Mesh服务和非Mesh服务可以自如地进行通信,比如单个服务也可以自如地接入Mesh,享受Mesh基础设施带来的优点。

上面分析的易用性、可用性、可观测性等,是按照重要度以从高到低的顺序排列的,功能需求之外,易用性是第一位的。易用性和扩展性本身是一对矛盾体,扩展支持越多,可能会导致系统越复杂,如果设计不当,很容易影响系统的易用性。

4.1.2 设计原则

Envoy最重要的设计原则是网络透明性,Envoy的设计者认为,网络对于应用程序来说应该是透明的,应用程序只需要按照标准化的方式使用网络,不需要感知网络的具体实现细节,这样当发生应用程序或者网络故障时,很容易区分问题的边界,从而很容易定位出问题的根源。

网络透明是Envoy架构层面总的指导原则,架构设计的各个维度都围绕这个指导原则展开,比如对出入Envoy流量的透明拦截、对通信安全的透明支持以及完善的链路治理支持等,Envoy架构设计和实现层面处处可见网络透明的影子,目的是把用户体验放在第一位,最大程度地提高业务使用Envoy时的易用性。

Envoy架构设计的另外一个重要指导原则是最终一致性。Envoy在配置处理、统计子系统等多个场景都会采用基于最终一致性的设计。通过最终一致性,可以简化Envoy的架构设计,通过牺牲一些不太重要的指标,可以换来架构易用性和性能上的巨大提升。

最后一个设计原则是对性能的折中考虑,Envoy语言选型、架构层面的优秀设计已经可以保证Envoy有非常优异的性能表现。性能对于通用的代理服务来说无疑是非常重要的,Envoy重视性能的同时,不会执着于极限性能,不会为了性能考虑,牺牲架构上的简单和易用性设计,不会为了极限性能牺牲代码的可维护性。

4.1.3 整体架构

Envoy线程模型由负责控制流的主线程和负责数据流的工作线程组成,其中工作线程池的线程个数和CPU核数相当即可。所有工作线程同时监听Iptables透明拦截的Downstream客户端请求,监听器信息由监听发现服务LDS负责管理,监听到客户端请求后在当前线程中创建连接,后续该连接上的请求消息处理均在这个线程内完成,以减少请求处理过程中的线程切换开销。请求处理采用的是异步事件驱动模型,通过各自线程的事件调度器进行事件调度。Envoy整体架构设计如图4-1所示。

Envoy的扩展性由Filter插件机制负责,每个监听器下对应两类插件:一类是监听器相关的过滤插件,用于对监听行为进行扩展;另一类是网络过滤插件,负责建立请求连接、协议解析和路由工作。

当前Envoy实现最完整的是HTTP网络过滤插件,通过路由发现服务RDS管理HTTP协议的路由,HTTP路由是个多层的树状结构,对应的是每个集群以及相应的匹配条件,其中集群信息由集群发现服务CDS管理。Envoy集群有多种类型,其中服务发现模式的集群,其集群节点信息由节点发现服务EDS管理。通过集群的负载均衡算法获取到相应的目标节点后,将Downstream请求信息转发给Upstream。

Envoy请求处理需要的LDS、RDS、CDS和EDS配置信息由控制平面通过XDS协议动态下发给Envoy。

图4-1 Envoy整体架构图 rhXw9dioL4e84PNqBQXItgbAf9rLQloeXeu0+xUIaJZ8PS1TFeV+AZrXRsJ9Snw4

点击中间区域
呼出菜单
上一章
目录
下一章
×