Envoy Filters

今天我们来聊聊,Envoy 中最重要的抽象 Filter

FilterChainManager

书接上文 Around Envoy 我们已知 Envoy 是一个基于 FilterChain 的系统。

Envoy 做了简单的抽象,把 Filter 相关的逻辑都至于 filter.h 中,在这个简单的抽象中,我们可以发现

Filtergithub
1
class Filter : public WriteFilter, public ReadFilter {};

Filter 这层抽象就是由 WriteFilterReadFilter 组合而来

ReadFiltergithub
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class ReadFilter {
public:
virtual ~ReadFilter() = default;

// 流式处理数据读取
virtual FilterStatus onData(Buffer::Instance& data, bool end_stream) PURE;

// 建立链接时触发一次
virtual FilterStatus onNewConnection() PURE;

// 初始化 Callback,这个主要是给 Filter manager 来处理
virtual void initializeReadFilterCallbacks(ReadFilterCallbacks& callbacks) PURE;
};

class WriteFilter {
public:
virtual ~WriteFilter() = default;

// 流式处理数据写入
virtual FilterStatus onWrite(Buffer::Instance& data, bool end_stream) PURE;

// 初始化 Callback
virtual void initializeWriteFilterCallbacks(WriteFilterCallbacks&) {}
};