【JAVA】Java微服务—网关Gateway

Spring Cloud Gateway微服务项目里的网关

Gateway 是整个微服务系统的"大门"。

外部请求先进入 Gateway,再由 Gateway 转发到具体的服务,比如 orderstock


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:限流、熔断、降级
相关推荐
白鲸开源4 小时前
Apache SeaTunnel Zeta Engine 的 Basic Auth 是怎么工作的?
java·vue.js·github
白鲸开源4 小时前
一文读懂DolphinScheduler插件机制:如何轻松扩展任务类型与数据源
java·架构·github
用户298698530148 小时前
Java 实现 Word 文档文本查找与高亮标注
java·后端
宇宙之一粟9 小时前
乐企版式文件生成平台
java·后端·python
plainGeekDev10 小时前
MVC 写法 → MVVM
android·java·kotlin
SL_staff10 小时前
3周搭完MES系统:JVS低代码+JVS-IoT物联网的实战记录
java·前端·低代码
MacroZheng10 小时前
斩获20w star!Claude Code最强插件,AI编程必备!
java·人工智能·后端
唐青枫12 小时前
Java Spring WebFlux 实战指南:用 Mono、Flux 和 WebClient 写响应式接口
java·spring
小bo波1 天前
使用Thread子类创建线程 VS 使用Runnable接口创建线程的区别
java·多线程·thread·并发编程·runnable
SamDeepThinking1 天前
高并发场景下,CompletableFuture与ForkJoinPool该如何取舍?
java·后端·面试