Envoy 源码分析--LDS

本文详细分析了Envoy中LDS(Listener Discovery Service)的工作原理,包括Listener的添加、修改和删除过程。当Listener更新时,Envoy会创建新的Listener并进行预热,旧的Listener则进入驱逐状态。在预热阶段,Envoy允许添加相同名称但配置不同的Listener。整个流程涉及到Listener的初始化、订阅、更新和关闭操作。通过对LdsApiImpl和ListenerManagerImpl的源码解析,展示了Envoy如何动态管理Listener。
摘要由CSDN通过智能技术生成

  Envoy 源码分析--LDS
  
  LDS 是 Envoy 用来自动获取 listener 的 API。 Envoy 通过 API 可以增加、修改或删除 listener。
  
  先来总结下 listener 的更新语义如下:
  
  每个 listener 必须有一个唯一的名称。如果没有提供名称,Envoy 会生成一个 UUID 来作为它的名字。要动态更新 listener,管理服务必须提供一个唯一名称。
  
  当 listener 被添加,在接收流量之前,会先进入 “预热” 阶段。
  
  一旦 listener 被创建,就会保持不变。因此,listener 更新时,会创建一个全新的 listener(同一个侦听套接字)。这个新增加的 listener 同样需要一个 “预热” 过程。
  
  当更新或删除 listener 时,旧的 listener 将被置于 “draining(驱逐)” 状态,和整个服务重新启动时一样。在删除侦听器并关闭任何其余连接之前,侦听器拥有的连接将在一段时间内优雅关闭(如果可能的话)。逐出时间通过 --drain-time-s 设置。
  
  相同名称的 listener 必须要有相同的配置地址。
  
  接下来是对 lds 进行源码分析,对各种语义的情况都可以在源码中看到。
  
  初始化
  
  在初始化 bootstrap 配置时,如果有 lds 配置会进行初始化。
  
  // Instruct the listener manager to create the LDS provider if needed. This must be done later
  
  // because various items do not yet exist when the listener manager is created.
  
  if (bootstrap_.dynamic_resources().has_lds_config()) {
  
  listener_manager_->createLdsApi(bootstrap_.dynamic_resources().lds_config());
  
  }
  
  在 ListenerManagerImpl 类中通过 ProdListenerComponentFactory 配置类创建 lds。
  
  // Server::ListenerManager
  
  void createLdsApi(const envoy::api::v2::core::ConfigSource& lds_config) override {
  
  ASSERT(lds_api_ == nullptr);
  
  lds_api_ = factory_.createLdsApi(lds_config);
  
  }
  
  // Server::ListenerComponentFactory
  
  LdsApiPtr createLdsApi(const envoy::api::v2::core::ConfigSource& lds_config) override {
  
  return std::make_unique<LdsApiImpl>(lds_config, server_.clusterManager(), server_.dispatcher(),
  
  server_.random(), server_.initManager(),
  
  server_.localInfo(), server_.stats(),
  
  server_.listenerManager(), server_.api());
  
  }
  
  新建 lds 时,会创建一个通道。
  
  LdsApiImpl::LdsApiImpl(const envoy::api::v2::core::ConfigSource& lds_config,
  
  Upstream::ClusterManager& cm, Event::Dispatcher& dispatcher,
  
  Runtime::RandomGenerator& random, Init::Manager& init_manager,
  
  const LocalInfo::LocalInfo& local_info, Stats::Scope& scope,
  
  ListenerManager& lm, Api::Api& api)
  
  : listener_manager_(lm), scope_(scope.createScope("listener_manager.lds.")), cm_(cm),

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值