架构与实践指南)
Apache APISIX 控制面服务发现APISIX-Seed架构与实践指南【免费下载链接】apisixThe Cloud-Native API Gateway项目地址: https://gitcode.com/GitHub_Trending/ap/apisix本文围绕 Apache APISIX 的控制面服务发现机制展开介绍如何借助独立的 APISIX-Seed、Consul的本质差异、APISIX-Seed 的四步工作流程、引入它带来的拓扑与数据量收益以及在生产环境中配套的 etcd 历史版本压缩等最佳实践。从数据面服务发现到控制面服务发现Apache APISIX 很早就支持了数据面Data Plane服务发现在conf/config.yaml中声明discovery段APISIX 每个 worker 进程直接与 Eureka、Nacos、Consul 等服务注册中心建立连接按fetch_interval周期性拉取服务实例列表并在请求到达时通过upstream.discovery_typeupstream.service_name从内存缓存中取出最新节点。从源码看数据面发现的核心调用链位于 apisix/upstream.luaset_by_route中先判断up_conf.service_name再根据discovery_type从 apisix/discovery/init.lua 加载的模块表中取到对应实现调用dis.nodes(service_name, discovery_args)获取节点并覆盖up_conf.nodes。每个注册中心客户端都要实现init_worker()、nodes()与可选的dump_data()接口例如 apisix/discovery/nacos/init.lua 中的_M.nodes实现。而控制面Control Plane服务发现则把这条链路整体上移APISIX 不再直接面对各个注册中心而是通过独立的 APISIX-Seed 组件与注册中心打交道。APISIX-Seed 将拿到的实例节点写入 etcdAPISIX 数据面继续按照已有的 etcd 配置同步机制刷新内存中的节点信息。两者的对比可总结为维度数据面服务发现控制面服务发现APISIX-Seed谁连接注册中心APISIX 每个 worker 进程独立 APISIX-Seed 进程实例数据流向注册中心 → APISIX 内存注册中心 → APISIX-Seed → etcd → APISIX网络拓扑每个 APISIX 实例都要与注册中心建连只有 APISIX-Seed 与注册中心建连配置方式每台 APISIX 实例单独配置仅 APISIX-Seed 配置注册中心连接APISIX-Seed 架构与四步工作流程APISIX-Seed 是独立于 Apache APISIX 的组件架构图如下图中描述的具体信息对应以下四步流程注册上游并指定发现类型向 APISIX 注册 upstream并指定服务发现类型如nacos、zookeeper。APISIX-Seed 会监听 etcd 中 APISIX 资源的变更过滤出带有服务发现类型的资源从中取得服务名称。订阅注册中心服务APISIX-Seed 将解析出的服务名订阅到对应的服务注册中心从而获得该服务的实例变更。回写 etcd当客户端向注册中心注册服务后APISIX-Seed 获取到新的服务信息并把更新后的服务节点写入 etcd。数据面刷新内存当 etcd 中对应资源发生变化时APISIX worker 会将最新的服务节点信息刷新到内存中。从实现上印证APISIX 数据面在 apisix/upstream.lua 中根据service_name走发现分支而在控制面模式下up_conf.nodes会被 etcd 中由 APISIX-Seed 写入的最新节点覆盖随后通过compare_upstream_node判断节点是否有变化有变化才更新配置并重新设置 balancer。也就是说控制面模式复用了数据面由 etcd 驱动配置变更的既有通道APISIX 自身并不直接感知注册中心的存在。为什么选择 APISIX-Seed网络拓扑更简单引入 APISIX-Seed 后APISIX 不再需要与每个注册中心维护网络连接只需要关注 etcd 中的配置信息。这极大简化了微服务场景下的网络拓扑——APISIX 集群与注册中心集群之间不再是 N×M 的全互联关系而是收敛为 APISIX-Seed 与注册中心之间的少量连接。上游服务相关数据总量更小受注册中心特性影响APISIX 可能在 worker 中存放注册中心的全部服务数据例如 consul_kv 的整库数据。引入 APISIX-Seed 后每个 APISIX 进程都不需要额外缓存上游服务的相关信息内存占用与数据一致性压力都显著下降。更易于管理服务发现配置只需要在 APISIX-Seed 上配置一次。引入 APISIX-Seed 后Apache APISIX 对服务注册中心的配置变更完全无感知——注册中心地址调整、认证方式变化等维护操作都不再需要逐台修改 APISIX 实例并重启。支持的注册中心与部署入口当前控制面服务发现支持ZooKeeper与Nacos两种注册中心未来会支持更多。对应的部署教程位于 APISIX-Seed 项目文档中启用控制面 ZooKeeper 服务发现参考 ZooKeeper 部署教程启用控制面 Nacos 服务发现参考 Nacos 部署教程。需要注意的是APISIX-Seed 项目与 Apache APISIX 仓库相互独立。在 APISIX 侧你仍需要像数据面发现一样在 upstream 中声明discovery_type与service_name这部分参数含义与 Admin API 文档 中discovery_type当使用service_name时必填的描述保持一致APISIX-Seed 侧的注册中心连接参数ZooKeeper 集群地址、Nacos host 列表等则在 APISIX-Seed 的配置中维护。生产环境配套etcd 历史版本压缩官方文档特别强调引入 APISIX-Seed 后如果注册中心的服务变更频繁写入 etcd 的数据也会频繁变化。etcd 的每个键修改都会产生新的 revision 并保留历史版本若不清理历史版本数据会持续累积最终耗尽 etcd 的存储空间。因此启动 etcd 时最好设置--auto-compaction选项定期压缩历史 revision。相关机制可参考 etcd 官方文档关于 revisions 的说明。例如在启动 etcd 时带上etcd --auto-compaction-retention1即可保留最近 1 小时的 revision 历史更早的版本会被自动压缩清理。该建议在节点频繁上下线、服务弹性伸缩剧烈的场景下尤为重要是控制面服务发现方案落地时不可省略的运维步骤。控制面发现的完整接入路径综合上述内容一条完整的控制面服务发现接入路径可以概括为部署 APISIX-Seed并在其配置中填写 ZooKeeper 或 Nacos 的连接信息启动 etcd 时配置--auto-compaction防止频繁变更耗尽存储通过 Admin API 向 APISIX 注册 Route在upstream中设置service_name、type与discovery_type控制面模式下无需手写nodes实例节点由 APISIX-Seed 经 etcd 下发APISIX-Seed 从 etcd 监听资源变更 → 订阅注册中心 → 回写最新节点到 etcdAPISIX worker 监听到 etcd 变更将最新服务节点刷新到内存请求按 balancer 算法转发到对应实例。这条链路让 Apache APISIX 与注册中心解耦保持了etcd 为唯一配置源的架构一致性同时把服务发现的复杂度收敛到了独立的 APISIX-Seed 组件中适用于对注册中心连接数量、worker 内存占用和运维成本都有较高要求的微服务网关场景。【免费下载链接】apisixThe Cloud-Native API Gateway项目地址: https://gitcode.com/GitHub_Trending/ap/apisix创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考