Envoy HTTP 过滤器处理技术文档

1. 概述

Envoy 的 HTTP 过滤器处理是其核心功能之一,通过过滤器链机制实现对 HTTP 请求和响应的灵活处理。过滤器链由解码过滤器(处理请求)和编码过滤器(处理响应)组成,允许开发者在不修改核心代码的情况下扩展 Envoy 的功能。该架构为构建现代 API 网关和服务网格提供了强大的可扩展性基础。

过滤器链架构支持请求解码和响应编码的完整流程,通过过滤器状态管理和延续机制实现高效的处理。

关键优势

  1. 高可扩展性:插件化架构,易于添加新功能

  2. 灵活的过滤器链:请求和响应阶段独立处理

  3. 高效的缓冲管理:支持流式处理和多种缓冲策略

  4. 完整的状态跟踪:详细的请求和响应状态信息

  5. 丰富的内置过滤器:满足常见使用场景

适用场景

  • API 网关实现

  • 服务网格数据平面

  • 微服务架构中的边车代理

  • 负载均衡和流量管理

  • 安全和认证控制

  • 协议转换和适配

Envoy 的过滤器处理架构是其作为现代 API 网关和服务网格代理的核心特性之一,为构建复杂的服务网络提供了强大的基础。通过合理使用和扩展过滤器,可以实现丰富的流量管理、安全控制和可观测性功能。

2. 过滤器管理架构

2.1 FilterManager 类

ruby 复制代码
class FilterManager : public ScopeTrackedObject,                      public FilterChainManager,                      Logger::Loggable<Logger::Id::http>

核心职责:

  • 管理整个过滤器链的生命周期

  • 负责请求解码和响应编码的过滤器迭代

  • 处理过滤器链的创建和销毁

  • 管理缓冲区和状态跟踪

  • 协调过滤器间的数据传递和流程控制

2.2 过滤器链架构

处理阶段说明:

  • 请求解码阶段:处理客户端发来的 HTTP 请求,包括头部、数据和尾部

  • 响应编码阶段:处理向上游服务发送的 HTTP 响应

  • 访问日志阶段:记录请求和响应的详细信息

3. 活动流过滤器基础

3.1 ActiveStreamFilterBase 结构体

ruby 复制代码
struct ActiveStreamFilterBase : public virtual StreamFilterCallbacks,                                Logger::Loggable<Logger::Id::http>

核心功能:

  • 为流解码器和编码器过滤器提供基础包装

  • 负责状态更新和数据存储

  • 处理过滤器迭代和延续逻辑

  • 管理匹配和匹配数据更新

  • 提供缓冲区管理接口

迭代状态管理

perl 复制代码
enum class IterationState {  Continue,            // 迭代未停止  StopSingleIteration, // 停止单次迭代  StopAllBuffer,       // 停止所有迭代并缓冲数据  StopAllWatermark,    // 停止所有迭代并缓冲到高水位};

3.2 活动解码器过滤器

swift 复制代码
struct ActiveStreamDecoderFilter : public ActiveStreamFilterBase,                                   public StreamDecoderFilterCallbacks,                                   LinkedObject<ActiveStreamDecoderFilter>

功能:

  • 包装解码过滤器,处理请求解码

  • 提供解码过滤器回调接口

  • 管理解码过程中的缓冲和状态

  • 支持请求数据的流式处理

3.3 活动编码器过滤器

swift 复制代码
struct ActiveStreamEncoderFilter : public ActiveStreamFilterBase,                                   public StreamEncoderFilterCallbacks,                                   LinkedObject<ActiveStreamEncoderFilter>

功能:

  • 包装编码过滤器,处理响应编码

  • 提供编码过滤器回调接口

  • 管理编码过程中的缓冲和状态

  • 支持响应数据的流式处理

4. 过滤器链创建

4.1 创建流程

cpp 复制代码
bool FilterManager::createFilterChain() {  if (state_.created_filter_chain_) {    return false;  }
  // 检查是否有升级请求  if (upgrade != nullptr) {    const Router::RouteEntry::UpgradeMap* upgrade_map =         filter_manager_callbacks_.upgradeMap();
    if (filter_chain_factory_.createUpgradeFilterChain(            upgrade->value().getStringView(), upgrade_map, *this)) {      filter_manager_callbacks_.upgradeFilterChainCreated();      return true;    }  }
  // 创建默认过滤器链  filter_chain_factory_.createFilterChain(*this);  return true;}

创建时机:

  • 收到第一个请求头部时

  • 检测到协议升级请求时

  • 过滤器链尚未创建时

4.2 过滤器工厂回调

cpp 复制代码
class FilterChainFactoryCallbacksImpl : public Http::FilterChainFactoryCallbacks {public:  void addStreamDecoderFilter(Http::StreamDecoderFilterSharedPtr filter) override;  void addStreamEncoderFilter(Http::StreamEncoderFilterSharedPtr filter) override;  void addStreamFilter(Http::StreamFilterSharedPtr filter) override;  void addAccessLogHandler(AccessLog::InstanceSharedPtr handler) override;  Event::Dispatcher& dispatcher() override;};

回调类型:

  • 解码过滤器:仅处理请求阶段

  • 编码过滤器:仅处理响应阶段

  • 完整过滤器:同时处理请求和响应

  • 访问日志处理器:记录请求/响应信息

5. 请求解码流程

5.1 头部解码

cpp 复制代码
void FilterManager::decodeHeaders(ActiveStreamDecoderFilter* filter,                                   RequestHeaderMap& headers, bool end_stream) {  std::list<ActiveStreamDecoderFilterPtr>::iterator entry =      commonDecodePrefix(filter, FilterIterationStartState::AlwaysStartFromNext);
  for (; entry != decoder_filters_.end(); entry++) {    FilterHeadersStatus status =         (*entry)->decodeHeaders(headers, (*entry)->end_stream_);
    const auto continue_iteration =         (*entry)->commonHandleAfterHeadersCallback(status, end_stream);
    if (!continue_iteration) {      maybeContinueDecoding(continue_data_entry);      return;    }  }
  maybeContinueDecoding(continue_data_entry);}

处理流程:

  1. 确定起始过滤器位置

  2. 遍历解码过滤器链

  3. 调用每个过滤器的 decodeHeaders 方法

  4. 根据返回值决定是否继续迭代

  5. 处理可能的缓冲数据延续

5.2 数据解码

php 复制代码
void FilterManager::decodeData(ActiveStreamDecoderFilter* filter,                               Buffer::Instance& data, bool end_stream,                              FilterIterationStartState filter_iteration_start_state) {  std::list<ActiveStreamDecoderFilterPtr>::iterator entry =      commonDecodePrefix(filter, filter_iteration_start_state);
  for (; entry != decoder_filters_.end(); entry++) {    FilterDataStatus status =         (*entry)->handle_->decodeData(data, (*entry)->end_stream_);
    processNewlyAddedMetadata();
    if (!(*entry)->commonHandleAfterDataCallback(status, data,                                                   state_.decoder_filters_streaming_)) {      break;    }  }}

数据状态处理:

  • Continue:继续处理后续过滤器

  • StopIterationAndBuffer:停止迭代并缓冲数据

  • StopIterationAndWatermark:停止迭代并触发水位控制

5.3 尾部解码

php 复制代码
void FilterManager::decodeTrailers(ActiveStreamDecoderFilter* filter,                                    RequestTrailerMap& trailers) {  std::list<ActiveStreamDecoderFilterPtr>::iterator entry =      commonDecodePrefix(filter, FilterIterationStartState::CanStartFromCurrent);
  for (; entry != decoder_filters_.end(); entry++) {    FilterTrailersStatus status = (*entry)->handle_->decodeTrailers(trailers);
    processNewlyAddedMetadata();
    if (!(*entry)->commonHandleAfterTrailersCallback(status)) {      return;    }  }}
  1. 响应编码流程

6.1 头部编码

cpp 复制代码
void FilterManager::encodeHeaders(ActiveStreamEncoderFilter* filter,                                   ResponseHeaderMap& headers, bool end_stream) {  std::list<ActiveStreamEncoderFilterPtr>::iterator entry =      commonEncodePrefix(filter, end_stream,                         FilterIterationStartState::AlwaysStartFromNext);
  for (; entry != encoder_filters_.end(); entry++) {    FilterHeadersStatus status =         (*entry)->handle_->encodeHeaders(headers, (*entry)->end_stream_);
    const auto continue_iteration =         (*entry)->commonHandleAfterHeadersCallback(status, end_stream);
    if (!continue_iteration) {      maybeContinueEncoding(continue_data_entry);      return;    }  }
  filter_manager_callbacks_.encodeHeaders(headers, modified_end_stream);}

6.2 数据编码

php 复制代码
void FilterManager::encodeData(ActiveStreamEncoderFilter* filter,                               Buffer::Instance& data, bool end_stream,                              FilterIterationStartState filter_iteration_start_state) {  std::list<ActiveStreamEncoderFilterPtr>::iterator entry =      commonEncodePrefix(filter, end_stream, filter_iteration_start_state);
  for (; entry != encoder_filters_.end(); entry++) {    FilterDataStatus status =         (*entry)->handle_->encodeData(data, (*entry)->end_stream_);
    if (!(*entry)->commonHandleAfterDataCallback(status, data,                                                   state_.encoder_filters_streaming_)) {      return;    }  }
  filter_manager_callbacks_.encodeData(data, modified_end_stream);}

6.3 尾部编码

php 复制代码
void FilterManager::encodeTrailers(ActiveStreamEncoderFilter* filter,                                    ResponseTrailerMap& trailers) {  std::list<ActiveStreamEncoderFilterPtr>::iterator entry =      commonEncodePrefix(filter, true,                         FilterIterationStartState::CanStartFromCurrent);
  for (; entry != encoder_filters_.end(); entry++) {    FilterTrailersStatus status = (*entry)->handle_->encodeTrailers(trailers);
    if (!(*entry)->commonHandleAfterTrailersCallback(status)) {      return;    }  }
  filter_manager_callbacks_.encodeTrailers(trailers);}
  1. 过滤器链状态管理

7.1 过滤器调用状态跟踪

cpp 复制代码
struct FilterCallState {  static constexpr uint32_t DecodeHeaders   = 0x01;  static constexpr uint32_t DecodeData      = 0x02;  static constexpr uint32_t DecodeTrailers  = 0x04;  static constexpr uint32_t EncodeHeaders   = 0x08;  static constexpr uint32_t EncodeData      = 0x10;  static constexpr uint32_t EncodeTrailers  = 0x20;  static constexpr uint32_t Encode1xxHeaders  = 0x40;  static constexpr uint32_t LastDataFrame = 0x80;};

状态位说明:

  • 用于跟踪当前正在执行的过滤器操作

  • 防止递归调用和重复处理

  • 支持多个阶段的同时跟踪

7.2 流状态管理

cpp 复制代码
struct State {  uint32_t filter_call_state_{0};  bool remote_encode_complete_ : 1;  bool local_complete_ : 1;  bool has_1xx_headers_ : 1;  bool created_filter_chain_ : 1;  bool is_head_request_ : 1;  bool is_grpc_request_ : 1;  bool non_100_response_headers_encoded_ : 1;  bool under_on_local_reply_ : 1;  bool decoder_filter_chain_aborted_ : 1;  bool encoder_filter_chain_aborted_ : 1;  bool saw_downstream_reset_ : 1;
  bool encoder_filters_streaming_{true};  bool decoder_filters_streaming_{true};  bool destroyed_{false};
  ActiveStreamEncoderFilter* latest_data_encoding_filter_{};  ActiveStreamDecoderFilter* latest_data_decoding_filter_{};};
  1. 过滤器链延续机制

8.1 共同延续方法

javascript 复制代码
void ActiveStreamFilterBase::commonContinue() {  if (!canContinue()) {    return;  }
  // 设置迭代状态  if (stoppedAll()) {    iterate_from_current_filter_ = true;  }  allowIteration();
  // 处理 1xx 响应  if (has1xxHeaders()) {    continued_1xx_headers_ = true;    do1xxHeaders();  }
  // 处理头部  if (!headers_continued_) {    headers_continued_ = true;    doHeaders(complete() && !bufferedData() && !hasTrailers());  }
  // 处理元数据  doMetadata();
  // 处理数据  if (bufferedData()) {    doData(complete() && !had_trailers_before_data);  }
  // 处理尾部  if (had_trailers_before_data) {    doTrailers();  }
  iterate_from_current_filter_ = false;}

8.2 过滤器回调处理

php 复制代码
bool ActiveStreamFilterBase::commonHandleAfterHeadersCallback(    FilterHeadersStatus status, bool end_stream) {  if (status == FilterHeadersStatus::StopIteration) {    iteration_state_ = IterationState::StopSingleIteration;    return false;  } else if (status == FilterHeadersStatus::Continue) {    headers_continued_ = true;    return true;  }  // 处理其他状态  return true;}
bool ActiveStreamFilterBase::commonHandleAfterDataCallback(    FilterDataStatus status, Buffer::Instance& provided_data,     bool& buffer_was_streaming) {  if (status == FilterDataStatus::Continue) {    if (iteration_state_ == IterationState::StopSingleIteration) {      commonHandleBufferData(provided_data);      commonContinue();      return false;    }  } else {    iteration_state_ = IterationState::StopSingleIteration;    if (status == FilterDataStatus::StopIterationAndBuffer ||        status == FilterDataStatus::StopIterationAndWatermark) {      buffer_was_streaming = status == FilterDataStatus::StopIterationAndWatermark;      commonHandleBufferData(provided_data);    }    return false;  }  return true;}
  1. 本地响应处理
php 复制代码
void FilterManager::sendLocalReply(    Code code, absl::string_view body,    const std::function<void(ResponseHeaderMap& headers)>& modify_headers,    const absl::optional<Grpc::Status::GrpcStatus> grpc_status,    absl::string_view details) {
  // 停止过滤器链迭代  if (state_.filter_call_state_ & (FilterCallState::DecodeHeaders |                                    FilterCallState::DecodeData |                                   FilterCallState::DecodeTrailers)) {    state_.decoder_filter_chain_aborted_ = true;  } else if (state_.filter_call_state_ &             (FilterCallState::EncodeHeaders | FilterCallState::EncodeData |              FilterCallState::EncodeTrailers)) {    state_.encoder_filter_chain_aborted_ = true;  }
  // 发送响应  if (!filter_manager_callbacks_.responseHeaders().has_value()) {    sendLocalReplyViaFilterChain(state_.is_grpc_request_, code, body, modify_headers,                                state_.is_head_request_, grpc_status, details);  } else if (!state_.non_100_response_headers_encoded_) {    sendDirectLocalReply(code, body, modify_headers, state_.is_head_request_, grpc_status);  } else {    filter_manager_callbacks_.resetStream();  }}

本地响应场景:

  • 过滤器检测到错误条件

  • 速率限制触发

  • 认证失败

  • 健康检查响应

10. 缓冲区和水位管理

10.1 缓冲区管理

javascript 复制代码
Buffer::InstancePtr ActiveStreamDecoderFilter::createBuffer() {  auto buffer = dispatcher().getWatermarkFactory().createBuffer(      [this]() -> void { this->requestDataDrained(); },      [this]() -> void { this->requestDataTooLarge(); },      []() -> void { /* 处理溢出水位 */ });  buffer->setWatermarks(parent_.buffer_limit_);  return buffer;}

10.2 水位回调

php 复制代码
void ActiveStreamDecoderFilter::requestDataTooLarge() {  if (parent_.state_.decoder_filters_streaming_) {    onDecoderFilterAboveWriteBufferHighWatermark();  } else {    parent_.filter_manager_callbacks_.onRequestDataTooLarge();    sendLocalReply(Code::PayloadTooLarge,                    CodeUtility::toString(Code::PayloadTooLarge),                    nullptr, absl::nullopt,                    StreamInfo::ResponseCodeDetails::get().RequestPayloadTooLarge);  }}

水位管理策略:

  • 低水位:缓冲区数据被处理,可以继续接收数据

  • 高水位:缓冲区达到限制,停止接收数据

  • 溢出:缓冲区超过限制,触发错误响应

11. 常见过滤器实现

11.1 路由过滤器(Router Filter)

路由过滤器是 Envoy 中最常用的 HTTP 过滤器,实现了 HTTP 请求的转发功能。

类型 URLtype.googleapis.com/envoy.extensions.filters.http.router.v3.Router

核心功能

  • HTTP 转发和重定向

  • 请求重试机制

  • 响应处理和缓冲

  • 路由相关策略实现

统计指标

  • http.<stat_prefix>.no_route:无路由匹配的请求数

  • http.<stat_prefix>.no_cluster:无集群可用的请求数

  • http.<stat_prefix>.rq_redirect:重定向的请求数

  • http.<stat_prefix>.rq_direct_response:直接响应的请求数

配置示例

bash 复制代码
- name: envoy.filters.http.router  typed_config:    "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router    dynamic_stats: true    suppress_envoy_headers: false    start_child_span: true

11.2 健康检查过滤器(Health Check Filter)

健康检查过滤器提供简单的健康状态检查功能。

类型 URLtype.googleapis.com/envoy.extensions.filters.http.health_check.v3.HealthCheck

管理端点

  • /healthcheck/fail:将健康状态设置为失败

  • /healthcheck/ok:恢复健康状态

配置示例

bash 复制代码
- name: envoy.filters.http.health_check  typed_config:    "@type": type.googleapis.com/envoy.extensions.filters.http.health_check.v3.HealthCheck    pass_through_mode: false    endpoint:      path: "/healthz"    cache_time: 0s

11.3 速率限制过滤器(Rate Limit Filter)

速率限制过滤器实现了请求速率限制功能。

类型 URLtype.googleapis.com/envoy.extensions.filters.http.ratelimit.v3.RateLimit

速率限制动作类型

  • source_cluster:基于源集群限制

  • destination_cluster:基于目标集群限制

  • remote_address:基于远程地址限制

  • generic_key:基于通用键值限制

  • header_value_match:基于头部值匹配限制

配置示例

bash 复制代码
- name: envoy.filters.http.ratelimit  typed_config:    "@type": type.googleapis.com/envoy.extensions.filters.http.ratelimit.v3.RateLimit    domain: "httpbin"    stage: 0    request_type: "both"    rate_limiter:      name: "envoy.ratelimit"      typed_config:        "@type": type.googleapis.com/envoy.extensions.common.ratelimit.v3.RateLimitServiceConfig        grpc_service:          envoy_grpc:            cluster_name: "ratelimit"

11.4 压缩过滤器(Compressor Filter)

压缩过滤器使 Envoy 能够在客户端请求时压缩来自上游服务的数据。

类型 URLtype.googleapis.com/envoy.extensions.filters.http.compressor.v3.Compressor

支持的压缩算法

  • gzipenvoy.extensions.compression.gzip.compressor.v3.Gzip

  • brotlienvoy.extensions.compression.brotli.compressor.v3.Brotli

  • zstdenvoy.extensions.compression.zstd.compressor.v3.Zstd

压缩条件

  • 响应内容长度 >= 最小长度配置

  • 内容类型在允许列表中

  • 客户端 Accept-Encoding 头部包含支持的算法

  • 没有 Content-Encoding 头部

配置示例

bash 复制代码
- name: envoy.filters.http.compressor  typed_config:    "@type": type.googleapis.com/envoy.extensions.filters.http.compressor.v3.Compressor    response_direction_config:      common_config:        min_content_length: 100        content_type:          - text/html          - application/json      disable_on_etag_header: true    compressor_library:      name: text_optimized      typed_config:        "@type": type.googleapis.com/envoy.extensions.compression.gzip.compressor.v3.Gzip        memory_level: 3        window_bits: 10        compression_level: BEST_COMPRESSION

11.5 外部授权过滤器(External Authorization Filter)

外部授权过滤器调用外部 gRPC 或 HTTP 服务来检查传入的 HTTP 请求是否被授权。

类型 URLtype.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthz

支持的协议

  • gRPC:与外部授权服务器通信(推荐)

  • HTTP:与原始 HTTP 服务器通信

gRPC 配置示例

bash 复制代码
- name: envoy.filters.http.ext_authz  typed_config:    "@type": type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthz    grpc_service:      envoy_grpc:        cluster_name: ext-authz      timeout: 0.5s    include_peer_certificate: true    with_request_body:      max_request_bytes: 1024      allow_partial_message: true

11.6 JWT 认证过滤器(JWT Authn Filter)

JWT 认证过滤器提供了 JSON Web Token(JWT)的认证和验证功能。

类型 URLtype.googleapis.com/envoy.extensions.filters.http.jwt_authn.v3.JwtAuthentication

配置示例

python 复制代码
- name: envoy.filters.http.jwt_authn  typed_config:    "@type": type.googleapis.com/envoy.extensions.filters.http.jwt_authn.v3.JwtAuthentication    providers:      my_jwt_provider:        issuer: "https://example.com"        local_jwks:          inline_string: |            {              "keys": [                {                  "kty": "RSA",                  "e": "AQAB",                  "n": "..."                }              ]            }    rules:      - match:          prefix: "/api"        requires:          provider_name: my_jwt_provider

11.7 gRPC 相关过滤器

gRPC 统计过滤器

  • 类型 URL:type.googleapis.com/envoy.extensions.filters.http.grpc_stats.v3.FilterConfig

  • 功能:收集 gRPC 调用的详细统计信息

gRPC Web 过滤器

  • 类型 URL:type.googleapis.com/envoy.extensions.filters.http.grpc_web.v3.GrpcWeb

  • 功能:支持 gRPC Web 协议,允许浏览器直接调用 gRPC 服务

gRPC JSON 转码过滤器

  • 类型 URL:type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder

  • 功能:将 JSON API 请求转换为 gRPC 调用

11.8 其他重要过滤器

CORS 过滤器

  • 实现跨源资源共享(CORS)支持和验证

  • 配置允许的源、方法和头部

  • 支持预检请求处理

缓冲区过滤器

  • 提供请求和响应的缓冲功能

  • 防止下游客户端接收响应过快导致的资源耗尽

故障注入过滤器

  • 允许在 HTTP 请求/响应路径中注入故障

  • 支持延迟注入和错误响应注入

  • 用于测试系统的弹性

Lua 过滤器

  • 通过 Lua 脚本定制 Envoy 行为

  • 访问和修改 HTTP 头部和请求/响应体

12. 过滤器开发最佳实践

12.1 过滤器实现要点

cpp 复制代码
class MyCustomFilter : public StreamFilterBase,                       public StreamDecoderFilter,                       public StreamEncoderFilter {public:  // 请求处理  FilterHeadersStatus decodeHeaders(RequestHeaderMap& headers,                                     bool end_stream) override {    // 处理请求头部    // 注意事项:    // 1. 避免长时间操作    // 2. 只在必要时缓冲数据    // 3. 正确返回状态码    return FilterHeadersStatus::Continue;  }
  FilterDataStatus decodeData(Buffer::Instance& data,                               bool end_stream) override {    // 处理请求数据    // 数据可能是分块的,需要注意完整性    return FilterDataStatus::Continue;  }
  FilterTrailersStatus decodeTrailers(RequestTrailerMap& trailers) override {    // 处理请求尾部    return FilterTrailersStatus::Continue;  }
  // 响应处理  FilterHeadersStatus encodeHeaders(ResponseHeaderMap& headers,                                     bool end_stream) override {    // 处理响应头部    return FilterHeadersStatus::Continue;  }
  FilterDataStatus encodeData(Buffer::Instance& data,                               bool end_stream) override {    // 处理响应数据    return FilterDataStatus::Continue;  }
  FilterTrailersStatus encodeTrailers(ResponseTrailerMap& trailers) override {    // 处理响应尾部    return FilterTrailersStatus::Continue;  }};

12.2 过滤器配置工厂

cpp 复制代码
class MyCustomFilterConfigFactory : public NamedHttpFilterConfigFactory {public:  HttpFilterFactoryCb createFilterFactoryFromProto(      const Protobuf::Message& proto_config,       const std::string&,      Server::Configuration::FactoryContext& context) override {
    const auto& config = dynamic_cast<const MyCustomFilterConfig&>(proto_config);
    return [config](Http::FilterChainFactoryCallbacks& callbacks) {      callbacks.addStreamFilter(std::make_shared<MyCustomFilter>(config));    };  }
  ProtobufTypes::MessagePtr createEmptyConfigProto() override {    return std::make_unique<MyCustomFilterConfig>();  }
  std::string name() const override { return "my_custom_filter"; }};

12.3 性能优化建议

避免不必要的缓冲

php 复制代码
// 错误做法:总是缓冲FilterDataStatus decodeData(Buffer::Instance& data, bool end_stream) {  return FilterDataStatus::StopIterationAndBuffer;}
// 正确做法:按需缓冲FilterDataStatus decodeData(Buffer::Instance& data, bool end_stream) {  if (needToProcessLater(data)) {    return FilterDataStatus::StopIterationAndBuffer;  }  return FilterDataStatus::Continue;}

优化过滤器顺序:

makefile 复制代码
# 优化前:效率低下http_filters:- name: envoy.filters.http.router- name: envoy.filters.http.ratelimit- name: envoy.filters.http.health_check
# 优化后:快速失败优先http_filters:- name: envoy.filters.http.health_check  # 快速拒绝不健康请求- name: envoy.filters.http.ratelimit     # 提前进行速率限制- name: envoy.filters.http.router        # 最后处理路由

12.4 错误处理

cpp 复制代码
class RobustFilter : public StreamDecoderFilter {public:  FilterHeadersStatus decodeHeaders(RequestHeaderMap& headers,                                     bool end_stream) override {    try {      // 可能抛出异常的操作      processHeaders(headers);      return FilterHeadersStatus::Continue;    } catch (const std::exception& e) {      // 发送本地错误响应      decoder_callbacks_->sendLocalReply(          Http::Code::InternalServerError,           "Internal Error", nullptr, absl::nullopt,           "filter.processing_error");      return FilterHeadersStatus::StopIteration;    }  }};
  1. 性能优化

13.1 缓冲区策略优化

bash 复制代码
http_connection_manager:  http_filters:  - name: envoy.filters.http.router    typed_config:      "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router      dynamic_stats: true      suppress_envoy_headers: false  stream_idle_timeout: 300s  request_timeout: 60s  # 缓冲区配置  buffer_limit: 1048576  # 1MB

13.2 并发处理优化

  • 使用异步处理避免阻塞

  • 合理设置线程池大小

  • 利用连接池复用连接

  • 启用 HTTP/2 多路复用

13.3 内存管理优化

  • 及时释放不再使用的缓冲区

  • 使用对象池减少内存分配

  • 避免不必要的数据拷贝

  • 合理设置缓冲区大小限制

14. 监控与调试

14.1 关键监控指标

过滤器执行指标

  • 过滤器执行时间分布

  • 过滤器拒绝率

  • 缓冲区使用率

  • 过滤器链长度

系统资源指标

  • CPU 使用率

  • 内存使用量

  • 网络 I/O

  • 文件描述符使用

14.2 调试方法

启用调试日志

apache 复制代码
# 在 Envoy 配置中启用调试级别日志admin:  access_log_path: /tmp/admin_access.log  address:    socket_address:      address: 127.0.0.1      port_value: 9901
# 动态调整日志级别# curl -X POST http://localhost:9901/logging?filter=debug

使用追踪功能:

  • 启用请求追踪

  • 分析过滤器执行时间

  • 定位性能瓶颈

相关推荐
Olivia051405143 小时前
Voohu:音频变压器的屏蔽接地技术对50Hz工频噪声抑制的影响
网络·机器人·信息与通信
byoass3 小时前
智巢AI知识库深度解析:企业文档管理从大海捞针到精准狙击的进化之路
开发语言·网络·人工智能·安全·c#·云计算
zhihuishuxia__4 小时前
Multiplex通讯(多路复用通讯)
网络·图像处理·数码相机·计算机视觉·自动化
勤劳的进取家4 小时前
数据链路层基础
网络·学习·算法
ZenosDoron4 小时前
虚拟机软件(如 VirtualBox、VMware)通常提供三种主要的网络模式
网络·智能路由器
乌托邦的逃亡者4 小时前
CentOS/Openeuler主机中,为一个网卡设置多个IP地址
linux·运维·网络·tcp/ip·centos
@insist1234 小时前
信息安全工程师核心考点:物理与环境安全(下篇)
网络·安全·软考·信息安全工程师·软件水平考试
念一不念二4 小时前
硬件通信协议
网络
刘马想放假4 小时前
GRE 隧道深度解析:从协议原理到生产实践
网络协议·安全