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++) {
//未初始化,调用onNewConnection
if (!(*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_) {
//获取写缓冲,调用onWrite
BufferSource::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;
}

Envoy 源码分析--network L4 filter manager的更多相关文章

  1. Envoy 源码分析--network

    目录 Envoy 源码分析--network address Instance DNS cidr socket Option Socket ListenSocket ConnectionSocket ...

  2. Envoy 源码分析--LDS

    Envoy 源码分析--LDS LDS 是 Envoy 用来自动获取 listener 的 API. Envoy 通过 API 可以增加.修改或删除 listener. 先来总结下 listener ...

  3. Envoy 源码分析--buffer

    目录 Envoy 源码分析--buffer BufferFragment RawSlice Slice OwnedSlice SliceDeque UnownedSlice OwnedImpl Wat ...

  4. Envoy 源码分析--程序启动过程

    目录 Envoy 源码分析--程序启动过程 初始化 main 入口 MainCommon 初始化 服务 InstanceImpl 初始化 启动 main 启动入口 服务启动流程 LDS 服务启动流程 ...

  5. Envoy 源码分析--event

    目录 Envoy 源码分析--event libevent Timer SignalEvent FileEvent RealTimeSystem 任务队列 延迟析构 dispacth_thread E ...

  6. Struts2 源码分析——过滤器(Filter)

    章节简言 上一章笔者试着建一个Hello world的例子.是一个空白的struts2例子.明白了运行struts2至少需要用到哪一些Jar包.而这一章笔者将根据前面章节(Struts2 源码分析—— ...

  7. Struts2 源码分析——调结者(Dispatcher)之执行action

    章节简言 上一章笔者写关于Dispatcher类如何处理接受来的request请求.当然读者们也知道他并非正真的执行action操作.他只是在执行action操作之前的准备工作.那么谁才是正真的执行a ...

  8. JavaWeb过滤器Filter(附tomcat部分源码分析)

    过滤器Filter 过滤器通常对一些web资源进行拦截,做完一些处理器再交给下一个过滤器处理,直到所有的过滤器处理器,再调用servlet实例的service方法进行处理.过滤器可以对request进 ...

  9. Go Revel - Filter(过滤器)源码分析

    在 Go Revel - server.go 源码分析 http://www.cnblogs.com/hangxin1940/p/3265538.html 说到revel框架很多重要的东西都Filte ...

随机推荐

  1. audio google play()

    <audio id="music" src="" preload loop="loop" autostart="true&q ...

  2. redis 哈希(hash)函数

    哈希(hash)函数 hSet 命令/方法/函数 Adds a value to the hash stored at key. If this value is already in the has ...

  3. idea常用操作大全

    1.智能提示忽略大小写 Ctrl+Alt+s打开setting setting-->Editor-->General-->Code Completion 或者直接搜索Code Com ...

  4. Log4j2 HelloWorld

    Log4j2 使用教程 Log4j2 的好处就不在这里一一列举了,如果你搜了2,说明你对它一定有兴趣,并且想了解它,使用它. 一.下载log4j2 ,基本上你只需要导入下面两个jar包即可: log4 ...

  5. 随手记一 2018/04/23 Ajax基础了解

    1.什么是ajax? 主要目的是用来实现客户端和服务器之间的异步通信,实现页面的局部刷新 2.同步和异步! 同步:当多个线程同时向一个数据发送请求时,必须是A先执行完毕才可以给B,会出现阻塞的情况,但 ...

  6. win7有多条隧道适配器(isatap、teredo、6to4)的原因及关闭方法

    问题:sdp协商时,带有IPV6的信息,需要将IPV6相关信息去掉 原因:网卡启用了ipv6通道 解决:关闭IPv6数据接口 netsh interface isatap set state disa ...

  7. 分布式事务、多数据源、分库分表中间件之spring boot基于Atomikos+XADataSource分布式事务配置(100%纯动态)

    本文描述spring boot基于Atomikos+DruidXADataSource分布式事务配置(100%纯动态),也就是增加.减少数据源只需要修改application.properties文件 ...

  8. ORACLE——RMAN 参数解读

    查看默认rman配置参数 oracle用户下登录rman:rman target / 查看所有配置参数详情:show all show all的第一行:using target database co ...

  9. 解决 js ajax跨域访问报“No 'Access-Control-Allow-Origin' header is present on the requested resource.”错误

    参考页面:https://blog.csdn.net/idomyway/article/details/79572973 如果请求的是PHP页面: header("Access-Contro ...

  10. phtyon

    https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014316399410395 ...