本篇文章是envoy httpfilter相关代码阅读的整理和总结,笔者试图通过这篇文章将http filter在envoy内部的管控讲清楚,并且将request和response是如何使用这部分 http filter功能的流程介绍清楚。
httpfilter是netfilter中的一种filter,因为envoy对http支持的细粒度管控很全面,所以将httpfilter又做了一层只是针对http协议的filter chain的管控处理逻辑。
httpfilter 在envoy中采用的是生产者和消费者的处理模式,通过配置文件或者xds协议的配置数据将http filter相关的信息,存放到固定的列表中,在有消息request和response到来的时候,通过异步事件触发对应的响应函数,进而从这些列表中取出对应的filter,依次执行filter的功能,达到使用http filter的目的。

一、生产者部分的逻辑:
在envoy初始化的时候,或者更新httpfilter配置的时候,通过httpconnectionManagerconfig依次将httpfilter存放到filter_factories中。
逻辑代码如下所示:
Network::FilterFactoryCb
HttpConnectionManagerFilterConfigFactory::createFilterFactoryFromProtoTyped()
---→
std::shared_ptr<HttpConnectionManagerConfig> Utility::createConfig()
---→
std::make_shared<HttpConnectionManagerConfig>() {
......
// 操作的是http_filters
const auto& filters = config.http_filters();
DependencyManager dependency_manager;
for (int32_t i = 0; i < filters.size(); i++) {
processFilter(filters[i], i, "http", "http", i == filters.size() - 1, filter_factories_,
dependency_manager);
}
......
}
----→
void HttpConnectionManagerConfig::processFilter() {
......
auto* factory =
Config::Utility::getAndCheckFactory<Server::Configuration::NamedHttpFilterConfigFactory>(
proto_config, proto_config.is_optional());
ProtobufTypes::MessagePtr message = Config::Utility::translateToFactoryConfig(
proto_config, context_.messageValidationVisitor(), *factory);
Http::FilterFactoryCb callback =
factory->createFilterFactoryFromProto(*message, stats_prefix_, context_);
......
// 这里将filterfactorycb存放到filter_factories中
filter_factories.push_back(std::move(filter_con

最低0.47元/天 解锁文章
2202

被折叠的 条评论
为什么被折叠?



