【运维读懂 Spring Cloud Gateway】

提示:本文原创作品,良心制作,干货为主,简洁清晰,一看就会

文章目录

  • 前言
  • [一、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交互,再根据不同条件把请求转发到不同目标

  1. 客户端 :用户/浏览器,只访问网关,不直接请求后端服务

  2. Spring Cloud Gateway(网关):整个系统入口,接收客户端所有请求

    • 网关会连接 Nacos :做服务发现,获取微服务实例地址(对应配置里的lb://
    • 根据Host域名、请求路径做路由匹配,转发到不同后端
  3. 第一条:域名匹配 *.test.org

    客户端访问域名是xxx.test.org,网关转发到百度 https://www.baidu.com

  4. 第二条:路径匹配 /httpbin/开头

    请求路径以/httpbin/开头,网关去掉第一层/httpbin,转发到 http://httpbin.org

    http://httpbin.org开源免费的 HTTP 测试服务网站,专门用来调试、测试 HTTP 请求,相当于一个 "镜子服务器":你发什么请求给它,它就把收到的全部信息(请求头、参数、IP、body)以 JSON 返回给你)

  5. 第三条:路径匹配 /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%原创,转载请务必标注原创作者,尊重劳动成果。

求赞、求关注、求评论!你的支持是我更新的最大动力,评论区等你~

相关推荐
Raas1001 天前
MAI Gateway(魔芋企业级AI网关):企业AI网关的合规审计与调用留痕设计
大数据·人工智能·gateway·企业·api网关·mai gateway·企业级网关
Sammyyyyy1 天前
AI Gateway 与直连 LLM API 的应该怎么选,一篇文章说明白
人工智能·ai·gateway·ai编程·ai-native·servbay
snow@li1 天前
Gateway网关全景深度分析:外部请求进入微服务全链路解析
gateway
Raas1002 天前
MAI Gateway(魔芋企业级AI网关):私有化部署的身份同步与数据内控设计
网关·网络安全·大模型·gateway·mai gateway·企业级网关
dogstarhuang2 天前
实战:用 API 网关统一接入 GPT-5.6,多模型路由怎么省下 80% 成本
网络·gpt·大模型·api网关·ai推理·模型选型·按量计费
Raas1006 天前
MAIGateway,魔芋企业级AI网关的安全基建化设计
大数据·人工智能·网关·网络安全·api网关·mai gateway·魔芋
aFakeProgramer8 天前
S‑CORE someip‑gateway 上手文档
gateway
智码看视界9 天前
Day46—Spring Cloud Gateway:路由/过滤器/限流全攻略
java·gateway·限流·微服务网关·过滤器链