惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
D
DataBreaches.Net
M
MIT News - Artificial intelligence
量子位
N
Netflix TechBlog - Medium
The Cloudflare Blog
The GitHub Blog
The GitHub Blog
P
Proofpoint News Feed
人人都是产品经理
人人都是产品经理
B
Blog RSS Feed
B
Blog
博客园_首页
博客园 - Franky
MyScale Blog
MyScale Blog
有赞技术团队
有赞技术团队
Apple Machine Learning Research
Apple Machine Learning Research
MongoDB | Blog
MongoDB | Blog
云风的 BLOG
云风的 BLOG
爱范儿
爱范儿
H
Help Net Security
Y
Y Combinator Blog
Stack Overflow Blog
Stack Overflow Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
酷 壳 – CoolShell
酷 壳 – CoolShell

博客园 - toong

envoy离线编译方法 Kubernetes AI Gateway Kind 归属地图 kubuntu通过flatpak安装软件 ai-gateway 安装记录 家用台式工作站软件配置 envoy DDOS HTTP/2 Bomb CVE-2026-47774 安全漏洞分析 envoy源码分析(十四)-- XDS的启动流程 P2P与FRP与websocket ros2入门(零)-- 难点与挑战 ros2入门(二)-- 基本概念 envoy源码分析(十三)-- WASM python运行虚拟化环境 大模型从0到1 envoy源码分析(十二)-- XDS/GRPC 绑定网卡中断后是否需要设置RFS linux socket reuse port 小测试 envoy源码分析(十一)--性能分析 envoy源码分析(十)--事件机制专项分析 envoy源码分析(九) -- circuit breakers 现代C++ envoy timeout 说明 观察中断的脚本 /proc/interrupts openssl查看编译时选项设置的方法 内核ipsec转发优化方法 提高ipsec多核并行能力的优化方法之一 tc qdisc 的burst如何设置 bash模拟netstat取值的脚本 linux内核对MSI网卡队列的smp_affinity亲和CPU选择 bash多并发--进程池数量控制 bash单例模式
envoy源码分析(八)--main线程专项分析
toong · 2025-12-18 · via 博客园 - toong

1 框架启动分析

三件事:

1 StrippedManBase 构造

作为MainCommon的base成员。

关键成员: server_, init_manager_

2 server instance 初始化

3 server run

3a worker run

     在listener manager 框架下。

     conn_handler

     主循环:threadRoutine()

             event_base_loop()

3b main run

     event_base_loop()

2 分析异步任务注册/监听初始化。

异步注册:

connectHandlerImpl:: addListener()

    TcpListenerImpl() 构造函数    【回调: onSocketEvent()】

        dispacher.createFileEvent()       【水平触发】

            FileEventImple() 

        newConnection()->createServerConnection()->NetworServerConnctionImpl

    UdpListenerImpl() 构造函数    【回调: onSocketEvent()】

    ListenerFilterBufferImpl() 构造函数   【回调: onFileEvent()】     【边缘触发】  

        filter->onData()

    ServerConnectionImpl()构造函数  【回调: onFileEvent()】

        FilterManagerImpl::onRead()/onWrite()    【边缘触发】

             filter->onData()

                 createCodec()->Http2::ServerConnctionImpl()

                 codec_->dispatch(data)

                     onBody(data) -->  decodeData()

event 实例化

IoSocketHandlerImpl::file_event_

FileEventImpl::cb_

回调

ActiveTcpListerner::onAccept()

ActiveUdpListener::onDataWorker()

3  Admin监听流程分析

InstanceBase构造的时候创建了类成员 handler_ , 类型是: ConnectionHandler

异步注册,与worker一样:

connectHandlerImpl:: addListener()

    后边的回调流程都一样。

        adminImpl::createCodec()

        adminFilter::decodeData()

            admin_makeRequest()

             handler->start() <==>   ADMIN_HANDLER()  【StatsRequest::start()】

             handler->nexChunk()     【StatsRequest::nextChunk()】

监听启动的地方:

admin_->startHttpListener() 

4  state机制与线程间同步

获取各worker统计的方法:

Stats::PrimitiveCounterSnapshot = PrimitiveCounter

关键结构的初始化:

在初始化函数 StrippedMainBase::StrippedMainBase()  中。

tls_  ThreadLocal::InstanceImpl() 

  //  在类 instanceBase 中是成员 thread_local_

todo

stats_store_  Stats::ThreadLocalStoreImpl() 

  // 在类 instanceBase 中是成员 Stats::StoreRoot& stats_store_;

统计合并机制:

admin线程启动了一个timer做合并,默认5秒。

image

state-sink的处理:

在admin线程发送。

在上小节的stat_flush_timer回调中调用

 /source/extensions/stat_sinks/common/statsd/

UdpStatsdSink::flush()

5  xDS处理

增量xds的类型:

InstanceBase::initializaOrThrow()

MainImpl::initialize()

ClusterManagerImpl::initialize()

 DeltaGrpcMuxFactory->create()  => GrpcMuxDelta() // source/extensions/config_subscription/grpc/xds_mux/grpc_mux_impl.h

 GrpcMuxImpl::Start()

     GrpcStream::establishNewStream()

         AsyncClient->start()      //  grpc/typed_async_client.h  AsyncClient::start()

            client->startRaw()     //  grpc/typed_async_client.cc  startUntyped()

                    AsyncClientImpl::startRaw()  //  aync_cliet_impl.cc<grpc> 

                    AsyncStreamImpl::initialize()   //  aync_cliet_impl.cc<grpc> 

                           http_async_client.start()

                               TODO:找到tcp连接创建的地方。 这个tcp创建在GRPC库里边了,envoy代码是没有的。

            参考: envoy源码分析(十二)-- XDS/GRPC 

重试的timer

retry_timer_ = dispatcher.createTimer(void{ establishNewStream() })

选取GRPC服务的工厂类:

AsyncClientManagerImpl::factoryForGrpcService()  ==> AsyncClientFactoryImpl()

        createUncachedRawAsyncClient() // 由工厂类创建不同的client。

                AsyncClientImpl::AsyncClientImpl()  // aync_cliet_impl.cc<grpc>  有 startRaw() 函数

grpc类型有两种,一种envoy自己实现的,一种google的, 在ads_config中可以进行配置:

https://www.envoyproxy.io/docs/envoy/v1.32.13/intro/arch_overview/other_protocols/grpc#arch-overview-grpc-services

TODO:不设置的时候,默认值用了哪个?

6  健康检查处理

函数 HealthCheckerFactory::ceate() 用来创建健康检查对象。

在两个地方调用:

         1  ClusterFactoryImplBase::create()

                   调用栈:

                      ClusterManagerImpl:: initialize()

                          ClusterManagerImpl::loadCluster()

                               clusterFromProto()

         2  HdsCluster::updateHealthchecks()   或  HdsCluster::initHealthChecks()

                   调用栈:

                      AsyncStreamImpl::onData()

                          AsyncStreamCallbacks::onReceiveMessageRaw()    // typed_async_client.h

                                HdsDelegate::onReceiveMessage()

                                    prcessMessage()

                                        HdsDelegate::createHdsCluster()

7  到后端的连接

类 ClientConnectionImpl 的初始化函数中创建了类 ClientSocketImpl