Envoy 使用的设计模式技术文档

1. 概述

Envoy 是一个高性能的开源边缘和服务代理,其代码库中大量使用了经典的设计模式。这些模式使得 Envoy 具备了高度的可扩展性、可维护性和灵活性。本文档整理了 Envoy 中使用的主要设计模式及其实现细节,旨在帮助开发人员理解 Envoy 的架构设计,并为扩展开发提供参考。

Envoy 通过合理运用各种设计模式,实现了:

  1. 高度可扩展性:通过工厂模式和插件架构,可以轻松添加新的过滤器和扩展,无需修改核心代码

  2. 高性能:通过线程本地存储和反应器模式,实现了高并发、低延迟的处理能力

  3. 可维护性:通过分层架构和清晰的设计模式,代码结构清晰,职责分明

  4. 灵活性:通过策略模式和责任链模式,可以灵活组合功能,满足不同场景需求

  5. 可靠性:通过状态模式和观察者模式,确保了系统的稳定运行和正确状态转换

Envoy 通过合理运用设计模式,实现了以下核心非功能性需求:

需求 实现方式
可扩展性 工厂模式 + 插件架构
高性能 线程本地存储 + 反应器模式
可维护性 分层架构 + 清晰的设计模式
灵活性 策略模式 + 责任链模式
可靠性 状态模式 + 观察者模式

2. 创建型模式

创建型模式抽象了对象的实例化过程,Envoy 使用这些模式来解耦对象的创建和使用。

2.1 工厂模式 (Factory Pattern)

工厂模式是 Envoy 最核心的设计模式之一,用于创建各种扩展组件。Envoy 实现了分层级的工厂体系。

2.1.1 简单工厂

基础工厂接口用于创建特定类型的组件:

php 复制代码
// 文件位置: envoy/network/client_connection_factory.hclass ClientConnectionFactory {public:  virtual ~ClientConnectionFactory() = default;
  virtual Network::ConnectionHandlePtr  createConnection(Event::Dispatcher& dispatcher,                    const Address::InstanceConstSharedPtr& address,                   Address::InstanceConstSharedPtr& source_address,                   TransportSocketPtr&& transport_socket,                   const StreamInfo::StreamInfo& stream_info,                   Network::TransportSocketOptionsConstSharedPtr transport_socket_options) PURE;};

2.1.2 抽象工厂

Envoy 通过 FactoryRegistry 实现了完整的插件化扩展机制:

cpp 复制代码
// 文件位置: envoy/registry/registry.htemplate <class Base> class FactoryRegistry {public:  static void registerFactory(Base& factory, absl::string_view name);  static Base* getFactory(absl::string_view name);  static absl::flat_hash_map<std::string, Base*>& factories();
private:  static absl::flat_hash_map<std::string, Base*>* factories_;};
// 自动注册模板类template <class T, class Base> class RegisterFactory {public:  RegisterFactory() {    FactoryRegistry<Base>::registerFactory(instance_, instance_.name());  }
private:  T instance_{};};

使用示例:

cpp 复制代码
// 1. 定义工厂基类class NamedNetworkFilterConfigFactory : public Config::TypedFactory {public:  ~NamedNetworkFilterConfigFactory() override = default;  std::string category() const override { return "envoy.network.filters"; }};
// 2. 实现具体工厂class MyFilterFactory : public NamedNetworkFilterConfigFactory {public:  std::string name() const override { return "my_filter"; }
  Network::FilterFactoryCb createFilterFactoryFromProto(      const Protobuf::Message& proto_config,      Server::Configuration::FactoryContext& context) override {    return [context](Network::FilterManager& filter_manager) {      filter_manager.addFilter(std::make_shared<MyFilter>(context));    };  }
  ProtobufTypes::MessagePtr createEmptyConfigProto() override {    return std::make_unique<MyFilterConfig>();  }};
// 3. 静态注册(编译时自动注册)REGISTER_FACTORY(MyFilterFactory, NamedNetworkFilterConfigFactory);

工厂注册的生命周期:

makefile 复制代码
编译时: REGISTER_FACTORY 宏创建静态对象   ↓静态初始化: RegisterFactory 构造函数调用 registerFactory   ↓运行时: 配置加载时调用 getFactory(name) 获取工厂   ↓使用: 工厂创建具体的过滤器实例

2.1.3 工厂方法模式

在过滤器链创建过程中使用工厂方法:

cpp 复制代码
// 文件位置: envoy/http/filter.husing FilterFactoryCb = std::function<void(FilterChainFactoryCallbacks& callbacks)>;
class FilterChainFactory {public:  virtual ~FilterChainFactory() = default;
  virtual void createFilterChain(FilterChainManager& manager) PURE;
  virtual bool createUpgradeFilterChain(absl::string_view upgrade,                                        const UpgradeMap* per_route_upgrade_map,                                        FilterChainManager& manager) PURE;};

2.2 单例模式 (Singleton Pattern)

Envoy 实现了自己的单例管理器来管理全局单例,支持延迟初始化和线程安全的访问。

cpp 复制代码
// 文件位置: envoy/singleton/manager.hclass Manager {public:  virtual ~Manager() = default;
  template <class T>  std::shared_ptr<T> getTyped(const std::string& name, SingletonFactoryCb cb) {    return std::dynamic_pointer_cast<T>(get(name, cb));  }
  virtual InstanceSharedPtr get(const std::string& name, SingletonFactoryCb cb) PURE;};
// 单例注册宏#define SINGLETON_MANAGER_REGISTRATION(NAME)                                                       \  static constexpr char NAME##_singleton_name[] = #NAME "_singleton";                              \  static Envoy::Registry::RegisterInternalFactory<                                                 \      Envoy::Singleton::RegistrationImpl<NAME##_singleton_name>, Envoy::Singleton::Registration>   \      NAME##_singleton_registered_;

使用示例:

cpp 复制代码
// 1. 注册单例类型SINGLETON_MANAGER_REGISTRATION(my_singleton);
// 2. 获取单例实例auto singleton = singleton_manager.getTyped<MySingleton>(    SINGLETON_MANAGER_REGISTERED_NAME(my_singleton),    []() { return std::make_shared<MySingleton>(); });

单例生命周期管理:

nginx 复制代码
Server 启动   ↓SingletonManager 初始化   ↓首次 getTyped() 调用 → 执行工厂回调创建实例   ↓后续调用返回缓存的实例   ↓Server 关闭 → 单例随 Server 销毁

2.3 建造者模式 (Builder Pattern)

在配置构建过程中使用建造者模式创建复杂对象:

cpp 复制代码
// 示例:监听器建造者class ListenerBuilder {public:  ListenerBuilder& withName(absl::string_view name);  ListenerBuilder& withAddress(Address::InstanceConstSharedPtr address);  ListenerBuilder& withFilterChain(FilterChainPtr filter_chain);  ListenerBuilder& withSocketOptions(SocketOptions options);  ListenerBuilder& withConnectionLimit(uint32_t limit);  ListenerPtr build();};
// 使用示例auto listener = ListenerBuilder()    .withName("http_listener")    .withAddress(address)    .withFilterChain(http_filter_chain)    .withConnectionLimit(10000)    .build();

3. 结构型模式

结构型模式关注如何组合类和对象形成更大的结构。

3.1 适配器模式 (Adapter Pattern)

适配器模式用于在不兼容的接口之间建立桥梁:

cpp 复制代码
// 将 HTTP 过滤器适配为网络过滤器class NetworkFilterAdapter : public Network::ReadFilter {public:  explicit NetworkFilterAdapter(Http::StreamFilterSharedPtr http_filter)      : http_filter_(http_filter) {}
  Network::FilterStatus onData(Buffer::Instance& data, bool end_stream) override {    // 将网络数据适配为 HTTP 流数据    http_filter_->decodeData(data, end_stream);    return Network::FilterStatus::Continue;  }
  Network::FilterStatus onNewConnection() override {    // 适配为 HTTP 流开始    return Network::FilterStatus::Continue;  }
private:  Http::StreamFilterSharedPtr http_filter_;};

典型使用场景:将 HTTP 级别的过滤器复用到网络过滤器链中。

3.2 装饰器模式 (Decorator Pattern)

过滤器链本质上是装饰器模式的经典实现,每个过滤器装饰了流的处理逻辑:

cpp 复制代码
// 每个过滤器装饰处理逻辑class BufferFilter : public Http::StreamDecoderFilter {public:  FilterHeadersStatus decodeHeaders(RequestHeaderMap& headers, bool end_stream) override {    // 装饰:添加缓冲逻辑    return FilterHeadersStatus::Continue;  }
  FilterDataStatus decodeData(Buffer::Instance& data, bool end_stream) override {    // 装饰:缓冲数据而不是立即转发    buffer_.add(data);    if (buffer_.length() >= min_buffer_size_ || end_stream) {      return FilterDataStatus::Continue;    }    return FilterDataStatus::StopIterationAndBuffer;  }
private:  Buffer::OwnedImpl buffer_;  uint32_t min_buffer_size_;};

3.3 代理模式 (Proxy Pattern)

Envoy 本身就是一个代理,其内部也大量使用代理模式:

cpp 复制代码
// 上游请求代理class UpstreamRequest : public Http::StreamCallbacks {public:  void encodeHeaders(RequestHeaderMap& headers, bool end_stream) override {    // 代理:将请求头转发到上游连接    if (upstream_stream_) {      upstream_stream_->encodeHeaders(headers, end_stream);    }  }
  void encodeData(Buffer::Instance& data, bool end_stream) override {    // 代理:将数据转发到上游    if (upstream_stream_) {      upstream_stream_->encodeData(data, end_stream);    }  }
private:  Http::StreamEncoder* upstream_stream_{nullptr};};

3.4 桥接模式 (Bridge Pattern)

桥接模式用于分离抽象和实现,Envoy 在传输层使用此模式:

cs 复制代码
// 抽象:传输 Socket 接口class TransportSocket {public:  virtual ~TransportSocket() = default;  virtual void setTransportSocketCallbacks(TransportSocketCallbacks& callbacks) PURE;  virtual void doRead(Buffer::Instance& read_buffer) PURE;  virtual void doWrite(Buffer::Instance& write_buffer, bool end_stream) PURE;  virtual void close() PURE;};
// 实现 A:普通 TCP Socketclass TcpSocket : public TransportSocket {public:  void doRead(Buffer::Instance& read_buffer) override {    // TCP 实现:从 socket fd 读取    ssize_t len = recv(fd_, buffer, size, 0);    read_buffer.add(buffer, len);  }};
// 实现 B:TLS Socketclass SslSocket : public TransportSocket {public:  void doRead(Buffer::Instance& read_buffer) override {    // TLS 实现:通过 SSL_read 解密读取    int ret = SSL_read(ssl_, buffer, size);    read_buffer.add(buffer, ret);  }};

3.5 组合模式 (Composite Pattern)

过滤器链使用组合模式将多个过滤器组合为统一结构:

cpp 复制代码
class FilterManager {public:  void addDecoderFilter(StreamDecoderFilterSharedPtr filter) {    decoder_filters_.push_back(std::make_shared<ActiveDecoderFilter>(filter));  }
  void addEncoderFilter(StreamEncoderFilterSharedPtr filter) {    encoder_filters_.push_back(std::make_shared<ActiveEncoderFilter>(filter));  }
  // 组合操作:递归调用所有过滤器  FilterHeadersStatus decodeHeaders(RequestHeaderMap& headers, bool end_stream) {    for (auto& filter : decoder_filters_) {      auto status = filter->decodeHeaders(headers, end_stream);      if (status != FilterHeadersStatus::Continue) {        return status;      }    }    return FilterHeadersStatus::Continue;  }
private:  std::vector<ActiveDecoderFilterPtr> decoder_filters_;  std::vector<ActiveEncoderFilterPtr> encoder_filters_;};

4. 行为型模式

行为型模式关注算法和对象间职责的分配。

4.1 观察者模式 (Observer Pattern)

Envoy 广泛使用观察者模式进行事件通知和回调管理:

cpp 复制代码
// 文件位置: envoy/server/lifecycle_notifier.hclass ServerLifecycleNotifier {public:  enum class Stage {     Startup,      // 服务启动阶段    PostInit,     // 初始化后阶段    ShutdownExit  // 关闭退出阶段  };
  using StageCallback = std::function<void()>;  using HandlePtr = std::unique_ptr<Handle>;
  virtual HandlePtr registerCallback(Stage stage, StageCallback callback) PURE;};
// 连接事件观察者class ConnectionCallbacks {public:  virtual ~ConnectionCallbacks() = default;  virtual void onEvent(ConnectionEvent event) PURE;  virtual void onAboveWriteBufferHighWatermark() PURE;  virtual void onBelowWriteBufferLowWatermark() PURE;};

使用示例:

cpp 复制代码
// 注册服务生命周期观察者class MyComponent {public:  void registerLifecycleNotifications(ServerLifecycleNotifier& notifier) {    startup_handle_ = notifier.registerCallback(        ServerLifecycleNotifier::Stage::Startup,        [this]() { this->onServerStartup(); });
    shutdown_handle_ = notifier.registerCallback(        ServerLifecycleNotifier::Stage::ShutdownExit,        [this]() { this->onServerShutdown(); });  }
private:  void onServerStartup() { /* 启动逻辑 */ }  void onServerShutdown() { /* 清理逻辑 */ }
  ServerLifecycleNotifier::HandlePtr startup_handle_;  ServerLifecycleNotifier::HandlePtr shutdown_handle_;};

4.2 策略模式 (Strategy Pattern)

策略模式用于实现可插拔的算法:

cpp 复制代码
// 文件位置: envoy/common/backoff_strategy.hclass BackOffStrategy {public:  virtual ~BackOffStrategy() = default;  virtual uint64_t nextBackOffMs() PURE;  virtual void reset() PURE;};
// 具体策略 1:指数退避class ExponentialBackOffStrategy : public BackOffStrategy {public:  ExponentialBackOffStrategy(uint64_t base_interval_ms, uint64_t max_interval_ms)      : base_interval_ms_(base_interval_ms),        max_interval_ms_(max_interval_ms),        current_interval_ms_(base_interval_ms) {}
  uint64_t nextBackOffMs() override {    uint64_t backoff = current_interval_ms_;    current_interval_ms_ = std::min(current_interval_ms_ * 2, max_interval_ms_);    return backoff;  }
  void reset() override {    current_interval_ms_ = base_interval_ms_;  }
private:  const uint64_t base_interval_ms_;  const uint64_t max_interval_ms_;  uint64_t current_interval_ms_;};
// 具体策略 2:固定间隔退避class FixedBackOffStrategy : public BackOffStrategy {public:  explicit FixedBackOffStrategy(uint64_t interval_ms) : interval_ms_(interval_ms) {}
  uint64_t nextBackOffMs() override { return interval_ms_; }  void reset() override {}
private:  const uint64_t interval_ms_;};

负载均衡策略示例:

kotlin 复制代码
// 负载均衡策略接口class LoadBalancer {public:  virtual HostConstSharedPtr chooseHost(const HostSet& hosts) PURE;};
// 轮询策略class RoundRobinLoadBalancer : public LoadBalancer { /* ... */ };
// 最少连接策略class LeastRequestLoadBalancer : public LoadBalancer { /* ... */ };
// 一致性哈希策略class ConsistentHashLoadBalancer : public LoadBalancer { /* ... */ };

4.3 责任链模式 (Chain of Responsibility Pattern)

Envoy 的过滤器链是责任链模式的完美体现:

cpp 复制代码
// 文件位置: envoy/http/filter.henum class FilterHeadersStatus {  Continue,                    // 继续执行链中的下一个过滤器  StopIteration,               // 停止执行,不再传递给后续过滤器  StopAllIterationAndBuffer,   // 停止并缓冲数据};
class StreamDecoderFilter {public:  virtual FilterHeadersStatus decodeHeaders(RequestHeaderMap& headers, bool end_stream) PURE;  virtual FilterDataStatus decodeData(Buffer::Instance& data, bool end_stream) PURE;  virtual FilterTrailersStatus decodeTrailers(RequestTrailerMap& trailers) PURE;};
// 过滤器链处理class FilterChain {public:  void decodeHeaders(RequestHeaderMap& headers, bool end_stream) {    for (auto& filter : filters_) {      auto status = filter->decodeHeaders(headers, end_stream);
      switch (status) {        case FilterHeadersStatus::Continue:          continue;  // 继续传递给下一个过滤器
        case FilterHeadersStatus::StopIteration:          return;    // 停止链的执行
        case FilterHeadersStatus::StopAllIterationAndBuffer:          buffering_ = true;          return;      }    }  }
private:  std::vector<StreamDecoderFilterPtr> filters_;  bool buffering_{false};};

过滤器链执行流程图:

powershell 复制代码
请求 → Filter1.decodeHeaders() → Filter2.decodeHeaders() → ... → FilterN.decodeHeaders()         │                            │         ├─ Continue ─────────────────┤         ├─ StopIteration → 停止转发         └─ StopAndBuffer → 缓冲后异步处理

4.4 命令模式 (Command Pattern)

使用命令模式封装异步操作:

cpp 复制代码
// 命令接口using PostCb = std::function<void()>;class Dispatcher {public:  virtual void post(PostCb callback) PURE;  virtual void defer(PostCb callback) PURE;};// 使用示例class AsyncOperation {public:  void execute(Dispatcher& dispatcher) {    dispatcher.post([this]() {      // 在目标线程执行的操作      this->doWork();    });  }private:  void doWork() { /* 实际工作 */ }};

4.5 状态模式 (State Pattern)

管理连接和请求的状态转换:

php 复制代码
// 连接状态机class ConnectionImpl {public:  enum class State {    Connecting,   // 连接中    Connected,    // 已连接    Draining,     // 排空中    Closed        // 已关闭  };  void onConnected() {    if (state_ == State::Connecting) {      state_ = State::Connected;      notifyConnected();    }  }  void onRemoteClose() {    if (state_ == State::Connected || state_ == State::Draining) {      state_ = State::Closed;      notifyRemoteClosed();    }  }  void close() {    if (state_ == State::Connecting || state_ == State::Connected) {      state_ = State::Draining;      initiateGracefulClose();    }  }private:  State state_{State::Connecting};};

4.6 模板方法模式 (Template Method Pattern)

定义算法骨架,让子类实现具体步骤:

cpp 复制代码
// 基类定义模板方法class ConnectionImplBase {public:  // 模板方法:定义了关闭连接的算法骨架  void close(ConnectionCloseType type) {    // 1. 前置处理    onPreClose();
    // 2. 执行具体关闭(由子类实现)    doClose(type);
    // 3. 清理资源    releaseResources();
    // 4. 后置处理    onPostClose();  }
protected:  virtual void onPreClose() {}                    // 钩子方法(可选覆盖)  virtual void doClose(ConnectionCloseType type) PURE;  // 抽象方法(必须实现)  virtual void onPostClose() {}                   // 钩子方法(可选覆盖)
private:  void releaseResources() {    // 通用清理逻辑    read_buffer_.drain(read_buffer_.length());    write_buffer_.drain(write_buffer_.length());  }
  Buffer::Instance read_buffer_;  Buffer::Instance write_buffer_;};

4.7 访问者模式 (Visitor Pattern)

用于 Protobuf 消息验证,分离验证算法和数据结构:

cpp 复制代码
// 文件位置: envoy/protobuf/message_validator.hclass ValidationVisitor {public:  virtual ~ValidationVisitor() = default;
  virtual void onUnknownField(absl::string_view description) PURE;  virtual void onDeprecatedField(absl::string_view description, bool soft_deprecation) PURE;  virtual void onWorkInProgress(absl::string_view description) PURE;};
// 严格模式访问者class StrictValidationVisitor : public ValidationVisitor {public:  void onUnknownField(absl::string_view description) override {    throw EnvoyException(fmt::format("Unknown field: {}", description));  }
  void onDeprecatedField(absl::string_view description, bool soft_deprecation) override {    if (!soft_deprecation) {      throw EnvoyException(fmt::format("Deprecated field: {}", description));    }  }
  void onWorkInProgress(absl::string_view description) override {    throw EnvoyException(fmt::format("WIP feature: {}", description));  }};
// 宽松模式访问者class LenientValidationVisitor : public ValidationVisitor {public:  void onUnknownField(absl::string_view description) override {    ENVOY_LOG(warn, "Unknown field: {}", description);  }
  void onDeprecatedField(absl::string_view description, bool soft_deprecation) override {    ENVOY_LOG(warn, "Deprecated field: {}", description);  }
  void onWorkInProgress(absl::string_view description) override {    ENVOY_LOG(info, "WIP feature: {}", description);  }};

4.8 中介者模式 (Mediator Pattern)

ClusterManager 作为中介者协调多个组件:

cpp 复制代码
class ClusterManager {public:  virtual ~ClusterManager() = default;
  // 集群管理  virtual Upstream::ClusterInfoConstSharedPtr getCluster(absl::string_view cluster) PURE;  virtual ThreadLocalCluster* getThreadLocalCluster(absl::string_view cluster) PURE;  virtual bool addOrUpdateCluster(const envoy::config::cluster::v3::Cluster& cluster,                                  const std::string& version_info) PURE;
  // HTTP 连接池管理  virtual Http::ConnectionPool::Instance* httpConnPoolForCluster(absl::string_view cluster) PURE;
  // TCP 连接池管理  virtual Tcp::ConnectionPool::Instance* tcpConnPoolForCluster(absl::string_view cluster) PURE;
  // CDS 回调  virtual void setPrimaryClustersInitializedCb(std::function<void()> callback) PURE;};

中介者模式交互图:


5. 并发模式

5.1 线程本地存储模式 (Thread Local Storage Pattern)

Envoy 大量使用线程本地存储来避免锁竞争,实现无锁并发:

cpp 复制代码
// 文件位置: envoy/thread_local/thread_local.hclass ThreadLocalObject {public:  virtual ~ThreadLocalObject() = default;};
class Slot {public:  virtual ~Slot() = default;  virtual void set(std::function<std::shared_ptr<ThreadLocalObject>(Event::Dispatcher&)> create_cb) PURE;  virtual std::shared_ptr<ThreadLocalObject> get() PURE;};
class Instance {public:  virtual ~Instance() = default;  virtual SlotPtr allocateSlot() PURE;
  template <class T>  std::shared_ptr<T> getTyped(Slot& slot) {    return std::dynamic_pointer_cast<T>(slot.get());  }};
// 使用示例class MyThreadLocalData : public ThreadLocalObject {public:  int counter_{0};  std::vector<ConnectionPtr> connections_;};
// 分配槽位并设置 TLS 对象auto slot = tls.allocateSlot();slot->set([](Event::Dispatcher& dispatcher) {  return std::make_shared<MyThreadLocalData>();});
// 在任一工作线程中访问auto data = tls.getTyped<MyThreadLocalData>(*slot);data->counter_++;  // 无需加锁,每个线程独立

Envoy 线程模型:

5.2 反应器模式 (Reactor Pattern)

Envoy 基于 libevent 实现了高性能的反应器模式:

cpp 复制代码
// 事件调度器(反应器)class Dispatcher {public:  virtual ~Dispatcher() = default;
  // 运行事件循环  virtual void run(RunType type) PURE;
  // 创建定时器  virtual TimerPtr createTimer(const TimerCb& callback) PURE;
  // 延迟执行回调  virtual void post(PostCb callback) PURE;
  // 创建文件事件监听  virtual FileEventPtr createFileEvent(int fd, FileReadyCb cb, int events,                                       FileTriggerType trigger_type) PURE;};
// 定时器实现class Timer {public:  virtual void enableTimer(const std::chrono::milliseconds& timeout) PURE;  virtual void disableTimer() PURE;};
// 使用示例auto timer = dispatcher->createTimer([this]() {  this->onTimeout();});timer->enableTimer(std::chrono::milliseconds(1000));

5.3 主动器模式 (Proactor Pattern)

Envoy 的异步 I/O 使用了主动器模式:

cpp 复制代码
// 异步连接操作class Connection {public:  virtual void connect() PURE;  virtual void close() PURE;  virtual void addConnectionCallbacks(ConnectionCallbacks& callbacks) PURE;};
// 异步操作完成时的回调(主动器)class ConnectionCallbacks {public:  virtual void onEvent(ConnectionEvent event) PURE;  virtual void onAboveWriteBufferHighWatermark() PURE;  virtual void onBelowWriteBufferLowWatermark() PURE;};
// 异步连接示例class AsyncConnector {public:  void connect(Dispatcher& dispatcher, const Address::InstanceConstSharedPtr& address) {    auto connection = dispatcher.createClientConnection(address, ...);    connection->addConnectionCallbacks(*this);    connection->connect();  // 异步连接,立即返回    // 连接完成后 onEvent(Connected) 会被调用  }
  void onEvent(ConnectionEvent event) override {    if (event == ConnectionEvent::Connected) {      // 连接成功,开始发送数据      sendRequest();    }  }};

6. 架构模式

6.1 插件架构

Envoy 通过工厂注册实现了完整的插件架构:

cpp 复制代码
// 插件基类class NamedNetworkFilterConfigFactory : public Config::TypedFactory {public:  std::string category() const override { return "envoy.network.filters"; }};
// 插件自动发现与注册// 在编译时,所有 REGISTER_FACTORY 宏都会创建静态注册对象// 运行时,配置加载器会查询 FactoryRegistry 获取对应的工厂
// 配置加载流程void Configuration::loadConfiguration(const std::string& config) {  // 1. 解析配置  auto proto_config = parseConfig(config);
  // 2. 根据类型查找工厂  auto* factory = FactoryRegistry<NamedNetworkFilterConfigFactory>::getFactory(      proto_config.name());
  // 3. 使用工厂创建插件实例  auto filter = factory->createFilterFactoryFromProto(proto_config, context);}

支持的扩展点:

扩展类别 注册宏 描述
网络过滤器 REGISTER_FACTORY Layer 4 过滤器
HTTP 过滤器 REGISTER_FACTORY Layer 7 过滤器
接入点 REGISTER_FACTORY 监听器接入点
负载均衡器 REGISTER_FACTORY 负载均衡策略
传输 Socket REGISTER_FACTORY TLS/明文传输
健康检查器 REGISTER_FACTORY 主动/被动健康检查

6.2 分层架构

Envoy 采用清晰的分层架构,各层职责明确:

6.3 事件驱动架构

Envoy 的核心是事件驱动架构:

typescript 复制代码
// 事件循环的主循环void DispatcherImpl::run(RunType type) {  running_ = true;
  while (running_) {    // 1. 等待事件    event_base_loop(event_base_, EVLOOP_ONCE | ...);
    // 2. 处理就绪的事件    processReadyEvents();
    // 3. 执行延迟回调    drainPostCallbacks();
    // 4. 检查退出条件    if (type == RunType::NonBlock && !hasPendingEvents()) {      break;    }  }}
// 事件驱动流程// I/O事件 → 事件循环 → 回调处理 → 产生新事件 → 继续循环

7. 设计模式汇总

7.1 模式使用概览

分类 模式名称 使用场景 重要性
创建型 工厂模式 扩展组件创建 ★★★★★
单例模式 全局资源管理 ★★★★☆
建造者模式 配置对象构建 ★★★☆☆
结构型 适配器模式 接口兼容转换 ★★★★☆
装饰器模式 过滤器链 ★★★★★
代理模式 上游请求代理 ★★★★☆
桥接模式 传输层抽象 ★★★☆☆
组合模式 过滤器组合 ★★★★☆
行为型 观察者模式 事件通知 ★★★★★
策略模式 负载均衡/退避 ★★★★☆
责任链模式 过滤器链 ★★★★★
命令模式 异步操作 ★★★★☆
状态模式 连接状态管理 ★★★☆☆
模板方法 算法骨架 ★★★☆☆
访问者模式 配置验证 ★★★☆☆
中介者模式 集群管理 ★★★★☆
并发型 TLS 模式 无锁并发 ★★★★★
反应器模式 事件循环 ★★★★★
主动器模式 异步I/O ★★★★☆
架构型 插件架构 扩展系统 ★★★★★
分层架构 系统组织 ★★★★☆
事件驱动 主循环 ★★★★★

7.2 模式关系图

7.3 模式组合示例

过滤器链创建流程中的模式组合

markdown 复制代码
1. 配置加载   └── 工厂模式:创建过滤器实例
2. 过滤器链构建   └── 建造者模式:构建过滤器链   └── 组合模式:组织过滤器结构
3. 请求处理   └── 责任链模式:依次调用过滤器   └── 装饰器模式:每个过滤器添加功能
4. 异步处理   └── 命令模式:封装回调   └── 观察者模式:事件通知

8. 最佳实践与常见陷阱

8.1 扩展开发最佳实践

1. 正确注册工厂

kotlin 复制代码
// 确保使用正确的 categoryclass MyFilterFactory : public NamedNetworkFilterConfigFactory {public:  std::string category() const override {     return "envoy.network.filters";  // 必须与扩展点匹配  }};
// 使用正确的注册宏REGISTER_FACTORY(MyFilterFactory, NamedNetworkFilterConfigFactory);
  1. 线程安全考虑:
perl 复制代码
// 无状态过滤器:可以在多个线程间共享class StatelessFilter : public Http::StreamDecoderFilter {  // 不使用成员变量存储请求特定数据};
// 有状态过滤器:需要使用 TLS 或确保线程安全class StatefulFilter : public Http::StreamDecoderFilter {  // 使用 TLS 存储每线程数据  ThreadLocal::SlotPtr tls_slot_;};
  1. 正确使用生命周期:
cpp 复制代码
class MyFilter : public Http::StreamDecoderFilter {public:  // 在 onDestroy 中清理资源  void onDestroy() override {    cancelPendingOperations();    releaseResources();  }
private:  Cancellable* pending_operation_{nullptr};};

8.2 常见陷阱

陷阱 描述 解决方案
阻塞操作 在过滤器回调中执行阻塞 I/O 使用异步 API 和回调
锁竞争 在热路径中使用互斥锁 使用 TLS 或无锁数据结构
内存泄漏 未正确释放回调捕获的对象 使用智能指针和清理回调
线程安全 跨线程访问共享数据 通过 Dispatcher::post() 调度
生命周期 访问已销毁的对象 使用弱引用或依赖注入

附录

A. 相关源码文件索引

模式 主要源码位置
工厂注册 source/common/registry/
单例管理 source/common/singleton/
线程本地存储 source/common/thread_local/
事件调度 source/common/event/
过滤器 source/common/http/
集群管理 source/common/upstream/
相关推荐
Carl_奕然11 小时前
【智能体】Agent的四种设计模式之:ReAct
人工智能·设计模式·语言模型
二哈赛车手13 小时前
新人笔记---多策略搭建策略执行链实现RAG检索后过滤
java·笔记·spring·设计模式·ai·策略模式
楼田莉子13 小时前
仿Muduo的高并发服务器:Channel模块与Poller模块
linux·服务器·c++·学习·设计模式
geovindu1 天前
go: Strategy Pattern
开发语言·设计模式·golang·策略模式
嵌入式学习_force1 天前
02_state
设计模式·蓝牙
qcx232 天前
Warp源码深度解析(七):Token预算策略——双轨计费、上下文溢出与摘要压缩
人工智能·设计模式·rust·wrap
Cosolar2 天前
提示词工程面试题系列 - Zero-Shot Prompting 和 Few-Shot Prompting 的核心区别是什么?
人工智能·设计模式·架构
geovindu2 天前
go:Template Method Pattern
开发语言·后端·设计模式·golang·模板方法模式
钝挫力PROGRAMER2 天前
贫血模型的改进
java·开发语言·设计模式·架构