【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:限流、熔断、降级
相关推荐
这个DBA有点耶2 小时前
SQL调优进阶:从“优化一条SQL”到“优化一个系统”的思维升级
java·大数据·数据库·sql·程序人生·dba·改行学it
csdn2015_3 小时前
springboot读取配置的方法
java·spring boot·spring
AOwhisky3 小时前
下一代容器来了?Docker 宣布原生支持 WebAssembly
java·运维·docker·容器·rust·wasm
云云只是个程序马喽5 小时前
海外短剧平台搭建方案:私有化源码系统选型|云微短剧系统技术架构拆解
java·php
C137的本贾尼6 小时前
第七篇:消息队列(MQ)——就是个带存储的异步通信管道
java·开发语言·中间件
Flittly6 小时前
【AgentScope Java新手村系列】(19)多模态-图像音频视频
java·spring boot·spring
Javatutouhouduan6 小时前
国内大厂Java面试高频题库(2026突击版)
java·架构师·java面试·java面试题·后端开发·java程序员·java八股文
Tim_106 小时前
【C++】017、new/delete与malloc/free的区别
java·数据结构·算法
青山木6 小时前
一把 Redis 分布式锁,踩透四个坑:锁争抢、僵尸锁、锁过期、锁丢失
java·数据库·redis·后端
Java内核笔记7 小时前
万字避坑!Spring Boot 3.x 升 4.0 最全升级指南(附 Migration Checklist,建议收藏⭐)
java·后端