微服务架构辨析:负载均衡、API网关、路由分发与鉴权,你真的分得清吗?
引言
在微服务架构和分布式系统的日常开发中,负载均衡、API网关、路由分发、鉴权 这些术语经常被提及。很多开发者容易陷入一个误区:认为网关带负载均衡,所以它们是一回事;或者把路由和负载均衡混为一谈。
本文将通过清晰的层级、生动的类比和对比表格,帮你彻底理清这四个核心概念的职责、关系与差异。
一、先分清流量分流、路由与负载均衡
在开始之前,必须先理清一个包含关系:流量分流是总称,路由分发和负载均衡都是它的具体实现,但二者目的完全不同。
1.1 流量分流 —— 大概念
只要是把请求流量拆开,导向不同的目标,都叫流量分流,常见有三类:
- 路由分流:按业务接口拆开,
/order走订单服务,/goods走商品服务。 - 灰度分流:10%用户访问新版本,90%访问旧版本。
- 负载均衡分流:同一服务的多个实例之间均分流量,避免单点压力。
1.2 路由分发 ≠ 负载均衡
很多混淆就出在这里,其实它们是微服务调用的 前后两步:
- 路由分发(Routing)
作用:根据请求 URL / Header 等,匹配到对应的业务服务集群。
例如:/api/order/**→ 订单服务集群,/api/goods/**→ 商品服务集群。
核心:按业务分类,选择“服务组”。 - 负载均衡(Load Balancing)
作用:在同一个服务集群内,挑一台具体的机器实例。
前提:路由已经选定了某个服务集群(比如订单集群有3台实例),再通过轮询、最小连接数、IP哈希等算法,把请求转发给其中一台。
核心:同一业务的多台副本之间均分流量,选择“集群内的单台机器”。
完整流程举例:
用户请求 /api/order/create
1. 网关先做 路由分发:匹配到 /api/order/**,确定转发给“订单服务集群”。
2. 再执行 负载均衡:在订单集群的3台实例中,根据轮询算法挑选一台机器,把请求转发过去。
类比
- 路由 = 商场导览台:买家电去3号区,买服装去2号区。
- 负载均衡 = 家电区收银台分流:该区有3个收银台,顾客轮流分配,不会让某一个排队爆满。
一句话总结:路由是“分到哪个业务”,负载均衡是“业务内部分给哪台机器”,两者搭配但完全不是一回事。
二、API网关 vs 负载均衡:层级与职责天差地别
2.1 核心定位不同
- 负载均衡:只是一个流量分发算法/能力,目标是把流量均匀分给多台相同的服务实例,解决单机压力过大和故障转移问题。它可以独立存在,如 Nginx、Feign、Ribbon。
- API网关:是整个系统的统一流量入口服务,而负载均衡只是它自带的基础功能之一。网关承载了鉴权、路由、限流、熔断、日志、灰度发布、跨域处理等一整套公共逻辑。
2.2 实际项目中的两层负载均衡
以一个典型的商城微服务架构为例:
第一层:网关层(Spring Cloud Gateway / Nginx)
用户请求先打到网关,这是对外的唯一大门:
- 统一身份认证(鉴权)、跨域、限流、日志;
- 路由分发:/api/order 转给订单服务,/api/goods 转给商品服务;
- 负载均衡:转发时,从后端服务集群中按算法挑一台实例。
第二层:服务间远程调用(OpenFeign + Ribbon/LoadBalancer)
微服务内部调用时,例如订单服务调用商品服务,由 Feign 自带的负载均衡组件完成实例选择,整个过程不经过网关。
2.3 功能对比表
| 对比维度 | 负载均衡 | API网关 |
|---|---|---|
| 核心定位 | 流量分发算法/单一能力 | 微服务统一入口,全能中间件 |
| 核心功能 | 仅分配请求到多实例,均衡压力 | 路由分发、负载均衡、统一鉴权、限流熔断、灰度发布、跨域、日志、请求转换 |
| 能否独立存在 | 可以。Nginx、Feign 单独提供负载均衡 | 不能脱离负载均衡,分发流量必须依赖均衡算法 |
| 处理范围 | 只解决“多实例分流”一件事 | 处理所有微服务通用前置逻辑,抽离公共代码 |
| 使用层级 | 1. 网关转发后端服务 2. 微服务内部 RPC 调用 |
面向前端/外部用户的统一入口 |
| 典型产品 | Nginx、Feign、Ribbon、HAProxy | Spring Cloud Gateway、Zuul、Kong、APISIX |
2.4 生活化类比
- 负载均衡 = 食堂里的分菜窗口分配规则。有3个一模一样的打菜窗口,规定“来一个人按顺序轮换窗口”,只负责均匀分流,不管你是谁、不管有没有排队限流。
- API网关 = 食堂大门口的保安 + 总调度台。
1. 进门先查饭卡(统一认证);
2. 根据你要买的餐品指路:面食去1号窗、套餐去2号窗(路由);
3. 指路时顺带控制每个窗口人数均匀(内置负载均衡);
4. 高峰期限制进入人数(限流);
5. 记录进出记录(日志);
可以看到,负载均衡只是保安工作里的一小步,保安(网关)要做的事情多得多。
2.5 常见误区澄清
- 误区1:网关带负载均衡,两者就是一样
错。负载均衡是通用基础能力,Nginx、Feign、注册中心都有,不是网关的专利;网关是集成多种公共能力的入口服务,负载均衡只是其中之一。 - 误区2:没有网关就不能负载均衡
错。单体集群用 Nginx 直接做负载均衡,没有网关;微服务内部 Feign 调用自带负载均衡,也不经过网关。 - 误区3:负载均衡=路由
错。路由区分不同业务接口,负载均衡是同一业务多副本之间分配请求。
三、鉴权:API网关的核心职责之一
3.1 鉴权是什么?
字面拆解:鉴 = 查验、核对;权 = 访问权限。
鉴权 = 校验当前用户有没有资格访问这个接口/页面/资源
开发中的完整含义包括两步:
1. 认证(Authentication):你是谁 —— 登录校验,确认身份合法性。
2. 授权(Authorization):你能干什么 —— 权限校验,确认操作范围。
日常统称为“鉴权”。
生活类比:小区门禁系统
- 刷身份证进门岗(认证:确认你是小区住户)
- 只有你家楼栋的电梯能刷开(授权:不能进别人单元)
整套流程就是鉴权。
3.2 网关统一鉴权的流程
结合你的微服务项目,用户请求 http://域名/api/order/create 到达网关后:
第一步:身份认证
从请求头中取出 token,到 Redis / 认证服务中进行校验:
- token 有效且未过期 → 身份合法,放行;
- 没有 token、token 过期或伪造 → 直接返回 401 Unauthorized,不转发到订单服务。
第二步:权限授权
登录成功后,查询该用户的角色或权限标识:
- 普通用户只允许查询订单,没有创建权限 → 网关拦截,返回 403 Forbidden;
- 管理员允许创建、删除订单 → 放行到后端服务。
3.3 为什么鉴权放在网关?
- 统一拦截:所有外部请求在网关处集中校验,一处控制全部接口。
- 避免重复:商品、订单、支付等微服务不需要各自写一遍登录和权限代码。
- 安全与性能:未登录/无权限的请求在网关层就被拦截,避免无效流量打到后端服务,节省资源。
3.4 常见鉴权方案
- Token 鉴权(JWT/自定义令牌):登录后返回 token,后续请求在 Header 中携带,网关校验。分布式微服务主流方案。
- Session 认证:服务器端存储会话,单体项目常用,分布式环境下需额外处理会话共享,不推荐。
- OAuth2.0:第三方授权登录,如微信、QQ、支付宝快捷登录。
3.5 两个关键 HTTP 状态码
- 401 Unauthorized:未鉴权(没登录、token 无效或过期)。
- 403 Forbidden:鉴权通过(已登录),但当前角色没有访问该接口的权限。
四、总结:一张图理清所有关系
我们把整个链路串起来:
- 外部请求 → 到达 API网关 (统一入口)
- 网关做 鉴权 (认证+授权),不合法直接返回 401/403
- 通过后,网关根据 URL 做 路由分发 (选服务集群:订单/商品/支付)
- 针对选中的集群,执行 负载均衡 (从多台实例中挑一台)
- 转发请求到具体实例,后微服务内部调用时,也由 Feign 自带负载均衡 完成分流
核心关系图(抽象):
流量分流
├── 路由分流(按业务划分,非负载均衡)
└── 负载均衡分流(同一服务多副本均分流量)
├── 网关侧负载均衡(对外入口)
└── 服务间调用负载均衡(Feign/Ribbon)
负载均衡 是一种流量分流的策略,而 API网关 是一个集成了路由、鉴权、负载均衡等能力的综合服务。
理解这些概念的边界,能让你在微服务架构设计中更清晰地划分职责,避免重复造轮子和无效沟通。
更多推荐
所有评论(0)