zoukankan      html  css  js  c++  java
  • idou老师教你学Istio 29:Envoy启动流程

    1. 功能概述

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

    2. 重要数据结构定义

    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. 代码流程

    3.1 流程概述

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

    0227_1.jpg

    3.2 初始化

    3.2.1 main入口

    0227_2.jpg

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

    3.2.2 初始化main_common

    0227_3.jpg

    0227_4.jpg

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

    3.2.3 Instance初始化

    0227_5.jpg

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

    0227_6.jpg

    Instance的初始化包括两部分:

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

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

    0227_7.jpg

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

    3.2.4 初始化listener

    0227_8.jpg

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

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

    0227_9.jpg

    0227_10.jpg

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

    3.3 启动

    3.3.1 启动入口

    0227_11.jpg

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

    0227_12.jpg

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

    0227_13.jpg

    0227_14.jpg

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

    0227_15.jpg

    0227_16.jpg

    3.3.3 Listener初始化

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

    0227_17.jpg

    0227_18.jpg

    0227_19.jpg

    3.3.5 启动worker线程,进入监听

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

    0227_20.jpg

    0227_21.jpg

    0227_22.jpg

    0227_23.jpg

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

    4. 总结

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

    相关服务请访问https://support.huaweicloud.com/cce/index.html?cce_helpcenter_2019

  • 相关阅读:
    MDX Step by Step 读书笔记(六) Building Complex Sets (复杂集合的处理) Filtering Sets
    在 Visual Studio 2012 开发 SSIS,SSAS,SSRS BI 项目
    微软BI 之SSIS 系列 在 SSIS 中读取 SharePoint List
    MDX Step by Step 读书笔记(五) Working with Expressions (MDX 表达式) Infinite Recursion 和 SOLVE_ORDER 原理解析
    MDX Step by Step 读书笔记(五) Working with Expressions (MDX 表达式)
    使用 SQL Server 2012 Analysis Services Tabular Mode 表格建模 图文教程
    MDX Step by Step 读书笔记(四) Working with Sets (使用集合) Limiting Set and AutoExists
    SQL Server 2012 Analysis Services Tabular Model 读书笔记
    Microsoft SQL Server 2008 MDX Step by Step 学习笔记连载目录
    2011新的开始,介绍一下AgileEAS.NET平台在新的一年中的发展方向
  • 原文地址:https://www.cnblogs.com/CCE-SWR/p/10443850.html
Copyright © 2011-2022 走看看