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