【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:限流、熔断、降级
相关推荐
小的~~1 小时前
Java线程及线程池的相关的问题
java·开发语言·多线程
江华森2 小时前
Nacos 微服务注册与配置中心深度学习指南
微服务·云原生·架构
人道领域2 小时前
一篇文章解决Codex的安装,实操一遍过
java·开发语言·codex
郑州光合科技余经理2 小时前
海外版外卖系统:如何快速搭建国际化外卖平台
java·开发语言·前端·人工智能·小程序·系统架构·php
Yvonne爱编码2 小时前
JAVA EE初阶---DAY 1 计算机是如何工作的
java·java-ee
用户7508837061952 小时前
大二的我手写了一把内存锁,最后却败给了 MySQL 的 MVCC?
java
plainGeekDev2 小时前
Handler/Looper → Coroutines
android·java·kotlin
lulu12165440782 小时前
2026年-企业级大模型API网关实战指南: 微元算力聚合平台性能优化实测
java·人工智能·spring·性能优化·ai编程
ai_coder_ai2 小时前
如何在自动化脚本中实现定时操作?
java·前端·javascript