本文共 2236 字,大约阅读时间需要 7 分钟。
Envoy启动时,会启动一个进程,并在这个进程中启动很多线程,这样,可以启动很多worker线程,一般worker线程数与核心数相同,每个worker线程处理所有已配置的listener上的请求,管理连接并处理filterchain,非阻塞;同时,在这个进程中会启动一个主线程,它负责启动和停止envoy,也是通过API提供配置管理的线程,同时它收集不同的指标,管理其它线程,也是非阻塞的。
2.1 Filter
过滤器,包括listener filter、network filter和http filter。Listener filter可以用于操作连接元数据,在新接收的套接字上进行操作,例如获取原始目的地址,重定向连接等;network filter主要负责数据读写;http filter主要负责数据处理。
2.2 Listener
监听器,envoy中支持在每个线程中配置任意数量的监听器,每个监听器独立配置一定数量的network filter,也可以选择性的配置listener filter,listener filter在连接建立之前处理,network filter在连接建立之后处理。
2.3 Worker
一个worker对应一个envoy的执行线程,将listener绑定在worker上,worker负责监听、过滤和转发,每个连接的生命周期会绑定在一个单独的worker上,通常情况下,envoy实现了100%的非阻塞。
3.1 流程概述
Envoy启动时,首先启动主线程,在主线程中对listener和filter进行初始化操作,然后将listener绑定到worker上,并由主线程拉起worker线程,由worker线程负责监听新连接。
3.2.1 main入口
3.2.2 初始化main_common
3.2.3 Instance初始化
① 将当前instance注册到ListenerManager,来管理更新;
② 创建并初始化MainImpl,MainImpl用来初始化监听listener;
3.2.4 初始化listener
listener filter有三个:original dst filter,proxy protocol filter, TLS inspector filter,一一按照配置判断是否加入ListenerFilterFactoryList。
3.3 启动
3.3.1 启动入口
Listener的初始化过程首先生成ActiveListener,通过ActiveListener调用network包内的创建函数来对listener进行网络级别的初始化。
3.3.5 启动worker线程,进入监听
Listener绑定在worker上,当listener初始化完成后,需要启动worker服务才能真正进入监听流程。
本文从程序入口main函数开始,分析了envoy如何启动,以及如何对listener、worker这些核心数据结构进行初始化,并详细阐述了从envoy主线程启动到worker线程进入监听行为的全过程。
相关服务请访问https://support.huaweicloud.com/cce/index.html?cce_helpcenter_2019
转载于:https://blog.51cto.com/14051317/2355620