目录

  • Envoy 源码分析--network L4 filter manager

    • FilterManagerImpl

      • addWriteFilter
      • addReadFilter
      • addFilter
      • initializeReadFilters
      • onRead
      • onWrite

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相关推荐

  1. envoy源码分析(二):处理客户端请求

    目录 第一节 一个简单的用例 第二节 分析 配置解析 admin static_resources 源码解析 在envoy源码分析(一):启动_wyy4045的专栏-CSDN博客中已经分析了envoy ...

  2. Envoy源码分析之Dispatcher

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: Dispatcher 在Envoy的代码中Dispatcher是随处可见的,可以说在Envoy中有着举足轻重的地位,一 ...

  3. Kube Controller Manager 源码分析

    Kube Controller Manager 源码分析 Controller Manager 在k8s 集群中扮演着中心管理的角色,它负责Deployment, StatefulSet, Repli ...

  4. istio源码分析——pilot-agent如何管理envoy生命周期

    原文:istio源码分析--pilot-agent如何管理envoy生命周期 声明 分析的源码为0.7.1版本 环境为k8s 由于没有C++ 基础,所以源码分析止步于 C++,但也学到很多东西 pil ...

  5. Sizzle.filter [ 源码分析 ]

    最近一直在研究Sizzle选择器,对于其中的原理确实不得不佩服! Sizzle中的filter方法,主要负责块表达式过滤元素集合,在方法内部会调用Sizzle.selector.fitler方法执行过 ...

  6. jQuery源码分析之实例find和filter方法的区别七问

    问题1:jQuery.filter的源码是什么? jQuery.filter = function( expr, elems, not ) {var elem = elems[ 0 ];//如果含有第 ...

  7. openstack-ceilometer第二式:源码分析-polling

    openstack-ceilometer第二式:源码分析-polling 以社区 N 版代码为例 一.启动命令 exec ceilometer-polling --polling-namespaces ...

  8. Spark源码分析之七:Task运行(一)

    在Task调度相关的两篇文章<Spark源码分析之五:Task调度(一)>与<Spark源码分析之六:Task调度(二)>中,我们大致了解了Task调度相关的主要逻辑,并且在T ...

  9. Django源码分析10:makemigrations命令概述

    django源码分析 本文环境python3.5.2,django1.10.x系列 django源码分析-makemigrations命令概述 Django项目中的数据库管理命令就是通过makemig ...

最新文章

  1. Java反射 - 动态类加载和重载
  2. Windows系统一键安装zabbix agent
  3. JDK线程池的ThreadFactory
  4. 新版本springboot-整合mybatis
  5. pyqt 槽任意参数_PyQt5信号与槽机制入门(一)
  6. HOJ 2678 Stars
  7. maven上传jar到私服
  8. Node.js下载安装及各种npm、cnpm、nvm、nrm配置(保姆式教程—提供全套安装包)—nvm的安装与配置(4)
  9. 如何从零开始搭建自己的博客
  10. Python实现Excel与XML之间的转换
  11. Python 运维总结
  12. 双线性对在密码学中的应用(下)
  13. 计算机键盘练习,电脑键盘指法练习经验分享
  14. 校园网网络命令拓扑命令+详解集合
  15. google ads 关联 firebase 进行广告投放配置
  16. 前端第四天 盒子模型/浮动与定位
  17. 保留两位小数除法算式_小数除法计算题
  18. Excel最强玩法!用Excel做“动态日历表”,让你的好记性更牢固!
  19. 使用ffmpeg 命令分割视频方法
  20. Kotlin Primer·第二章·基本语法

热门文章

  1. NGINX下的红黑树源码详解(附 流程图和GIF)
  2. java.util.LinkedHashMap cannot be cast to Entity
  3. 软件开发模式之敏捷开发
  4. 返回值带头信息 php_php与Redis实现分布式锁
  5. ebs r12多少钱 实施oracle_Oracle EBS实施具体是做什么
  6. 支持pygame的python有哪些版本_完整构建文件支持PYGAME
  7. 带格式文本html 直接复制粘贴,通过JS将带格式的文本复制到剪贴版的两种方法...
  8. php serialize error at offset,unserialize(): Error at offset出现的原因分析以及解决方法
  9. 每个选项设置上限的投票_使用Redis有序集合实现投票排行榜系统
  10. TCP如何实现可靠性传输