分布式架构-网关(Gateway)
如果是Java Web 前后端分离 + 分布式架构,网关(Gateway)是整个系统最重要的组件之一。
下面按照企业级项目来介绍,而不是物联网场景。
一、整体架构
用户 │ 浏览器(Vue/React) │ HTTPS │ ┌─────────────┐ │ Nginx/CDN │ └─────────────┘ │ ▼ ┌───────────────────┐ │ API Gateway 网关 │ │ Spring Cloud Gateway │ 或 APISIX/Kong └───────────────────┘ │ │ │ │ │ │ ▼ ▼ ▼ 用户服务 商品服务 订单服务 User Product Order │ │ │ └───────┼────────┘ │ MySQL/Redis │ Kafka/RabbitMQ二、为什么需要网关
如果没有网关:
Vue /user/login http://1.1.1.1:8081 /order/list http://1.1.1.2:8082 /product/list http://1.1.1.3:8083问题:
- 前端知道所有服务地址
- 服务增加需要修改前端
- 安全性差
- 权限不好控制
- 日志分散
所以增加 Gateway。
增加之后:
Vue /api/user/login /api/order/list /api/product/list │ ▼ Spring Cloud Gateway │ ├──User Service ├──Order Service └──Product Service前端永远只访问:
https://api.xxx.com三、Gateway职责
1、统一入口
所有请求:
浏览器 ↓ Gateway ↓ 微服务任何请求都必须经过Gateway。
2、路由转发
例如:
/user/**转发
user-service例如:
GET /api/user/listGateway
↓
http://user-service:8081/user/list3、身份认证
例如:
登录
POST /login返回
JWT以后
Authorization: Bearer xxxxxGateway先校验:
JWT是否合法合法
↓
继续
非法
↓
401
不用每个服务都校验。
4、权限控制
例如:
管理员:
ROLE_ADMIN普通用户:
ROLE_USERGateway直接拦截:
ROLE_USER ↓ 不能访问 /admin/**5、限流
例如:
1000 次/秒超过:
429 Too Many Requests保护后端。
一般结合 Redis。
6、黑名单
例如:
IP 192.168.xxx.xxxGateway:
拒绝7、日志
统一记录:
访问时间 IP URL 耗时 状态码 用户方便ELK分析。
8、灰度发布
例如:
10% ↓ 新版本 90% ↓ 旧版本Gateway控制。
9、负载均衡
例如:
User Service 8081 8082 8083Gateway:
轮询 ↓ 8081 ↓ 8082 ↓ 8083不用前端关心。
10、统一异常
返回:
{"code":401,"msg":"token expired"}所有服务统一。
四、Gateway与Nginx区别
| Nginx | Gateway |
|---|---|
| 七层代理 | API网关 |
| 静态资源 | 微服务入口 |
| HTTPS | JWT认证 |
| 反向代理 | 权限控制 |
| 负载均衡 | 限流 |
| gzip | 熔断 |
| SSL | 动态路由 |
| rewrite | 服务发现 |
企业通常两者配合使用:
浏览器 ↓ Nginx ↓ Gateway ↓ 微服务五、Gateway与注册中心
例如:
Gateway ↓ NacosGateway不知道IP。
只知道:
user-serviceGateway:
Nacos ↓ 获取 10.1.1.10 10.1.1.11 10.1.1.12动态路由。
六、Gateway过滤器
请求:
POST /order/create流程:
请求 ↓ GlobalFilter ↓ JWT ↓ 权限 ↓ 日志 ↓ 路由 ↓ Order Service ↓ 返回 ↓ GlobalFilter ↓ 响应日志 ↓ 浏览器过滤器就是AOP思想。
七、典型请求流程
浏览器 ↓ Nginx ↓ Gateway ↓ JWT校验 ↓ Redis查询用户 ↓ 限流 ↓ 日志 ↓ Nacos ↓ User Service ↓ MySQL ↓ 返回 ↓ Gateway ↓ 浏览器八、完整分布式架构
Internet │ HTTPS │ Nginx集群 │ ┌──────────┴──────────┐ │ │ Gateway1 Gateway2 │ │ └──────────┬──────────┘ │ Nacos │ ┌──────────────┼──────────────┐ │ │ │ User Service Order Service Product Service │ │ │ ├────Redis─────┤ │ │ │ │ └────Kafka─────┴──────────────┘ │ MySQLGateway可以部署多个实例,由 Nginx 或云负载均衡分发流量。
九、企业级网关设计
一个成熟的 Java 微服务网关通常具备以下能力:
| 功能 | 是否建议 |
|---|---|
| API 路由 | ✅ 必须 |
| JWT/OAuth2 鉴权 | ✅ 必须 |
| 服务发现(Nacos/Eureka) | ✅ 必须 |
| 负载均衡 | ✅ 必须 |
| 全局异常处理 | ✅ 必须 |
| 请求/响应日志 | ✅ 必须 |
| CORS 跨域处理 | ✅ 必须 |
| 限流(Redis) | ✅ 必须 |
| 熔断、降级、重试 | ✅ 建议 |
| 灰度发布、蓝绿发布 | ✅ 建议 |
| 链路追踪(TraceId) | ✅ 建议 |
| 接口版本管理 | ✅ 建议 |
| API 文档聚合 | ✅ 建议 |
| 黑白名单、IP 访问控制 | ✅ 建议 |
| 配置中心统一管理 | ✅ 建议 |
十、推荐技术栈(Java 后端)
当前主要做Java + Spring Boot开发,比较主流的一套企业级分布式架构是:
| 层级 | 推荐技术 |
|---|---|
| 前端 | Vue 3 + TypeScript + Vite |
| Web 服务器 | Nginx |
| API 网关 | Spring Cloud Gateway |
| 服务注册/配置中心 | Nacos |
| 微服务框架 | Spring Boot + Spring Cloud |
| 服务调用 | OpenFeign |
| 数据库 | MySQL |
| 缓存 | Redis |
| 消息队列 | Kafka(高吞吐)或 RabbitMQ(业务消息) |
| 搜索 | Elasticsearch(按需) |
| 分布式事务 | Seata(按需) |
| 链路追踪 | SkyWalking 或 OpenTelemetry |
| 日志 | ELK / EFK |
| 容器化 | Docker + Kubernetes(生产环境) |
智慧园区、停车场、门禁、设备管理等 Java 项目,这套架构也是业内比较常见的方案。即使项目不涉及物联网,也适用于 OA、ERP、商城、政务等前后端分离的分布式系统。
