侧边栏壁纸
  • 累计撰写 228 篇文章
  • 累计创建 245 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

APISIX 与微服务入口治理:从流量接入到蓝绿灰度发布边界

zhanjie.me
2026-02-07 / 0 评论 / 0 点赞 / 2 阅读 / 0 字

这是“微服务治理与平台化演进”系列的第三篇。
第一篇解决的是“服务怎么跑、服务在哪里被发现”,第二篇解决的是“这些服务运行在什么样的平台上”,这一篇继续回答:外部流量如何从进入系统的第一跳开始,就进入正确的运行时边界。

摘要

这次 APISIX 改造表面上看,是把传统 Nginx upstream 入口模型替换成 APISIX Ingress;但如果只把它理解成一次网关组件替换,意义其实被低估了。真正发生变化的,不是“流量换了一个入口代理”,而是入口层第一次开始以规则化、条件化、平台化的方式参与微服务运行时治理。本文会从运维实践和架构演进两个角度,复盘传统入口模型为什么越来越吃力,APISIX 在这里到底承接了哪些入口治理能力,以及它如何与 ACK、Nacos 共同构成一条连续的微服务边界链路。

系列导航

0. 导语:网关不是入口代理,而是运行时边界的第一层

在很多系统里,网关最容易被理解成一个很传统的角色:做反向代理、做路由转发、把外部请求送到后端服务。这种理解在单体应用阶段基本够用,因为那时候入口层主要解决的是“请求怎么进系统”,而系统内部的运行边界相对简单,入口代理更多承担的是接入能力,而不是治理能力。

但当系统逐渐进入微服务和容器平台阶段之后,入口层承担的职责就开始发生变化。

这时候,一个请求进入系统,不再只是“转发到某台机器、某个端口”这么简单。它往往还会继续影响:

  • 请求先进入哪一组运行面
  • 某类来源的流量应该进入哪套环境
  • 蓝绿和灰度边界能否从入口层开始成立
  • 第三方回调、内部测试、正式用户流量能否被稳定区分
  • 入口层边界能否和内部服务发现边界衔接起来

也就是说,网关在这里已经不再只是入口代理,而是运行时边界的第一层。

这也是为什么我们在容器平台建设之后,会继续把入口层从传统的 Nginx upstream 模型推进到 APISIX Ingress 模型。表面上看,这像是一次网关组件替换;但如果回头复盘,它真正解决的,其实不是“换一个更现代的反向代理”,而是让入口流量第一次开始以平台化方式被治理。

如果说前一篇 ACK 解决的是“微服务最终运行在什么样的平台上”,那么这一篇 APISIX 真正要解决的就是:

  • 外部流量如何以可治理的方式进入这套平台
  • 蓝绿和灰度边界如何从入口层开始成立
  • 入口层、运行空间层、内部服务发现层如何形成职责清晰的衔接关系

所以这篇文章想复盘的重点,不是 APISIX 的功能清单,而是微服务进入容器平台之后,为什么入口层不能再停留在“转发请求”这个层面,而必须被升级成“入口治理”。

flowchart LR subgraph Old [传统入口模型] O1[SLB 公网接入] --> O2[Nginx 反向代理] O2 -->|静态 upstream 配置| O3[固定后端节点池] O3 --> O4[单一运行环境] style O2 fill:#ffebee,stroke:#c62828 style O3 fill:#ffebee,stroke:#c62828 end subgraph New [APISIX 入口治理模型] N1[SLB 公网接入] --> N2[APISIX Ingress] N2 -->|规则化识别<br/>Header/IP/URI| N3[Service 抽象层] N3 -->|动态指向| N4[蓝/绿 Upstream 节点池] N4 --> N5[ACK 独立运行面] style N2 fill:#e8f5e9,stroke:#2e7d32 style N3 fill:#e8f5e9,stroke:#2e7d32 end Old -.->|痛点: 缺乏环境边界/规则与环境强耦合| New

图 1:变化的不是“有没有网关”,而是入口层第一次开始具备环境边界意识。

1. 改造前:问题不在 Nginx,而在入口治理模型

在改造之前,我们的入口链路大致是这样的:

SLB -> Nginx(upstream) --http-> Tomcat(microsvc consumer) --dubbo-> microsvc provider

这个模型在系统早期并没有什么问题。SLB 承接公网入口,Nginx 负责反向代理和 upstream 转发,后面再进入具体微服务消费方。如果系统规模不大、环境不复杂、服务运行位置也比较固定,那么这种方式完全可以工作。

但问题在于,当微服务逐渐容器化、运行位置开始动态变化、蓝绿和灰度治理开始真正进入发布链路时,这种入口模型就会越来越吃力。

1.1 旧入口模型更适合“固定后端”,不适合“动态运行面”

传统 Nginx upstream 模型最擅长解决的,本质上还是“一个请求应该转发给哪组后端节点”。

在机器部署时代,这种方式非常直接。后端机器相对稳定,节点池变化频率也不高,入口层更多承担的是静态流量接入能力。

但到了微服务和容器平台阶段,后端承载对象已经不再是“几台相对固定的机器”,而开始变成“平台中动态变化的一组工作负载”。这时候,入口层面对的已经不是一个简单的 upstream 配置问题,而是:

  • 后端节点如何被平台发现
  • 同一个服务在不同运行环境下如何形成不同上游池
  • 蓝绿环境如何在入口层被清晰区分
  • 流量切换如何和发布动作协同

这类问题如果仍然用传统 upstream 思路去承接,就会越来越别扭。

1.2 路由诉求开始变复杂,入口不再只是“按路径转发”

旧入口模型默认假设大多数请求可以通过相对简单的规则被转发,比如域名、路径、少量基础条件。

但在真实的微服务运行场景里,入口流量的诉求并没有这么单一。我们真正需要区分的,不只是“访问哪个 URI”,还包括:

  • 某些内部测试人员的流量应该进入哪套环境
  • 某些第三方平台的回调请求应该进入哪套环境
  • 某些显式标记过的请求是否应该被定向到蓝或绿运行面
  • 某些验证流量是否应该先进入非默认运行空间

这意味着入口治理面对的,其实已经不是简单路径转发,而是“不同来源、不同目的、不同验证场景下的流量分面”。

1.3 入口层与发布治理脱节,蓝绿更多靠流程兜底

当系统还停留在固定部署模式时,蓝绿切换更多依赖的是部署流程、人工操作和环境前后脚切换。入口层虽然也参与切流,但它更多像是最后一步的流量拨杆,而不是整个发布治理里的稳定支点。

这样做的问题在于,入口规则和运行环境之间缺少一种更自然的结构化关系。流量切换虽然可以发生,但它往往不是“平台在接管边界”,而更像是“流程在推动边界成立”。

1.4 入口层缺少明确的环境边界意识

旧入口链路还有一个更深层的问题:它虽然负责把请求引进系统,但它对“这个请求应该进入哪一组运行空间”并没有足够清晰的环境边界表达。

换句话说,入口层虽然是系统第一跳,但它并没有真正被设计成运行时边界的一部分。它更像一个代理器,而不是治理器。

小结

所以回头看,旧入口链路真正的问题,并不是 Nginx 本身不够强,而是它承接的是“反向代理问题”,而我们面对的已经是“微服务入口治理问题”。

2. 为什么选择 APISIX:我们需要的不是转发组件,而是入口治理能力

当入口层的问题开始从“转发请求”升级为“治理流量”时,我们真正需要的,就不再只是一个传统意义上的反向代理,而是一层能够承接规则化、条件化、平台化入口治理的能力。

这也是为什么我们最终选择了 APISIX。

2.1 我们需要的不是简单路径转发,而是规则驱动的流量识别

在真实生产场景里,入口层面对的流量并不是同质的。

不同请求之所以需要被区分,并不总是因为它们访问不同路径,而是因为它们代表不同来源、不同阶段、不同验证目的。比如在我们的场景里,真正需要被入口层识别出来的流量,会来自:

  • 内部测试人员
  • 第三方平台回调
  • 带有显式标记的验证请求
  • 正常默认流量

这意味着入口层需要处理的,不只是 URL 匹配,而是条件化流量识别。系统需要的不是“一个能转发请求的组件”,而是“一个能把不同类型流量先识别出来、再送入不同运行面的组件”。

2.2 APISIX 更适合承接蓝绿 / 灰度这种“入口分面”

在我们的实践里,入口层的流量分流主要依赖几类条件:

  • header
  • client ip
  • uri tag

这几类条件之所以重要,不是因为功能多,而是因为它们各自对应了非常真实的场景。

client ip 很适合内部测试人员场景。测试人员会通过 WireGuard VPN 进入内网,而 VPN IP 是相对可控的,这让入口层可以基于来源地址做非常稳定的定向流量路由。

header 更适合显式传递环境意图。对于可控客户端、内部验证链路或者需要明确打标的访问,请求头往往是最自然的承载方式。

uri tag 则很适合第三方平台回调场景。因为很多第三方系统不一定方便配复杂请求头,但通过不同回调 URL 约定不同环境入口,相对更容易落地,也更适合合作方使用。

2.3 APISIX 更适合运行在容器平台里,而不是悬浮在平台之外

APISIX 在我们的体系里不是一个平台之外的外挂网关,而是直接作为 ACK 平台中的入口运行面来承接外部流量。

一旦入口层本身也成为平台工作负载的一部分,它就不再只是一个放在系统边上的代理组件,而开始和业务运行面、运维支撑面一起被纳入平台治理范围。这样一来,入口层的生命周期、扩缩容、资源管理、版本演进和后续观测,才有机会和整个平台的运行方式保持一致。

2.4 APISIX 适合把“规则变更”和“环境切换”拆开治理

这是我们实践里一个非常关键的点。

在入口治理里,真正需要频繁变化的,并不应该是 route 本身,而应该是 route 背后所指向的运行环境。

route 负责表达的是“哪类流量该被识别出来”,比如:

  • 哪个 header
  • 哪段 client ip
  • 哪个 uri tag

这些规则一旦定义完成,通常不会随着每次蓝绿演进频繁变化。真正会来回变化的,是这些已经被识别出来的流量,当前应该进入蓝环境还是绿环境。

如果让 route 直接关联 upstream,那么每次蓝绿切换都可能变成一轮批量 route 修改。由于一个 upstream 往往会被多个 route 复用,这种方式不仅改动面大,也会让入口规则本身和环境切换动作耦合在一起。

而 APISIX 的 service 概念,恰好给了我们一个更合理的拆分层次:

  • route 负责流量匹配
  • service 负责承接一组入口服务语义
  • upstream 负责实际指向蓝或绿的上游节点池

这样一来,蓝绿切换时真正需要变化的,就不再是 route 规则本身,而只是 service 与 upstream 的关联关系。

小结

所以回头看,我们选择 APISIX,并不是为了换一个更现代的反向代理,而是为了让入口层第一次具备下面这些能力:

  • 规则化识别流量
  • 条件化切分流量
  • 平台化承接入口层
  • 把流量匹配和环境指向拆开治理

我们选择 APISIX,不是为了换一个更现代的代理,而是为了让入口层第一次具备规则化、条件化、平台化的治理能力。

3. 在 ACK 上如何承接入口层:APISIX 的平台位置与职责边界

当入口治理被抬升到平台能力层之后,接下来的问题就不再只是“APISIX 怎么配置”,而是:它在整套 ACK 平台里,到底处于什么位置,又应该承担什么边界。

在我们的实践里,APISIX 并不是作为一个平台之外的外围组件独立存在,而是明确地作为入口运行面部署在 ACK 中。这意味着它和业务运行面、运维支撑面一样,都是平台工作负载的一部分。

3.1 APISIX 作为独立入口运行面存在

在 ACK 平台中,我们将 APISIX 放在独立的 namespace 中:

  • ingress-apisix

这样的划分并不只是为了资源好看一点,更重要的是让入口层拥有独立治理边界。

因为入口层和业务微服务本身,虽然都运行在同一个容器平台上,但它们承担的职责完全不同:

  • 生命周期不同
  • 稳定性要求不同
  • 扩缩容模式不同
  • 发布风险不同
  • 面向的流量类型也不同

如果把入口层和业务 workload 混在一起,后续无论是治理、排障还是演进,都会很快变得混乱。

3.2 公网入口如何进入 ACK

在公网接入上,我们的基本链路是:

  • APISIX 创建 LoadBalancer 类型的 Service
  • 该 Service 关联阿里云 SLB
  • SLB 具备公网 IP,承接外部流量
  • 流量再进入 ACK 内部的 APISIX Ingress 层

这个结构非常符合平台化思路:

  • SLB 负责公网流量接入
  • APISIX 负责入口规则治理
  • ACK 负责工作负载承载
  • 后续服务发现和内部调用再进入微服务体系内部

3.3 APISIX 不是中间件附属物,而是入口层工作负载

如果从传统视角看,网关很容易被当成一种“中间件组件”;但在我们的平台里,APISIX 更准确的身份其实是:入口层工作负载。

这意味着它在平台中的地位,更接近:

  • 业务运行面
  • 运维支撑面
  • 中间件运行面

这些并列的运行空间之一,而不是一个“随便装上去就行”的附属组件。

3.4 入口层必须独立治理,但职责不能无限膨胀

不过,把 APISIX 放进平台里,并不意味着它应该无限承担所有治理能力。

在我们的设计里,APISIX 负责的是:

  • 外部请求如何进入系统
  • 流量如何在入口层被识别和分流
  • 请求如何被送入正确的运行空间

但它并不负责整个微服务体系的全部服务发现逻辑。它不去替代内部的服务注册发现体系,也不试图把所有调用链边界都吞到入口层里。

这也是为什么后面我们会明确把 APISIX 和 Nacos 的职责分开:前者解决入口层服务发现和流量治理,后者解决 Dubbo 体系内部的注册与发现。

flowchart TB Internet((Internet)) --> SLB[阿里云 SLB<br/>公网入口] SLB --> APISIX[APISIX Ingress<br/>namespace: ingress-apisix] subgraph ACK 平台边界 APISIX --> K8sSvc[K8s Service / Endpoints] K8sSvc --> Consumer[Tomcat Server /Dubbo Consumer<br/>namespace: blue/green-microsvc] Consumer --> DubboProv[Dubbo Provider] end style APISIX fill:#bbdefb,stroke:#1565c0,stroke-width:2px style ACK平台边界 fill:#f5f5f5,stroke:#9e9e9e,stroke-dasharray: 5 5

图 2:APISIX 不是平台外的一层外挂代理,而是 ACK 中独立的入口运行面。

4. 蓝绿与灰度流量治理:header、client IP、uri tag 为什么都需要

当入口层开始承担治理职责之后,一个最现实的问题很快就会出现:到底应该用什么规则,把不同类型的流量稳定地区分开?

很多时候,大家一提到灰度或蓝绿,第一反应就是“按请求头切流”或者“按用户分组切流”。这些做法当然没问题,但如果回到真实生产场景,就会发现入口层面对的流量来源其实并不单一。不同来源的请求,在可控程度、接入方式和协作对象上都不一样,因此也不可能只靠一种规则完成所有分流诉求。

在我们的实践里,入口层主要会基于三类条件来做流量治理:

  • header
  • client ip
  • uri tag

4.1 client IP:最适合内部测试流量的定向治理

在内部测试和联调场景中,我们的一类重要需求是:让特定测试人员、特定验证人员能够稳定访问到某一组运行环境。

这个时候,client ip 就非常好用。

因为内部测试人员会通过 WireGuard VPN 接入,而 VPN IP 是相对可控的。这样一来,入口层就可以根据来源 IP,把某类请求稳定地导向蓝环境或绿环境,而不需要测试人员在请求中额外携带复杂标记。

4.2 header:最适合显式表达环境意图

如果说 client ip 更适合“入口根据来源替你判断”,那么 header 更适合“调用方显式表达自己的访问意图”。

这种方式很适合下面几类场景:

  • 内部可控客户端
  • 需要明确指定进入某个运行面的验证请求
  • 某些自动化测试链路
  • 某些希望通过显式标记完成流量切换的访问

4.3 uri tag:最适合第三方平台回调这类外部协作场景

除了内部测试和显式标记请求,入口层还必须面对一类更现实的问题:第三方平台回调。

这类场景往往并不适合要求对方配复杂 header,也不适合基于来源 IP 做稳定治理。这时,通过 URL 本身做环境区分,往往会更加直接,也更容易落地。

这就是 uri tag 在我们这里的重要性。

4.4 为什么这三类规则不能只保留一种

真实生产场景里的灰度流量,从来都不是单一维度的。不同来源、不同角色、不同访问路径的请求,本来就需要不同的分流手段。

这也是为什么我们并不追求“所有流量都只靠一个条件切分”,而是更倾向于让入口规则和访问源特征保持一致:

  • 内部测试流量,适合 client ip
  • 显式验证流量,适合 header
  • 第三方回调流量,适合 uri tag

小结

所以回头看,蓝绿和灰度真正难的,从来不是“能不能切流”,而是不同来源、不同路径、不同协作对象的请求,到底应该如何被稳定地区分开。

蓝绿和灰度真正难的,从来不是“能不能切流”,而是不同来源、不同路径、不同协作对象的请求,到底应该如何被稳定地区分开。

5. 为什么蓝绿切换不应该直接改 route

如果说上一节解决的是“不同类型的流量如何被识别出来”,那么这一节真正要回答的问题就是:当蓝绿环境需要交替式切换时,入口层到底应该改什么?

这是我们在实际设计里非常在意的一个点。因为如果这一层处理不好,入口治理很容易从“规则化平台能力”退化成“每次发版都改一轮网关配置”的人工工程。

5.1 蓝绿切换真正变化的,不是规则,而是规则背后的环境指向

在我们的入口治理模型里,route 主要负责表达的是:

  • 哪类流量应该被识别出来
  • 识别依据是什么
  • 这条流量匹配规则适用于什么场景

这些规则一旦定义完成,通常不会随着每次蓝绿发布频繁变化。真正会反复变化的,其实不是“流量如何被识别”,而是“这些已经被识别出来的流量,当前应该进入蓝环境还是绿环境”。

换句话说,蓝绿切换真正变化的,不应该是规则本身,而应该是规则背后所指向的运行环境。

5.2 如果让 route 直接关联 upstream,变更面会迅速失控

按照 APISIX 的基础模型,route 可以直接反向代理到 upstream。单看结构,这当然很直观:

  • route 负责匹配请求
  • upstream 负责指向上游节点池

但在蓝绿场景下,如果让这两层直接绑定,就会出现一个明显的问题:

  • 同一个 upstream 可能被多个 route 复用
  • 一次蓝绿切换可能意味着要批量修改很多 route
  • route 规则和环境切换动作会被强耦合在一起

这样做的代价非常高。明明只是一次环境切换,最后却变成对多条 route 的批量变更。

5.3 K8s 侧的蓝绿节点池其实并不难表达,真正复杂的是入口切流层

在我们的场景里,APISIX 的上游服务发现并不是走 Nacos,而是基于 Kubernetes Service/Endpoints

这意味着,对于同一个微服务的蓝绿环境,K8s 侧其实很容易形成两套独立的上游节点池。只要通过不同的 Service labels 去匹配不同环境下的 Pod,就能很自然地形成:

  • 蓝环境 Service -> 蓝环境 Endpoints
  • 绿环境 Service -> 绿环境 Endpoints

所以从 K8s 视角看,蓝绿环境的节点池表达并不难。真正复杂的,其实不是节点池怎么建出来,而是 APISIX 这一层到底如何以更小的变更面完成交替式切流。

5.4 route、service、upstream 三层拆开之后,切流才真正可治理

也正因为这样,我们最终更倾向于把 APISIX 的治理层次拆成三层来看:

  • route:负责流量匹配
  • service:负责承接一组入口服务语义
  • upstream:负责实际指向蓝或绿的上游节点池

这样一来,蓝绿切换时真正需要变化的,就不再是 route 规则本身,而只是 service 与 upstream 的关联关系。

5.5 为什么 service 概念在这里特别重要

APISIX 的 service 概念,在很多简单场景里看起来似乎不是必需的;但在我们的蓝绿治理里,它恰恰是最关键的解耦层。

因为它把“规则层”和“环境指向层”隔开了。

这样带来的收益非常直接:

  • route 可以稳定复用
  • upstream 可以按蓝绿分别建模
  • 切换动作可以收敛到 service 指向关系
  • 变更面明显缩小
  • 自动化触发更容易落地
  • 回滚路径也更清晰

5.6 为什么这种方式特别适合和 Jenkins 配合

当蓝绿切换被收敛到“service 当前指向哪个 upstream”之后,它就天然很适合自动化执行。

因为对于 Jenkins 来说,这种变更具备几个很重要的特点:

  • 变更点集中
  • 调用 APISIX Admin API 即可完成
  • 审计路径明确
  • 回切动作对称
  • 不需要批量修改 route 规则
flowchart LR subgraph 规则层 [Route 规则层 稳定不变] R1[Route A: Header 匹配] R2[Route B: Client IP 匹配] R3[Route C: URI Tag 匹配] end subgraph 抽象层 [Service 抽象层<br/>切换锚点] S[APISIX Service] end subgraph 环境层 [Upstream 环境层 蓝绿交替] U1[Upstream Blue] U2[Upstream Green] end R1 --> S R2 --> S R3 --> S S -->|当前指向| U1 S -.发布切换.-> U2 U1 --> K1[K8s SVC Blue -> Endpoints] U2 --> K2[K8s SVC Green -> Endpoints] style S fill:#fff9c4,stroke:#fbc02d,stroke-width:3px style 规则层 fill:#e3f2fd,stroke:#1976d2 style 环境层 fill:#e8f5e9,stroke:#388e3c

图 3:真正需要变化的,不是 route 规则本身,而是 route 背后 service 所指向的 upstream。

小结

所以回头看,蓝绿切换真正应该变化的,不是路由规则,而是路由背后所指向的运行环境。

蓝绿切换真正应该变化的,不是路由规则,而是路由背后所指向的运行环境。

6. APISIX 与 Nacos 为什么不直接耦合:入口层和服务发现层的职责分层

讲到这里,一个很自然的问题就会出现:既然 APISIX 也在做上游服务发现,而 Nacos 也在做服务注册与发现,那这两者是不是应该直接打通?

从表面上看,这个问题很合理。
但在我们的实践里,恰恰是“没有直接耦合”这件事,才能说明入口层和内部运行时治理的边界是清晰的。

6.1 APISIX 解决的是入口层服务发现

在我们的体系里,APISIX 侧的上游发现是基于 Kubernetes Service/Endpoints 的。

也就是说,对 APISIX 来说,它最关心的是:

  • 请求应该进入哪一个 HTTP 入口服务
  • 当前可用的后端实例有哪些
  • 某组入口服务的上游节点池是什么

从职责上说,这解决的是入口层服务发现问题。它面向的是:

  • 外部请求如何进入系统
  • 入口层如何找到正确的后端 HTTP 服务
  • 入口规则如何把流量送进正确运行面

6.2 Nacos 解决的是微服务内部服务发现

而在微服务内部,尤其是 Dubbo 调用链路里,真正的服务注册与发现仍然走的是 Nacos。

这一层更关心的是:

  • provider 如何注册
  • consumer 最终发现哪组 provider
  • namespace 和 group 如何定义环境边界
  • 蓝绿运行面在服务发现层如何继续保持一致

也就是说,Nacos 在这里承接的是微服务内部运行时治理问题,而不是入口层流量治理问题。

6.3 两层为什么不能混为一谈

从职责上看,这两层解决的问题根本不是同一件事:

  • APISIX 解决的是“请求怎么进系统”
  • Nacos 解决的是“服务在系统里怎么被发现”

如果让网关直接吞掉内部服务发现职责,入口层职责就会膨胀。它本来应该关注流量接入和流量分流,但如果再强行承接内部注册发现,就会让它同时变成入口、注册中心、运行面协调器,这会让边界迅速模糊。

6.4 APISIX 和 Nacos 不是重复建设,而是前后衔接

所以在我们的体系里,APISIX 和 Nacos 并不是两套重复建设的服务发现能力,而是两层前后衔接的治理结构。

入口层:

  • APISIX
  • 基于 K8s Service / Endpoints
  • 面向 HTTP 接入与流量治理

内部服务层:

  • Nacos
  • 面向 Dubbo 注册与发现
  • 面向微服务运行时边界

这两层叠加起来之后,外部流量和内部服务调用才真正形成了连续边界:

  • 请求先被 APISIX 按规则送入正确运行面
  • 运行面中的 consumer 再通过 Nacos 发现正确的 provider
  • 蓝绿边界从入口层继续延伸到内部服务发现层
flowchart TB ExtReq[外部请求] --> SLB[SLB] SLB --> APISIX[APISIX Ingress] subgraph 入口治理层 [入口层: 请求如何进系统] APISIX --> K8sEP[K8s Service / Endpoints] K8sEP --> HTTPCons[Tomcat Server / Dubbo Consumer] end HTTPCons --> Nacos[Nacos 注册中心] subgraph 内部运行时层 [内部服务发现层: 服务如何被发现] Nacos --> DubboProv[Dubbo Provider] end style 入口治理层 fill:#e1f5fe,stroke:#0277bd,stroke-width:2px style 内部运行时层 fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px style APISIX fill:#bbdefb,stroke:#1565c0 style Nacos fill:#ce93d8,stroke:#6a1b9a

图 4:APISIX 解决的是请求如何进入系统,Nacos 解决的是服务在系统内部如何被发现。

小结

所以回头看,APISIX 和 Nacos 没有直接耦合,并不是设计缺口,反而恰恰说明系统边界是清晰的。

APISIX 解决的是“请求怎么进系统”,Nacos 解决的是“服务在系统里怎么被发现”;两者衔接,但不互相替代。

7. 这次入口治理升级到底带来了什么

如果回头看这次从传统 Nginx upstream 模型走向 APISIX Ingress 的过程,最值得复盘的,其实不是“入口层换了一个组件”,而是入口流量终于开始拥有了一套更可治理的组织方式。

7.1 发布收益:蓝绿切流第一次有了真正的平台抓手

最直接的收益,是蓝绿和灰度发布终于不再主要依赖人工流程和临时规则兜底。

旧模式下,入口层虽然也能参与切流,但更多像是发布动作的最后一步配合;而在 APISIX 模型下,入口规则本身开始成为发布治理中的一个稳定抓手。尤其是当 routeserviceupstream 三层被明确拆开之后,蓝绿切换就不再是“批量改路由”,而变成了更集中、更可控的环境指向变更。

7.2 协作收益:不同角色终于可以稳定进入不同运行面

真实系统里的流量并不只有“线上用户访问”这一种。还有测试人员、联调人员、第三方平台、验证请求、灰度请求,这些对象都可能需要访问同一个系统,但它们并不一定应该进入同一组运行面。

APISIX 规则化入口治理的价值就在于,它让这些不同角色的请求第一次开始可以被稳定地区分开:

  • 内部测试人员通过 WireGuard VPN,可基于 client ip 定向进入特定环境
  • 显式验证流量,可通过 header 明确进入蓝或绿运行面
  • 第三方平台回调,可通过 uri tag 清晰区分不同环境入口

7.3 架构收益:入口层、运行空间层、内部服务发现层开始形成连续边界

从架构层面看,这次升级最重要的收益,其实是系统边界开始连续起来了。

过去入口层和内部运行时之间的关系,更多是“请求进来之后再说”;而现在,系统第一次开始拥有了三层前后衔接的治理结构:

  • 入口层:APISIX 负责识别流量、切分流量、送入正确运行面
  • 运行空间层:ACK 中的 green-microsvc / blue-microsvc 承接不同蓝绿工作负载
  • 内部发现层:Nacos 负责 Dubbo consumer/provider 的注册与发现边界

7.4 平台收益:入口层第一次成为平台治理对象

最后一个更长期的收益,是入口层本身终于进入了平台治理范围。

这意味着它后面不仅可以承接蓝绿与灰度,还可以继续向下演进:

  • 更标准化的发布策略
  • 更系统化的访问控制
  • 更清晰的入口可观测
  • 更细粒度的限流、熔断与策略治理
  • 和 GitOps、自动化发布链路更自然地集成

小结

所以如果一定要总结这次入口治理升级带来的实际收益,我更愿意这样表述:

APISIX 带来的最大变化,不是“流量可以切了”,而是入口层第一次开始以规则化、可复用、可自动化的方式参与微服务运行时治理。

8. 结语:APISIX 不是终点,而是发布治理与运行时边界的入口起点

回头看这次入口治理升级,我们越来越明确地意识到:真正被替换掉的,并不是某一种反向代理配置方式,而是一种已经不再适合微服务平台阶段的入口模型。

在旧模型里,入口层更多解决的是“请求怎么被转发”;而在 APISIX 模型里,入口层开始解决的是:

  • 流量应该如何被识别
  • 请求应该进入哪组运行面
  • 蓝绿和灰度边界如何在第一跳成立
  • 入口层边界如何和后续工作负载与服务发现边界衔接

也正因为这样,APISIX 在这里的意义并不只是“替换 Nginx”,而是让入口层第一次真正成为微服务平台的一部分。

如果说第一篇 Nacos 解决的是:

  • 服务怎么跑
  • 服务在哪里被发现

第二篇 ACK 解决的是:

  • 这些服务运行在一个什么样的平台上

那么这一篇 APISIX 真正解决的就是:

  • 外部流量如何从进入系统的第一跳开始,就进入正确的运行时边界

从这个角度看,APISIX 在这里同样不是终点。它更像是后续很多能力得以继续成立的入口起点:

  • 蓝绿与灰度发布的标准化切流
  • 更细粒度的入口流量治理
  • 入口层可观测与策略治理
  • 与交付平台和 GitOps 的进一步集成
  • 更完整的微服务运行时闭环

所以如果要用一句话来总结这次改造,我更愿意这样说:

真正成熟的微服务入口治理,不是把请求转发出去,而是让请求从进入系统的第一跳开始,就进入正确的运行时边界。

小结

这次 APISIX 改造最值得复盘的,不是“用了一个新的网关”,而是入口层的治理模型发生了变化:

  • 入口层从代理器,变成了运行时边界的第一层
  • route、service、upstream 三层拆分,让蓝绿切流真正可治理
  • 入口流量、运行空间、内部服务发现开始形成连续边界
  • APISIX、ACK、Nacos 三者开始构成前后衔接的治理结构

延伸阅读

  • 下一篇会继续写指标、日志、链路三层可观测平台建设
  • 蓝绿切流为什么必须和内部运行时边界一起成立
  • APISIX、ACK、Nacos、可观测为什么其实是一条连续演进路径
0

评论区