4

Envoy与Nginx的八大对比

 2 years ago
source link: https://blog.51cto.com/key3feng/5452608
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Envoy与Nginx的八大对比

原创

key_3_feng 2022-07-07 22:44:36 博主文章分类:2022年6月 ©著作权

文章标签 nginx envoy 文章分类 其它 系统/运维 yyds干货盘点 阅读数194

Nginx是Envoy出现之前网络通信中间件领域非常有代表性的开源系统,功能强大,性能出色,扩展性很强,已经形成了强大的生态,成为HTTP流量管理领域事实上的标杆。Envoy作为后起之秀,虽然定位和目标上与Nginx有不少差异,但架构设计层面,Envoy和Nginx都有很多的可取之处,下面会从功能定位、整体网络模型、连接处理、请求解析、插件机制、配置管理、部署和运维、管理方式等诸多维度,对Envoy和Nginx进行详细剖析和比较,通过与Nginx功能和架构层面的全方位对比,大家也可以对Envoy的架构设计有更立体的认识。

一、功能与定位

Nginx最核心的功能是Web服务器和反向代理服务器,Web服务器完成对HTTP请求协议的解析和以HTTP协议格式响应请求、缓存、日志处理这些基本Web服务器功能;反向代理服务器完成对请求的转发、负载均衡、鉴权、限流、缓存、日志处理等代理常用功能。Nginx还支持普通的TCP、UDP反向代理功能,同时以stream方式支持通用的基于4层协议的反向代理,比如MySQL代理、Memcached代理等。

Envoy定位是透明接管微服务之间的通信流量,将通信和服务治理功能从微服务中解耦,通过Envoy可以方便地增加对自定义协议的支持。

Nginx的关键词是Web服务器和反向代理,是显式调用;Envoy是透明接管流量,是隐式调用,更加体现对流量的控制和掌控力。

二、网络模型

网络模型上,Nginx采用的是经典的多进程架构,由master进程和worker进程组成。其中,master进程负责对worker进程进行管理,worker进程负责处理各种网络事件,各个worker进程之间相互独立。

Envoy采用了多线程的网络架构,Envoy一般会根据当前CPU核数创建相同个数的worker线程,所有worker线程同时对Envoy配置的监听器进行监听,接受新的连接,为每个新连接实例化相应的过滤器处理链,处理该连接上的所有请求。

三、连接处理

Nginx通过worker_connections参数来控制每个worker能够建立的最大连接数,从Nginx网络模型可以看出,客户端连接到来时,所有空闲的进程都会去竞争这个新连接。对连接进行精细化管理,Nginx采取的方式是各工作进程根据自身的忙闲程度,动态调整获取新连接的时机。

Envoy也会遇到和Nginx类似的负载不均问题,Envoy当前发展很快,同时需要解决的问题很多。后续会根据具体情况对这个问题进行讨论和解决。

四、插件机制

Nginx拥有强大的插件扩展能力,基于Nginx的插件扩展机制,业务可以非常方便地完成差异化和个性化定制,Nginx插件通过模块的方式提供,具体来说,Nginx主要提供如下几种形式的插件扩展:

1)通过stream机制进行协议扩展,比如增加memcached协议代理和负载均衡等;

2)以Handler方式处理HTTP请求;

3)对HTTP请求和响应消息进行过滤,比如可以修改和定制消息内容等;

4)访问Upstream时的负载均衡,可以提供自定义的负载均衡机制。

Envoy也提供了强大的插件扩展机制,当前使用最多的地方是监听过滤插件和网络处理过滤插件。和Nginx相比,Envoy网络插件定位在协议层面,以HTTP协议为例,Envoy并没有那么细粒度的插件扩展机制,如果想对Envoy的HTTP协议处理进行扩展,当前并没有提供特别多的扩展点。

Envoy的插件当前采用的是静态注册的方式,插件代码和Envoy代码一块进行编译,和Nginx不同,Envoy从最开始就支持插件的动态加载,Envoy通过独特的XDS API设计,可以随时对Envoy的XDS插件进行定制修改,Istio将修改后的XDS配置通过Grpc的方式推送给Envoy动态加载和生效。

五、配置管理

Nginx的配置格式使用自定义的方式,配置结构和配置解析过程都非常复杂。配置组织上,Nginx采用层层嵌套的方式,最外层是核心模块的配置,主要包括events事件模块、http模块和stream模块。对于最复杂的http模块来说,下面会嵌套着server子模块,负责监听和管理http请求,server子模块下还会嵌套着一到多个location,用于描述具体的路由规则。Nginx的配置解析代码可以说是Nginx整个源码体系中最晦涩难懂的部分,配置解析的核心代码在ngx_conf_file.c中,通过层层嵌套解析,形成了一棵树状的配置信息结构。

Envoy的配置管理部分设计得就比较优雅,配置格式直接使用了Protobuf 3,复用了Protobuf 3的数据描述能力和自动代码生成机制,完全省去了配置解析的过程,并且也非常方便对配置格式的有效性进行验证。Nginx的配置都是静态配置,不支持任何形式的动态配置能力。动态配置能力是Envoy相比Nginx最核心的竞争力,通过动态配置,可以在线修改流量路由和链路治理策略,实现策略配置修改的即时生效。

六、内存管理

Nginx内存管理通过Nginx内存池实现,通过内存池的良好设计,使用内存池进行内存管理时,不需要关注内存什么时候释放,连接销毁时会回收连接对应的内存资源;同时通过内存池可以减少内存碎片,通过内存对齐、内存分页等机制,可以有效减少缓存未命中(Cache Miss),提高内存访问的效率。

Envoy在内存管理方面的支持还很粗糙,直接基于原生的内存管理库,内存释放时机管理通过智能指针管理内存的生命周期。和Nginx相比,Envoy在内存管理方面提供的支持不多,完全依赖智能指针机制,对使用者的要求比较高,同时无法满足对性能的极致要求。

七、部署与运维

从运维上说,Nginx采用多进程的通信架构,主进程负责维护工作进程的状态,主要有以下两方面。一方面,监控工作进程的状态,状态异常时会对工作进程进行重启;另一方面,主进程也可以接收外界的管理信号,通知工作进程完成相应的操作。

Envoy是通过控制平面组件Pilot Agent和Sidecar-injection进行管理,Pilot Agent负责管理Envoy的运行状态,当Envoy状态有问题时,Pilot Agent会将Envoy重启,如果重启仍然不能解决问题,会尝试将Envoy调度到其他环境下;Sidecar-injection负责Envoy的自动注入。因此,从架构上看Nginx是自运维的,Envoy是借助控制平面来完成Envoy运行状态的管理,运维上比Nginx方便。

从架构上看Nginx是自运维的,Envoy是借助控制平面来完成Envoy运行状态的管理,运维上比Nginx方便。

八、观测与诊断

从服务的可观测以及诊断上说,Envoy投入了大量的精力,已经全面支持Log、Metric、Trace等可观测机制,并且每种观测方式均提供相应的扩展机制,Nginx在这方面相对逊色很多,可观测以及诊断支持上相对弱一些,当前可能是为了和商业版进行区分,Nginx商业版有完善的运维和问题诊断支持。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK