网关 Gateway 是什么?(测试)

这篇笔记主要记录我对“网关”的理解。

一句话概括:

网关就是系统的统一入口。所有请求进入后端系统之前,先经过网关,再由网关转发到对应的服务。

它主要解决的问题包括:

  • 服务太多,入口混乱
  • 前端不知道应该请求哪个后端服务
  • 权限校验、限流、日志等公共逻辑重复写
  • 内部服务不想直接暴露给外部
  • 服务扩容、迁移、灰度发布时不希望影响前端

可以把网关理解成一个系统的“总入口”或“前台接待”。外部请求先进来,网关判断这个请求该去哪,再把它转发到真正处理业务的服务。

一、没有网关会怎样?

假设系统里有多个后端服务:

用户服务:user-service:8081
订单服务:order-service:8082
文件服务:file-service:8083
支付服务:pay-service:8084

如果没有网关,前端可能要直接访问这些服务:

http://api.example.com:8081/user/info
http://api.example.com:8082/order/list
http://api.example.com:8083/file/upload
http://api.example.com:8084/pay/create

这样会带来几个问题:

  • 前端需要记住很多服务地址
  • 后端服务端口直接暴露在外部
  • 每个服务都要自己做登录校验
  • 每个服务都要自己做限流
  • 服务扩容、迁移后,前端也可能要跟着改
  • 请求日志分散在各个服务里,不方便排查问题
  • HTTPS、跨域、安全策略等配置很难统一

有了网关之后,前端只需要访问一个统一入口:

https://api.example.com

然后由网关负责把请求转发到对应服务:

/api/user/**   -> user-service
/api/order/**  -> order-service
/api/file/**   -> file-service
/api/pay/**    -> pay-service

这样前端看到的是一个统一 API 地址,后端内部怎么拆服务、怎么扩容、怎么迁移,对前端的影响都会小很多。

二、网关主要解决什么问题?

1. 统一入口

没有网关时,请求链路可能是:

前端 -> 用户服务
前端 -> 订单服务
前端 -> 文件服务
前端 -> 支付服务

有网关后,请求链路变成:

前端 -> 网关 -> 各个后端服务

前端只需要知道一个地址:

https://api.example.com

这就是网关最基础的作用:把分散的服务入口收拢成一个统一入口。

2. 路由转发

网关会根据请求路径,把请求转发到不同服务。

例如:

/api/user/login     -> 用户服务
/api/order/create   -> 订单服务
/api/file/upload    -> 文件服务
/api/pay/create     -> 支付服务

这就叫路由。

类比一下公司前台:

你办人事业务 -> 前台带你去人事部
你办财务业务 -> 前台带你去财务部
你办仓库业务 -> 前台带你去仓库

网关做的事情也类似:根据请求的内容,找到真正应该处理它的服务。

3. 统一鉴权

没有网关时,每个服务都可能要重复写这些逻辑:

  • 检查 token
  • 检查登录状态
  • 检查用户权限
  • 检查接口是否允许访问

有网关后,可以先在网关统一判断:

请求进入系统
  ↓
网关检查 token
  ↓
通过:转发到后端服务
不通过:直接返回 401

这样很多公共逻辑就不用在每个业务服务里重复写了。

4. 统一限流

比如我们想限制:

  • 某个 IP 每秒最多访问 10 次
  • 某个用户每分钟最多请求 100 次
  • 登录接口每秒最多请求 5 次

如果没有网关,每个服务都要自己实现限流。

有网关后,可以在入口统一限制:

请求太频繁
  ↓
网关直接拦截
  ↓
后端服务不被打爆

这类能力在高并发系统里很重要。

5. 负载均衡

一个服务可能会部署多个实例:

user-service-1:8081
user-service-2:8081
user-service-3:8081

网关可以把请求分发到不同实例上:

第 1 个请求 -> user-service-1
第 2 个请求 -> user-service-2
第 3 个请求 -> user-service-3

这样可以分摊服务器压力,提高系统整体吞吐能力。

6. 隐藏内部服务

有网关时,外部用户只知道:

https://api.example.com

但并不知道内部真实服务地址:

10.0.0.11:8081
10.0.0.12:8082
10.0.0.13:8083

内部服务不直接暴露,安全性会更好。

7. 统一日志和监控

所有请求都会先经过网关,所以网关很适合统一记录请求信息,比如:

  • 谁访问了哪个接口
  • 请求耗时多少
  • 返回状态码是多少
  • 哪个接口访问量最大
  • 哪个 IP 请求异常
  • 哪个接口经常报错

这些信息对排查线上问题很有帮助。

8. 灰度发布

比如系统有两个版本:

旧版本:v1
新版本:v2

如果不想让所有用户一次性切到新版本,可以让网关控制流量比例:

90% 请求 -> v1
10% 请求 -> v2

也可以按用户类型控制:

测试账号 -> v2
普通用户 -> v1

这就是灰度发布。它可以降低新版本上线的风险。

9. 协议转换

有些网关还可以做协议转换:

HTTP -> gRPC
WebSocket -> 后端服务
HTTPS -> HTTP
外部 REST API -> 内部 RPC

也就是说,外部访问方式和内部服务之间的通信方式不一定要完全一样。

三、常见网关工具

1. Nginx

Nginx 是最常见的入口网关之一。

常见用途:

  • 反向代理
  • 负载均衡
  • 静态资源服务
  • HTTPS 终止
  • 简单限流
  • 路径转发

适合场景:

  • 单体项目
  • 前后端分离部署
  • 中小型系统
  • 普通反向代理
  • 静态资源网站

典型链路:

用户 -> Nginx -> Spring Boot
用户 -> Nginx -> Vue 静态页面

特点:

  • 性能强
  • 稳定
  • 配置相对简单
  • 但不太适合写复杂业务逻辑

2. OpenResty

OpenResty 可以理解成:

Nginx + Lua 编程能力

它比普通 Nginx 更灵活,可以通过 Lua 写代码处理请求。

适合场景:

  • 动态鉴权
  • 访问 Redis
  • 复杂限流
  • 灰度发布
  • 动态路由
  • 自定义网关逻辑

例如:

请求进来
  ↓
OpenResty 查询 Redis 判断 token
  ↓
通过后再转发给后端服务

特点:

  • 性能强
  • 可编程
  • 适合高并发网关
  • 但需要懂 Nginx 和 Lua

3. Spring Cloud Gateway

Spring Cloud Gateway 是 Java / Spring Cloud 生态里常用的网关,比较适合微服务系统。

主要能力:

  • 路由转发
  • 鉴权过滤器
  • 限流
  • 熔断
  • 重试
  • 服务发现
  • 和 Nacos / Eureka / Consul 集成

典型结构:

前端
  ↓
Spring Cloud Gateway
  ↓
用户服务 / 订单服务 / 文件服务

如果项目使用 Spring Cloud、Nacos、Sentinel,那么 Spring Cloud Gateway 是很常见的选择。

特点:

  • Java 生态友好
  • 容易写自定义逻辑
  • 适合微服务系统
  • 性能和资源占用通常不如 Nginx 轻

4. Kong

Kong 是一个成熟的 API 网关产品,底层和 OpenResty 关系比较深。

常见能力:

  • 路由
  • 鉴权
  • 限流
  • 日志
  • 插件
  • API 管理
  • 服务治理

适合场景:

  • 企业 API 网关
  • 多团队 API 管理
  • 插件化管理接口能力

特点:

  • 产品化程度高
  • 插件丰富
  • 适合企业 API 管理
  • 比自己写 OpenResty 更开箱即用

5. Apache APISIX

APISIX 也是高性能 API 网关,国内资料相对比较多。

常见能力:

  • 动态路由
  • 限流
  • 鉴权
  • 灰度发布
  • 服务发现
  • 插件扩展
  • 可观测性

适合场景:

  • 高性能 API 网关
  • 云原生系统
  • 微服务入口
  • Kubernetes 场景

特点:

  • 性能强
  • 动态配置能力好
  • 插件丰富
  • 国内资料相对多

6. Traefik

Traefik 在 Docker 和 Kubernetes 场景中比较常见。

它的特点是可以自动发现服务。比如你在 Docker 里启动了一个服务,Traefik 可以根据标签自动生成路由。

适合场景:

  • Docker
  • Kubernetes
  • 容器化部署
  • 自动服务发现

特点:

  • 配置自动化能力强
  • 对容器环境友好
  • 适合 DevOps / 云原生环境

7. Envoy

Envoy 是云原生领域很重要的代理 / 网关。很多 Service Mesh,比如 Istio,就大量使用 Envoy。

适合场景:

  • 大型微服务系统
  • Service Mesh
  • 服务间通信治理
  • 高级流量控制
  • 可观测性

特点:

  • 功能强
  • 适合大规模系统
  • 学习成本较高

8. Kubernetes Ingress Controller

如果服务部署在 Kubernetes 里,经常会用到 Ingress Controller。

常见实现:

  • Nginx Ingress Controller
  • Traefik Ingress
  • APISIX Ingress
  • Kong Ingress

它主要解决的问题是:

外部流量如何进入 Kubernetes 集群内部服务

典型结构:

用户
  ↓
Ingress Controller
  ↓
K8s Service
  ↓
Pod

四、这些网关大概怎么选?

1. 普通前后端分离项目

例如:

Vue + Spring Boot

一般可以先选:

Nginx

原因是够用、简单、稳定。

2. 需要在网关里写复杂逻辑

比如:

  • 查询 Redis 做鉴权
  • 动态限流
  • 灰度发布
  • 复杂请求改写

可以考虑:

OpenResty
APISIX
Kong

3. Java 微服务项目

例如:

Spring Cloud + Nacos + Sentinel

可以考虑:

Spring Cloud Gateway

原因是它和 Java / Spring Cloud 生态整合比较舒服。

4. Docker / Kubernetes 环境

可以考虑:

Traefik
Nginx Ingress
APISIX Ingress
Kong Ingress
Envoy

5. 企业 API 管理

如果需要这些能力:

  • API 鉴权
  • API 文档
  • 开发者管理
  • 插件管理
  • 调用统计
  • 多租户

可以考虑:

Kong
APISIX

五、网关可以分成几类?

1. Web 网关 / 反向代理网关

代表工具:

Nginx
OpenResty
Apache HTTP Server

主要解决:

  • 网站入口
  • 反向代理
  • HTTPS
  • 静态资源
  • 负载均衡

2. API 网关

代表工具:

Kong
APISIX
Spring Cloud Gateway

主要解决:

  • API 路由
  • 鉴权
  • 限流
  • 熔断
  • 灰度
  • API 管理

3. 云原生网关

代表工具:

Traefik
Envoy
Ingress Controller

主要解决:

  • 容器服务发现
  • Kubernetes 入口流量
  • 服务治理
  • 动态配置

4. Service Mesh 数据面代理

代表工具:

Envoy
Linkerd Proxy

主要解决:

  • 服务和服务之间的通信治理
  • 熔断
  • 重试
  • 链路追踪
  • 流量切分
  • 安全通信

这一类更偏大型微服务架构。

六、网关和 Nginx 是什么关系?

可以这样理解:

网关是一个角色 / 架构概念
Nginx 是实现网关的一种工具

类似:

数据库是概念
MySQL 是一种数据库

网关是概念
Nginx / Spring Cloud Gateway / Kong / APISIX 都可以做网关

所以不要把“网关”和“Nginx”完全等同。

Nginx 可以当网关,但网关不一定是 Nginx。

七、网关和注册中心是什么关系?

注册中心,比如:

Nacos
Eureka
Consul
Zookeeper

负责记录:

  • 现在有哪些服务
  • 每个服务在哪台机器
  • IP 是多少
  • 端口是多少
  • 是否健康

网关负责:

  • 接收用户请求
  • 根据路由找到对应服务
  • 把请求转发过去

两者配合起来的链路大概是:

用户请求
  ↓
网关
  ↓
从注册中心知道 user-service 有哪些实例
  ↓
转发到其中一个实例

所以可以这样记:

注册中心负责“服务在哪里”
网关负责“请求怎么进来、转发到哪里”

八、网关和负载均衡是什么关系?

负载均衡只是网关的一种能力。

网关通常可以做:

  • 路由
  • 鉴权
  • 限流
  • 日志
  • 监控
  • 灰度
  • 负载均衡

而负载均衡只关注一件事:

请求分给哪台服务器

所以:

负载均衡 ⊂ 网关能力

九、网关在系统中的位置

一个比较完整的系统链路可能是:

用户浏览器 / App
        ↓
CDN
        ↓
Nginx / OpenResty
        ↓
API 网关:Spring Cloud Gateway / Kong / APISIX
        ↓
业务服务:用户、订单、库存、支付
        ↓
数据库 / Redis / MQ

注意:真实项目里不一定每一层都有。

小项目可能是:

用户
 ↓
Nginx
 ↓
Spring Boot
 ↓
MySQL

中大型微服务项目可能是:

用户
 ↓
Nginx
 ↓
Spring Cloud Gateway
 ↓
多个微服务
 ↓
数据库 / Redis / MQ

十、我的理解总结

这句话最重要:

网关就是系统的统一入口,负责把请求安全、准确、高效地转发到后端服务。

从“解决问题”的角度看,可以这样记:

入口混乱       -> 统一入口
服务暴露       -> 隐藏内部服务
重复鉴权       -> 统一鉴权
请求太多       -> 限流
服务压力大     -> 负载均衡
上线有风险     -> 灰度发布
问题难排查     -> 统一日志和监控
前端调用复杂   -> 统一 API 地址

如果目前主要做 Spring Boot 项目,我觉得学习顺序可以是:

1. Nginx:先掌握反向代理、静态资源、HTTPS
2. Spring Cloud Gateway:再理解 Java 微服务网关
3. OpenResty / APISIX / Kong:有需要再深入

刚开始不要一上来就学 Kong、APISIX、Envoy,概念会比较多。先把 Nginx + Spring Boot 的请求转发链路 搞明白,网关这个概念基本就通了。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇