当前位置:网站首页>Envoy 源码流程图
Envoy 源码流程图
2022-08-01 11:05:00 【赵化冰】
最近在实现 MetaProtocol 时阅读了 Envoy 相关的一些源码。这里将一些重要流程的时序图记录下来,以备后续查看。
TCP Proxy
TCP Proxy 时序图
Dubbo Proxy
Dubbo Proxy 时序图
RDS
RDS(路由发现服务)的代码包括下面三个主要的流程:
- 订阅 RDS
- 执行线程:Main Thread
- 工作流程:RDS 订阅是在 HCM 配置工厂类中处理的,详细流程如下:
- Envoy 在初始化 Network Filter Chain 时调用 HttpConnectionManagerFilterConfigFactory 的 createFilterFactoryFromProtoTyped 方法。
- 该方法中会创建一个 RouteConfigProviderManager 对象。代码中只会创建一个单实例,所有的 HCM 初始化过程会共用一个 RouteConfigProviderManager Singleton 对象。由于所有 HCM 初始化都是在 Main Thread 中进行的,因此对该 Singleton 的访问不会存在并发冲突。(相关代码)
- 根据 HCM 的路由配置是 RDS 还是静态配置,分别创建 RdsRouteConfigProvider 或者 StaticRouteConfigProvider (相关代码)。该方法中会创建一个 RdsRouteConfigSubscription 对象,该对象负责具体的订阅逻辑,然后再以 RdsRouteConfigSubscription 作为参数来创建 RdsRouteConfigSubscription。注意这里 RdsRouteConfigProvider 实例是和 RDS 配置的 hash 值一一对应的,同样的 RDS 配置(即 config_source 和 route_config_name 相同),只会创建一个 RdsRouteConfigProvider,以避免多个 HCM 重复订阅相同的 RDS。如果一个 RDS 配置对应的 RdsRouteConfigProvider 已经存在,会将已有的 RdsRouteConfigProvider 返回给 HCM 。即多个 HCM 配置的 RDS 相同的话,会共用一个 RdsRouteConfigProvider 实例。 (相关代码)。
- 在 RdsRouteConfigSubscription 的构造方法中,会从 context 中拿到 ClusterManager 的SubscriptionFactory,然后通过 subscriptionFromConfigSource 方法对该 RDS 进行订阅。 subscriptionFromConfigSource 方法中会将自身作为SubscriptionCallbacks 参数,以接收 RDS 更新通知。(相关代码)
- 处理 RDS 的配置更新
- 执行线程:Main Thread
- 工作流程:
- RdsRouteConfigSubscription 的 onConfigUpdate 方法收到 RDS 配置更新的回调,然后调用 RdsRouteConfigProvider 的 onConfigUpdate 方法。(相关代码)
- RdsRouteConfigProvider 通过 Thread local storage 机制将配置更新到各个 worker thread 中。
- 使用 RDS 配置对请求进行路由
- 执行线程:Worker Thread
- 工作流程:
- Envoy 调用到 Network Filter Chain 中的 HCM filter。
- HCM filter 调用到 HTTP Filter Chain 中的 Router。
- Router 拿到缓存的 RDS 配置,根据 RDS 配置进行路由。
RDS 时序图
边栏推荐
- NIO‘s Sword(思维,取模,推公式)
- C language implementation!20000 in 4 seconds
- 一篇文章,带你详细了解华为认证体系证书(1)
- Stone Technology builds hard-core brand power and continues to expand the global market
- Several methods of appending elements are commonly used in js: append, appendTo, after, before, insertAfter, insertBefore, appendChild
- 新书上市 |《谁在掷骰子?》在“不确定性时代”中确定前行
- Why Metropolis–Hastings Works
- 石头科技打造硬核品牌力 持续出海拓展全球市场
- Ts-Map 类的使用
- 2022年7月31日--使用C#迈出第一步--使用 C# 创建具有约定、空格和注释的易读代码
猜你喜欢
Why Metropolis–Hastings Works
Qt 支持HEIC/HEIF格式图片
leetcode/子矩阵元素和
在线GC日志分析工具——GCeasy
小程序毕设作品之微信美食菜谱小程序毕业设计成品(1)开发概要
The meaning and trigger conditions of gc
How to Steal $100 Million from the Perfect Smart Contract
What is a stepper motor?40 pictures to show you!
retired paddling
Mysql index related knowledge review one
随机推荐
我是如何保护 70000 ETH 并赢得 600 万漏洞赏金的
上周热点回顾(7.25-7.31)
shell--面试题
EasyRecovery热门免费数据检测修复软件
C#/VB.NET 将PPT或PPTX转换为图像
The difference between undefined and null in JS
C#/VB.NET convert PPT or PPTX to image
广域铭岛入选2022年重庆市数字经济产业发展试点示范项目名单
Promise学习(四)异步编程的终极解决方案async + await:用同步的方式去写异步代码
Qt supports HEIC/HEIF format images
一篇文章,带你详细了解华为认证体系证书(1)
大众碰到点评的一个字体反爬,落地技术也是绝了
Drawing arrows of WPF screenshot control (5) "Imitation WeChat"
重庆市大力实施智能建造,推动建筑业数字化转型,助力“建造强市”
PDMan-国产免费通用数据库建模工具(极简,漂亮)
力扣解法汇总1374-生成每种字符都是奇数个的字符串
【钛晨报】国家统计局:7月制造业PMI为49%;玖富旗下理财产品涉嫌欺诈,涉及390亿元;国内航线机票燃油附加费8月5日0时起下调
Qt 支持HEIC/HEIF格式图片
Generate certificates using KeyStore
How I secured 70,000 ETH and won a 6 million bug bounty