idou老师教你学Istio 29:Envoy启动流程

栏目: 后端 · 发布时间: 7年前

内容简介:Envoy启动时,会启动一个进程,并在这个进程中启动很多线程,这样,可以启动很多worker线程,一般worker线程数与核心数相同,每个worker线程处理所有已配置的listener上的请求,管理连接并处理filterchain,非阻塞;同时,在这个进程中会启动一个主线程,它负责启动和停止envoy,也是通过API提供配置管理的线程,同时它收集不同的指标,管理其它线程,也是非阻塞的。2.1 Filter过滤器,包括listener filter、network filter和http filter。Li
  1. 功能概述

Envoy启动时,会启动一个进程,并在这个进程中启动很多线程,这样,可以启动很多worker线程,一般worker线程数与核心数相同,每个worker线程处理所有已配置的listener上的请求,管理连接并处理filterchain,非阻塞;同时,在这个进程中会启动一个主线程,它负责启动和停止envoy,也是通过API提供配置管理的线程,同时它收集不同的指标,管理其它线程,也是非阻塞的。

  1. 重要数据结构定义

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%的非阻塞。

  1. 代码流程

3.1 流程概述

Envoy启动时,首先启动主线程,在主线程中对listener和filter进行初始化操作,然后将listener绑定到worker上,并由主线程拉起worker线程,由worker线程负责监听新连接。

idou老师教你学Istio 29:Envoy启动流程

3.2 初始化

3.2.1 main入口

idou老师教你学Istio 29:Envoy启动流程

main函数是envoy启动的总入口,首先生成main_common,用于后面的初始化。

3.2.2 初始化main_common

idou老师教你学Istio 29:Envoy启动流程

idou老师教你学Istio 29:Envoy启动流程

在main_common里面会生成maincommonbase,它会做server instance的初始化,一个instance是一个服务的实例.

3.2.3 Instance初始化

idou老师教你学Istio 29:Envoy启动流程

在maincommonbase里调用InstanceImpl函数后,首先对启动携带的配置信息进行注册,然后执行instance的初始化。

idou老师教你学Istio 29:Envoy启动流程

Instance的初始化包括两部分:

① 将当前instance注册到ListenerManager,来管理更新;

② 创建并初始化MainImpl,MainImpl用来初始化监听listener;

idou老师教你学Istio 29:Envoy启动流程

MainImpl根据配置文件获取静态监听listener列表,将它们实例化并注册到ListenerManager。

3.2.4 初始化listener

idou老师教你学Istio 29:Envoy启动流程

对于每个静态listener,根据配置文件为它创建ListenerFilterFactoryList,并根据配置为它添加ListenerFilterFactory。

listener filter有三个:original dst filter,proxy protocol filter, TLS inspector filter,一一按照配置判断是否加入ListenerFilterFactoryList。

idou老师教你学Istio 29:Envoy启动流程

idou老师教你学Istio 29:Envoy启动流程

配置ListenerFilterFactoryList的同时,也会根据配置为这个listener创建NetworkerFilterFactoryList,供后续建立在这个listener上的连接使用。

3.3 启动

3.3.1 启动入口

idou老师教你学Istio 29:Envoy启动流程

在main_common初始化正常完成后,执行main_common→run()启动,从而后续执行instance的run()方法,在instance的run()方法,会执行网络级别上的listener初始化。

idou老师教你学Istio 29:Envoy启动流程

3.3.2 启动worker,将listener绑定到worker上

idou老师教你学Istio 29:Envoy启动流程

idou老师教你学Istio 29:Envoy启动流程

此处,会将从配置文件读取的所有listener绑定到所有的worker上,worker是服务的并发线程,数目一般和核心数相同,将listener绑定到worker上后会通过connectionhandler模块将其初始化。

idou老师教你学Istio 29:Envoy启动流程

idou老师教你学Istio 29:Envoy启动流程

3.3.3 Listener初始化

Listener的初始化过程首先生成ActiveListener,通过ActiveListener调用network包内的创建函数来对listener进行网络级别的初始化。

idou老师教你学Istio 29:Envoy启动流程

idou老师教你学Istio 29:Envoy启动流程

idou老师教你学Istio 29:Envoy启动流程

3.3.5 启动worker线程,进入监听

Listener绑定在worker上,当listener初始化完成后,需要启动worker服务才能真正进入监听流程。

idou老师教你学Istio 29:Envoy启动流程

idou老师教你学Istio 29:Envoy启动流程

idou老师教你学Istio 29:Envoy启动流程

idou老师教你学Istio 29:Envoy启动流程

此处,为每个worker启动新线程,并调用libevent的event_base_loop进入监听,等待连接事件到达触发后,回调onAccept进入处理流程。

  1. 总结

本文从程序入口main函数开始,分析了envoy如何启动,以及如何对listener、worker这些核心数据结构进行初始化,并详细阐述了从envoy主线程启动到worker线程进入监听行为的全过程。

相关服务请访问 https://support.huaweicloud.co ... _2019


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Two Scoops of Django

Two Scoops of Django

Daniel Greenfeld、Audrey M. Roy / CreateSpace Independent Publishing Platform / 2013-4-16 / USD 29.95

Two Scoops of Django: Best Practices For Django 1.5 is chock-full of material that will help you with your Django projects. We'll introduce you to various tips, tricks, patterns, code snippets, and......一起来看看 《Two Scoops of Django》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具