提示:本文原创作品,良心制作,干货为主,简洁清晰,一看就会
文章目录
- 前言
- [一、Spring Cloud Gateway基础](#一、Spring Cloud Gateway基础)
-
- [1.1 Spring Cloud Gateway是什么](#1.1 Spring Cloud Gateway是什么)
- [1.2 Spring Cloud Gateway作用](#1.2 Spring Cloud Gateway作用)
- [1.3 Spring Cloud 微服务架构图](#1.3 Spring Cloud 微服务架构图)
- [1.4 Spring Cloud Gateway路由配置](#1.4 Spring Cloud Gateway路由配置)
- [二、Spring Cloud Gateway结合Nacos的JAVA综合项目](#二、Spring Cloud Gateway结合Nacos的JAVA综合项目)
-
- [2.1 环境准备](#2.1 环境准备)
- [2.2 实现目标](#2.2 实现目标)
- [2.3 配置gateway](#2.3 配置gateway)
- [2.4 访问测试](#2.4 访问测试)
前言
在微服务架构中,API 网关是整个集群的统一流量入口,所有外部请求都会经过网关再分发到各个后端微服务
本文讲解 Gateway 基础概念与 Nacos 结合实操,帮助运维读懂网关路由逻辑。本文面向运维人员,不侧重 Java 代码开发,重在理解网关工作原理、读懂路由配置,理清请求转发流程,为日常故障排查、问题定位储备基础能力
一、Spring Cloud Gateway基础
1.1 Spring Cloud Gateway是什么
Spring Cloud Gateway 是Spring Cloud 官方的API网关组件。它是非阻塞、响应式网关,底层使用Netty,不依赖Servlet容器
微服务系统里,各个业务服务独立部署,有很多IP+端口。如果客户端(前端APP、小程序、第三方)直接调用每个微服务:
1、客户端要维护一堆服务地址
2、鉴权、限流、日志每个服务重复写一遍
3、无法统一管控接口、路由、安全策略
API网关就是所有请求的统一入口,所有外部请求先打到Gateway,网关再转发到后端各个微服务,内部服务之间互相调用一般不走网关
1.2 Spring Cloud Gateway作用
请求路由(最核心)
根据请求的URL、Header、参数等条件,把请求转发到对应的微服务实例
对接Nacos,直接写服务名,不需要硬写IP端口
示例:访问 /user/** → 转发到用户服务;/order/** →转发到订单服务
统一入口,隔离内部服务
所有外部流量只暴露网关,后端微服务不对外公开端口,只在内网可访问
全局过滤器能力(Filter)
网关层统一处理横切逻辑,不用每个微服务重复开发
流量管控
限流:针对IP、用户、接口做流量限制,保护后端微服务不被打垮
熔断降级:后端服务故障时,网关直接返回降级结果,防止雪崩
请求改写
改写路径、重定向、剥离前缀
例如客户端访问http://gateway/user/getUser,网关去掉/user前缀转发给user服务http://user-service/getUser
1.3 Spring Cloud 微服务架构图
典型微服务调用链路:前端/App → Spring Cloud Gateway(网关) → Nacos服务发现 → 用户服务 / 订单服务 /商品服务...

1.4 Spring Cloud Gateway路由配置
Route(路由) :路由规则,包含ID、目标URI、断言集合、过滤器集合。一条路由就是一条转发规则
Predicate(断言) :匹配条件。HTTP请求过来,满足断言条件,才命中这条路由。可以匹配路径、Header、请求方法、时间等
Filter(过滤器):请求转发之前/之后执行处理逻辑,分为全局过滤器GlobalFilter、路由局部过滤器

例如某微服务项目中的application.yml内容
yaml
server:
port: 10010 #网关端口
spring:
application:
name: gateway #服务名称
cloud :
nacos:
server-addr: localhost:8848 # nacos地址
gateway:
routes: #网关路由配置
- id: user-service #路由id,自定义值,必须唯一
uri: lb://userservice #路由的目标地址Lb表示负载均衡,后面跟Nacos中微服务名称
# uri: http://127.0.0.1:8081 #路由的目标地址,如果使用 http表示固定地址
predicates: #路由断言,判断请求是否符合路由规则的条件
- Path=/user/** #这个是按照路径匹配,只要以/user/开头就符合要求 http://127.0.0.1:10010/user/xxx/yyy
- id: order-service
uri: lb://orderservice
predicates:
- Path=/order/**
filters:
- StripPrefix=1 #从请求路径中删除第一个前缀/order,再转发给后端
二、Spring Cloud Gateway结合Nacos的JAVA综合项目
2.1 环境准备
| 主机名 | IP地址 | 作用说明 |
|---|---|---|
| client | 192.168.13.138 | 模拟客户端访问微服务 |
| gateway | 192.168.13.139 | |
| nacos | 192.168.13.140 | 运行 Nacos 服务,提供服务注册与发现、配置管理功能 |
| producer | 192.168.13.141 | 生产者 |
| consumer | 192.168.13.142 | 消费者,模拟微服务通过nacos进行调用 |
现有生产者、消费者两个服务,二者自动注册到 Nacos;消费者配置了生产者服务名,通过 Nacos 完成服务发现,调用生产者,如下:
生产者,消费者java程序:https://blog.csdn.net/m0_63756214/article/details/163700116?spm=1001.2014.3001.5501
yaml
## 1. 运行生产者程序
root@producer:~# java -jar sentinel-web-test-1.0-SNAPSHOT.jar
## 2. 访问生产者
root@client:~# curl 192.168.13.141:8080/hello
Hello ! I am producer ! 请求通过了!
## 3. 运行消费者程序
root@consumer:~# java -jar sentinel-consumer-1.0-SNAPSHOT.jar
## 4. 访问消费者的/call接口,即可调用生产者服务。消费者本身无页面展示,返回内容由生产者提供
root@client:~# curl 192.168.13.142:8080/call
Hello ! I am producer ! 请求通过了!

2.2 实现目标
现在我们要利用gateway实现以下效果:
客户端 → Spring Cloud Gateway网关,网关会和Nacos交互,再根据不同条件把请求转发到不同目标
-
客户端 :用户/浏览器,只访问网关,不直接请求后端服务
-
Spring Cloud Gateway(网关):整个系统入口,接收客户端所有请求
- 网关会连接 Nacos :做服务发现,获取微服务实例地址(对应配置里的
lb://) - 根据Host域名、请求路径做路由匹配,转发到不同后端
- 网关会连接 Nacos :做服务发现,获取微服务实例地址(对应配置里的
-
第一条:域名匹配
*.test.org客户端访问域名是
xxx.test.org,网关转发到百度https://www.baidu.com -
第二条:路径匹配
/httpbin/开头请求路径以
/httpbin/开头,网关去掉第一层/httpbin,转发到http://httpbin.org(http://httpbin.org开源免费的 HTTP 测试服务网站,专门用来调试、测试 HTTP 请求,相当于一个 "镜子服务器":你发什么请求给它,它就把收到的全部信息(请求头、参数、IP、body)以 JSON 返回给你)
-
第三条:路径匹配
/api开头请求以
/api开头,网关向Nacos查询consumer‑web服务实例,去掉/api前缀,转发给微服务consumer‑web

2.3 配置gateway
yaml
## 1. 首先要准备jdk,maven环境
root@gateway:~# java --version
java 21.0.12 2026-07-21 LTS
Java(TM) SE Runtime Environment (build 21.0.12+7-LTS-205)
Java HotSpot(TM) 64-Bit Server VM (build 21.0.12+7-LTS-205, mixed mode, sharing)
root@gateway:~# mvn -v
Apache Maven 3.9.16 (2bdd9fddda4b155ebf8000e807eb73fd829a51d5)
Maven home: /usr/local/java/maven
Java version: 21.0.12, vendor: Oracle Corporation, runtime: /usr/local/java
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.15.0-213-generic", arch: "amd64", family: "unix"
yaml
root@gateway:~# mkdir ~/sentinel-gateway/src/main/java/com/example/gateway -p
root@gateway:~# cd sentinel-gateway/
## 2. 编写pom.xml
root@gateway:~/sentinel-gateway# vim pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>sentinel-gateway</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.13</version>
</parent>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2021.0.5</spring-cloud.version>
<spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- Spring Cloud Gateway 依赖(内部使用 WebFlux,不包含 Tomcat) -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- Nacos 服务发现(用于 lb:// 负载均衡) -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 可选:如果需要读取 Nacos 配置中心,可添加 config 依赖(但您目前只需 discovery) -->
<!-- <dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency> -->
<!-- 负载均衡器(Gateway 默认使用 ReactiveLoadBalancer) -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
yaml
## 3. 创建GatewayApplication.java
root@gateway:~/sentinel-gateway# vim src/main/java/com/example/gateway/GatewayApplication.java
package com.example.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient // 开启 Nacos 服务发现
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
yaml
## 4. 创建application.yml
root@gateway:~/sentinel-gateway# mkdir src/main/resources/
root@gateway:~/sentinel-gateway# vim src/main/resources/application.yml
server:
port: 8000
spring:
application:
name: spring-cloud-gateway-demo
cloud:
nacos:
discovery:
server-addr: www.nacos.com:8848 # nacos服务器地址,可以直接用 IP,避免域名解析问题
config:
server-addr: www.nacos.com:8848 # 如果不需要配置中心,注释掉
gateway:
routes:
- id: baidu
uri: https://www.baidu.com
predicates:
- Host=*.test.org # 当请求的 Host 头匹配 *.test.org 时转发到百度
- id: httpbin
uri: http://httpbin.org
predicates:
- Path=/httpbin/** # 要网关收到请求路径以 /httpbin/ 开头,匹配这条路由
filters:
- StripPrefix=1 # 将 /httpbin/xxx 转为/xxx
- id: consumer-web
uri: lb://consumer-web # 消费者服务名
predicates:
- Path=/api/** # 要网关收到请求路径以 /api/ 开头,匹配这条路由
filters:
- StripPrefix=1 # 将 /api/xxx 转为 /xxx 后转发给消费者
yaml
root@gateway:~/sentinel-gateway# mvn clean package
root@gateway:~/sentinel-gateway# ls target/
classes maven-archiver sentinel-gateway-1.0-SNAPSHOT.jar
generated-sources maven-status sentinel-gateway-1.0-SNAPSHOT.jar.original
root@gateway:~/sentinel-gateway# cp target/sentinel-gateway-1.0-SNAPSHOT.jar /root
root@gateway:~/sentinel-gateway# cd
root@gateway:~# vim /etc/hosts # 添加一行,如果上面写的ip这一步可以不做
192.168.13.140 www.nacos.com
root@gateway:~# java -jar sentinel-gateway-1.0-SNAPSHOT.jar

2.4 访问测试
访问 *.test.org可以转到百度
yaml
root@client:~# curl -H"host: deom.test.org" http://192.168.13.139:8000

访问路径 /httpbin/开头则转发到 http://httpbin.org
yaml
root@client:~# curl http://192.168.13.139:8000/httpbin/get

访问请求以/api开头,转发给微服务consumer‑web
yaml
root@client:~# curl 192.168.13.139:8000/api/call
Hello ! I am producer ! 请求通过了!
至此,我们完成了 Gateway 的路由转发实验!
在真实生产环境中,Spring Cloud Gateway 的路由规则一般由开发人员编写实现。对于运维人员来说,很少需要亲自开发 Gateway 业务逻辑,我们只需要理解其原理、看懂路由配置即可
注:
文中若有疏漏,欢迎大家指正赐教。
本文为100%原创,转载请务必标注原创作者,尊重劳动成果。
求赞、求关注、求评论!你的支持是我更新的最大动力,评论区等你~