Spring Cloud Gateway 是 微服务项目里的网关。
Gateway 是整个微服务系统的"大门"。
外部请求先进入 Gateway,再由 Gateway 转发到具体的服务,比如
order、stock。
1. 为什么需要 Gateway?
假设你现在有两个服务:
order 服务:localhost:8081
stock 服务:localhost:8082
没有 Gateway 时,前端要自己记住每个服务地址:
下单接口:http://localhost:8081/order/add
扣库存接口:http://localhost:8082/stock/reduct
服务一多,就会很乱:
user-service
order-service
stock-service
pay-service
coupon-service
前端不应该关心这么多服务地址。
所以需要一个统一入口:
前端 / 浏览器 / Postman
↓
Spring Cloud Gateway
↓
具体微服务
2. Gateway 的核心作用
Spring Cloud Gateway 主要做这几件事:
1. 统一入口
2. 请求转发
3. 路由匹配
4. 权限校验
5. 跨域处理
6. 限流
7. 日志记录
对初学者来说,先重点理解前两个:
统一入口 + 请求转发
3. 放到 order + stock 项目里理解
原来你可能是这样访问 order 服务:
http://localhost:8081/order/add
有了 Gateway 之后,可能变成:
http://localhost:9000/order/add
然后 Gateway 自动转发给 order-service。
整体流程是:
浏览器 / Postman
↓
请求 http://localhost:9000/order/add
↓
Gateway 网关
↓
转发到 order-service
↓
OrderController.add()
所以用户不需要知道 order-service 真正跑在哪个端口。
4. Gateway 和 Nacos 的关系
Nacos 负责:
服务注册与发现
也就是告诉别人:
order-service 在哪里
stock-service 在哪里
Gateway 可以结合 Nacos 使用。
比如:
order-service 注册到 Nacos
stock-service 注册到 Nacos
gateway 也注册到 Nacos
然后 Gateway 转发请求时,不需要写死:
http://localhost:8081
而是可以写服务名:
lb://order-service
这里的 lb 是:
load balance,负载均衡
意思是:
去 Nacos 找 order-service,然后转发过去。
5. Gateway 配置例子
假设 Gateway 服务的端口是 9000。
application.yml 可以这样写:
server:
port: 9000
spring:
application:
name: gateway-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
gateway:
routes:
- id: order-route
uri: lb://order-service
predicates:
- Path=/order/**
- id: stock-route
uri: lb://stock-service
predicates:
- Path=/stock/**
这段配置的意思是:
如果请求路径是 /order/**,就转发到 order-service
如果请求路径是 /stock/**,就转发到 stock-service
6. 几个核心概念
Route:路由
- id: order-route
Route 就是一条转发规则。
意思是:
满足某个条件的请求,要转发到哪里。
Predicate:断言 / 匹配条件
predicates:
- Path=/order/**
Predicate 用来判断这个请求是否符合条件。
比如:
/order/add
/order/list
/order/detail
这些都符合:
Path=/order/**
所以会被转发到 order-service。
URI:转发目标
uri: lb://order-service
表示请求最终转发到哪里。
其中:
lb://order-service
表示:
从 Nacos 里找名为
order-service的服务,并进行负载均衡转发。
Filter:过滤器
Gateway 还可以在请求转发前后做一些处理。
比如:
请求进来之前:检查 token、记录日志、限流
请求返回之后:统一添加响应头、记录耗时
这就是 Filter。
你可以理解成:
Filter 是网关上的"安检"。
7. Gateway 和 OpenFeign 的区别
这个很重要。
| 组件 | 谁调用谁 | 作用 |
|---|---|---|
| Gateway | 外部用户调用微服务 | 系统统一入口 |
| OpenFeign | 一个微服务调用另一个微服务 | 服务内部调用 |
比如:
浏览器 → Gateway → order-service
这里用 Gateway。
order-service → stock-service
这里用 OpenFeign。
所以在你的项目里:
用户访问 order:通过 Gateway
order 调用 stock:通过 OpenFeign
服务地址发现:通过 Nacos
8. Gateway 在项目里的位置
项目结构可能变成:
xs-springcloudalibaba
├── gateway
├── order
└── stock
其中:
gateway:网关服务
order:订单服务
stock:库存服务
请求流程变成:
浏览器 / Postman
↓
gateway-service:9000
↓
order-service:8081
↓
OpenFeign
↓
stock-service:8082
9. 一个完整请求例子
你访问:
http://localhost:9000/order/add
执行过程是:
1. 请求先进入 Gateway
2. Gateway 发现路径是 /order/add
3. 匹配到 Path=/order/**
4. Gateway 去 Nacos 找 order-service
5. Gateway 把请求转发给 order-service
6. order-service 执行 OrderController.add()
7. order-service 通过 OpenFeign 调用 stock-service
8. stock-service 扣库存
9. 结果返回给 order-service
10. order-service 再通过 Gateway 返回给浏览器
10. 总结
Spring Cloud Gateway 是微服务系统的统一入口。
你可以这样记:
Nacos:服务注册与发现
OpenFeign:服务之间互相调用
Gateway:外部请求统一入口
Seata:分布式事务
Sentinel:限流、熔断、降级