【初探云原生】服务网格基石 -- Envoy 源码探索(一)

写在前面

Envoy 是 Istio 服务网格的数据面组件,服务网格提供的多种强大的治理能力,在底层均是由 Envoy 做数据面增强实现的。Envoy 是专为大型现代 SOA(面向服务架构)架构设计的 L7 代理和通信总线,体积小,性能高。它的诞生源于以下理念:对应用程序而言,网络应该是透明的。当网络和应用程序出现故障时,应该能够很容易确定问题的根源。
请添加图片描述

启动初始化

本文代码是以 Envoy master 分支 f09ed3646b88fae777a060be37f3224dfa67f428 commit 为基准做的源码分析。Envoy 启动入口是在 source/exe/main.cc,
请添加图片描述
可以看到由 main 进到主程序后,将执行 Envoy::MainCommon::main 方法
请添加图片描述
main 方法中执行的是上面 run 方法,从代码注释可以看出设计的意图是,服务 listener 启动在 try/catch 之外,以便可以在早期诊断中可以生成 core-dump。

请添加图片描述
代码依然很简洁,主要执行的是 server_ -> run() 方法,而 server_ 本身是在 MainCommonBase 构造函数中初始化。

请添加图片描述
源码先是初始化热重启模块,以及 drain_manager_ 模块(在服务器热重启或者动态删除Listener时会使用)。

在 initialize 方法相对比较长,其中核心的逻辑如下:
1)加载bootstrap的配置信息。 InstanceUtil::loadBootstrapConfig(bootstrap_, options_,messageValidationContext().staticValidationVisitor(), *api_);
2)初始化本地信息 local_info_,管理接口 admin_,密钥管理 secret_manager_ 等变量
3)创建ListenerManager来管理Listener。
请添加图片描述
可以看到 ListenerManagerImpl 初始化中,创建了 server 指定并发数的 worker。
4)通过从配置文件加载出来的bootstrap信息来创建静态的ClusterManager和listener
请添加图片描述

线程模型

请添加图片描述
Envoy 的线程模型本身是有一个主线程负责读取配置,而工作线程负责监听端口以及处理请求。在源码中,listener 和 worker 之间本身是有绑定关系的。
请添加图片描述
在 WorkerImpl::addListener 方法中触发了 ConnectionHandlerImpl::addListener 的回调,在 addListener 方法中创建了 ActiveTcpListener

请添加图片描述
ActiveTcpListener 的构造函数如下,其中 createListener 方法是关键
请添加图片描述
请添加图片描述
在 createListener 方法中创建了 `TcpListenerImpl 对象

请添加图片描述
在该 listener 上可以看到嵌套字已经绑定在 libevent 上了

线程间通信模型

请添加图片描述
Envoy 的主线程通过 Dispatcher 的 post 方法进行数据更新的通知,work 线程定时以及被触发执行对应的变更。

请添加图片描述
请添加图片描述
可以看到通知机制本身是通过 libevent 的 event_active 时间进行触发的。而具体唤醒回调,在初始 DispatcherImpl时候进行的。

请添加图片描述
其中核心逻辑在 post_cb_(base_scheduler_.createSchedulableCallback([this]() -> void { runPostCallbacks(); })) 请添加图片描述
从源码上可以看到,每个线程会定时刷新 callbacks 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值