Envoy 源码分析--network L4 filter manager
目录
- Envoy 源码分析--network L4 filter manager
- FilterManagerImpl
- addWriteFilter
- addReadFilter
- addFilter
- initializeReadFilters
- onRead
- onWrite
- FilterManagerImpl
Envoy 源码分析--network L4 filter manager
申明:本文的 Envoy 源码分析基于 Envoy1.10.0。
承接Envoy 源码分析--network,上次 network 只分析到 L4 过滤,这次接下来分析。
L4 过滤有三个不同类型的过滤器:
- 读过滤:当 Envoy 从下游连接接收数据时,调用读过滤器。
- 写过滤:当 Envoy 要发送数据到下游连接时,调用写过滤器。
- 读/写过滤:当 Envoy 从下游连接接收数据和要发送数据到下游连接时,调用读/写过滤器。
网络级过滤器的 API 相对简单,因为最终过滤器只操作原始字节和少量连接事件(例如,TLS 握手完成、连接在本地或远程断开等)。
现在我们来分析下 L4 过滤的过滤管理,先看 UML 类图。
FilterManagerImpl
所有的 L4 filter FilterManager 都由 FilterManagerImpl
进行管理。它提供6个接口,其中 4个接口是和 FilterManager
一样。其余两个则是读和写。
addWriteFilter
调用此接口,直接将其添加到下游过滤器。
void FilterManagerImpl::addWriteFilter(WriteFilterSharedPtr filter) {ASSERT(connection_.state() == Connection::State::Open);downstream_filters_.emplace_front(filter);
}
addReadFilter
新建 ActiveReadFilter
,加入下游过滤器。
void FilterManagerImpl::addReadFilter(ReadFilterSharedPtr filter) {ASSERT(connection_.state() == Connection::State::Open);ActiveReadFilterPtr new_filter(new ActiveReadFilter{*this, filter});filter->initializeReadFilterCallbacks(*new_filter);new_filter->moveIntoListBack(std::move(new_filter), upstream_filters_);
}
addFilter
加入上游过滤器和下游过滤器
void FilterManagerImpl::addFilter(FilterSharedPtr filter) {
addReadFilter(filter);
addWriteFilter(filter);
}
initializeReadFilters
初始化读过滤器,会调用各个过滤器的 onNewConnection
。
for (; entry != upstream_filters_.end(); entry++) {if (!(*entry)->initialized_) {(*entry)->initialized_ = true;FilterStatus status = (*entry)->filter_->onNewConnection();if (status == FilterStatus::StopIteration) {return;}}
onRead
如果没有初始化调用 onNewConnection
,然后获取读缓冲,对缓冲数据处理调用 onData
。
for (; entry != upstream_filters_.end(); entry++) {//未初始化,调用onNewConnectionif (!(*entry)->initialized_) {(*entry)->initialized_ = true;FilterStatus status = (*entry)->filter_->onNewConnection();//需要过滤的数据,直接退出。if (status == FilterStatus::StopIteration) {return;}}BufferSource::StreamBuffer read_buffer = buffer_source_.getReadBuffer();if (read_buffer.buffer.length() > 0 || read_buffer.end_stream) {//调用onData进行处理FilterStatus status = (*entry)->filter_->onData(read_buffer.buffer, read_buffer.end_stream);//需要过滤的数据,直接退出。if (status == FilterStatus::StopIteration) {return;}}}
onWrite
获取写缓冲,过滤写缓冲。
FilterStatus FilterManagerImpl::onWrite() {for (const WriteFilterSharedPtr& filter : downstream_filters_) {//获取写缓冲,调用onWriteBufferSource::StreamBuffer write_buffer = buffer_source_.getWriteBuffer();FilterStatus status = filter->onWrite(write_buffer.buffer, write_buffer.end_stream);if (status == FilterStatus::StopIteration) {return status;}}return FilterStatus::Continue;
}
转载于:https://www.cnblogs.com/mathli/p/10727875.html
Envoy 源码分析--network L4 filter manager相关推荐
- envoy源码分析(二):处理客户端请求
目录 第一节 一个简单的用例 第二节 分析 配置解析 admin static_resources 源码解析 在envoy源码分析(一):启动_wyy4045的专栏-CSDN博客中已经分析了envoy ...
- Envoy源码分析之Dispatcher
2019独角兽企业重金招聘Python工程师标准>>> 摘要: Dispatcher 在Envoy的代码中Dispatcher是随处可见的,可以说在Envoy中有着举足轻重的地位,一 ...
- Kube Controller Manager 源码分析
Kube Controller Manager 源码分析 Controller Manager 在k8s 集群中扮演着中心管理的角色,它负责Deployment, StatefulSet, Repli ...
- istio源码分析——pilot-agent如何管理envoy生命周期
原文:istio源码分析--pilot-agent如何管理envoy生命周期 声明 分析的源码为0.7.1版本 环境为k8s 由于没有C++ 基础,所以源码分析止步于 C++,但也学到很多东西 pil ...
- Sizzle.filter [ 源码分析 ]
最近一直在研究Sizzle选择器,对于其中的原理确实不得不佩服! Sizzle中的filter方法,主要负责块表达式过滤元素集合,在方法内部会调用Sizzle.selector.fitler方法执行过 ...
- jQuery源码分析之实例find和filter方法的区别七问
问题1:jQuery.filter的源码是什么? jQuery.filter = function( expr, elems, not ) {var elem = elems[ 0 ];//如果含有第 ...
- openstack-ceilometer第二式:源码分析-polling
openstack-ceilometer第二式:源码分析-polling 以社区 N 版代码为例 一.启动命令 exec ceilometer-polling --polling-namespaces ...
- Spark源码分析之七:Task运行(一)
在Task调度相关的两篇文章<Spark源码分析之五:Task调度(一)>与<Spark源码分析之六:Task调度(二)>中,我们大致了解了Task调度相关的主要逻辑,并且在T ...
- Django源码分析10:makemigrations命令概述
django源码分析 本文环境python3.5.2,django1.10.x系列 django源码分析-makemigrations命令概述 Django项目中的数据库管理命令就是通过makemig ...
最新文章
- Java反射 - 动态类加载和重载
- Windows系统一键安装zabbix agent
- JDK线程池的ThreadFactory
- 新版本springboot-整合mybatis
- pyqt 槽任意参数_PyQt5信号与槽机制入门(一)
- HOJ 2678 Stars
- maven上传jar到私服
- Node.js下载安装及各种npm、cnpm、nvm、nrm配置(保姆式教程—提供全套安装包)—nvm的安装与配置(4)
- 如何从零开始搭建自己的博客
- Python实现Excel与XML之间的转换
- Python 运维总结
- 双线性对在密码学中的应用(下)
- 计算机键盘练习,电脑键盘指法练习经验分享
- 校园网网络命令拓扑命令+详解集合
- google ads 关联 firebase 进行广告投放配置
- 前端第四天 盒子模型/浮动与定位
- 保留两位小数除法算式_小数除法计算题
- Excel最强玩法!用Excel做“动态日历表”,让你的好记性更牢固!
- 使用ffmpeg 命令分割视频方法
- Kotlin Primer·第二章·基本语法
热门文章
- NGINX下的红黑树源码详解(附 流程图和GIF)
- java.util.LinkedHashMap cannot be cast to Entity
- 软件开发模式之敏捷开发
- 返回值带头信息 php_php与Redis实现分布式锁
- ebs r12多少钱 实施oracle_Oracle EBS实施具体是做什么
- 支持pygame的python有哪些版本_完整构建文件支持PYGAME
- 带格式文本html 直接复制粘贴,通过JS将带格式的文本复制到剪贴版的两种方法...
- php serialize error at offset,unserialize(): Error at offset出现的原因分析以及解决方法
- 每个选项设置上限的投票_使用Redis有序集合实现投票排行榜系统
- TCP如何实现可靠性传输