惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

www.infosecurity-magazine.com
www.infosecurity-magazine.com
D
DataBreaches.Net
T
Tailwind CSS Blog
M
MIT News - Artificial intelligence
Stack Overflow Blog
Stack Overflow Blog
F
Full Disclosure
V2EX - 技术
V2EX - 技术
N
News and Events Feed by Topic
Help Net Security
Help Net Security
L
LangChain Blog
Y
Y Combinator Blog
宝玉的分享
宝玉的分享
Google Online Security Blog
Google Online Security Blog
P
Proofpoint News Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
The Blog of Author Tim Ferriss
Google DeepMind News
Google DeepMind News
The Register - Security
The Register - Security
B
Blog RSS Feed
N
Netflix TechBlog - Medium
N
News | PayPal Newsroom
TaoSecurity Blog
TaoSecurity Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
V
Vulnerabilities – Threatpost
B
Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
I
Intezer
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园_首页
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
AI
AI
aimingoo的专栏
aimingoo的专栏
大猫的无限游戏
大猫的无限游戏
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Cyberwarzone
Cyberwarzone
P
Proofpoint News Feed
Google DeepMind News
Google DeepMind News
G
GRAHAM CLULEY
Vercel News
Vercel News
罗磊的独立博客
MyScale Blog
MyScale Blog
Last Week in AI
Last Week in AI
博客园 - 司徒正美
C
CERT Recently Published Vulnerability Notes
GbyAI
GbyAI
Scott Helme
Scott Helme
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
T
Troy Hunt's Blog
A
About on SuperTechFans
P
Privacy International News Feed

博客园 - 郭慕荣

彻底搞懂 Codex Skill 与插件:区别、试用、核心作用、项目落地全指南(程序员实战向) Codex Skill 和插件到底有什么区别?程序员如何在项目中落地使用 claudecode 配置防止配置文件泄露总结 Claude code分析外部文件总结 Claude code三种模式详解 hasCompletedOnboarding详解 Claudecode 有哪些常用的命令 claude.md文件详解 claude code 的setting文件详解 Docker部署zookeeper总结 Mac中git ssh的配置(GitLab) Java 类加载机制 面试题(一) 如何监控和调优JVM性能? jvm常用的参数有哪些? 怎么配置? hashmap 和currenthashmap 的原理?详解一下 aop在项目中使用的场景?怎么使用? Java dubbo spring springboot中的spi机制 spring中常见的两种代理模式 Redis的zset 面试汇总 drools 规则引擎在线化配置 springcloud中常用的注解详解 spring是怎么解决循环依赖的? MySQL 死锁 怎么处理? 在写left join的时候 是大表在左侧 还是小表在左侧(二) 在写left join的时候 是大表在左侧 还是小表在左侧(一) nacos客户端(接口调用者)如何感知被调用服务下线? (二) nacos客户端(接口调用者)如何感知被调用服务下线?(一) 在MySQL中 redolog undolog binlog 写入的场景,顺序
springcloud中网关gateway总结
郭慕荣 · 2025-10-23 · via 博客园 - 郭慕荣

在 Spring Cloud 微服务架构中,网关(Gateway)是客户端与微服务集群之间的 "统一入口",负责处理跨服务的共性问题。以下从作用、实现原理、核心配置(含限流、鉴权详解)三方面展开说明。

微服务拆分后,客户端需与多个服务直接交互,会面临地址管理、权限混乱、流量失控等问题。网关的核心作用是统一管控这些共性问题,具体包括:

  1. 路由转发:根据请求路径、参数等规则,将请求转发到对应的微服务(如将/user/**转发到用户服务,/order/**转发到订单服务)。
  2. 负载均衡:集成服务发现(如 Nacos、Eureka),自动将请求分发到同一服务的不同实例,实现负载均衡。
  3. 统一鉴权:拦截所有请求,验证 Token、权限等,避免每个服务重复实现鉴权逻辑。
  4. 流量控制(限流):限制单位时间内的请求量,防止服务被高并发击垮。
  5. 熔断降级:当下游服务故障时,返回预设的降级响应(如 "服务暂时不可用"),避免级联失败。
  6. 日志监控:统一记录请求日志(路径、耗时、状态等),便于问题排查。
  7. 协议转换:如将 HTTP 请求转换为 RPC(如 Dubbo)请求,适配不同服务的通信协议。

Spring Cloud Gateway 是目前主流的网关组件(替代了 Zuul),基于Netty 响应式编程(非阻塞),性能优于传统的 Servlet 阻塞式架构。其核心原理依赖三个核心概念:路由(Route)、断言(Predicate)、过滤器(Filter)。

  • 路由(Route):网关的基本单元,定义 "请求如何转发"。由三部分组成:

    • id:路由唯一标识;
    • uri:目标服务地址(如lb://user-servicelb表示负载均衡,user-service是服务名);
    • predicates:断言集合(判断请求是否匹配当前路由);
    • filters:过滤器集合(对请求 / 响应进行加工)。
  • 断言(Predicate):本质是 "条件判断规则",用于匹配请求的属性(如路径、方法、请求头、时间等)。例如:

    • Path=/user/**:匹配路径以/user/开头的请求;
    • Method=GET:只匹配 GET 请求;
    • Header=token, \d+:匹配请求头token的值为数字的请求。
  • 过滤器(Filter):对请求 / 响应进行拦截和处理,分为两类:

    • GatewayFilter:针对特定路由的过滤器(如某个路由的路径重写);
    • GlobalFilter:全局过滤器(对所有路由生效,如鉴权、日志)。

客户端请求到达网关后,处理流程如下:

  1. 请求接入:客户端请求被 Netty 服务器接收,进入网关处理流程。
  2. 路由匹配:网关通过断言(Predicate)判断请求是否匹配某个路由(如路径/user/1匹配Path=/user/**的路由)。
  3. 过滤器链执行:
    • 先执行 "前置过滤器"(如鉴权、限流),若不通过则直接返回错误(如 401 无权限);
    • 若通过,将请求转发到uri指定的目标服务(通过负载均衡选择具体实例)。
  4. 响应处理:目标服务返回响应后,执行 "后置过滤器"(如日志记录、响应头修改),最终将响应返回给客户端。

Spring Cloud Gateway 的配置可通过application.yaml(或application.properties)和代码两种方式实现,以下重点说明常用配置。

通过配置文件定义路由规则,示例:

spring:
  cloud:
    gateway:
      routes:
        
  • 说明:uri: lb://服务名需配合服务发现组件(如 Nacos),网关会自动从注册中心获取服务实例地址并实现负载均衡。

限流用于保护服务不被高并发击垮,Spring Cloud Gateway 基于令牌桶算法实现,需结合 Redis 存储令牌桶状态(依赖spring-boot-starter-data-redis-reactive)。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

需定义限流键(KeyResolver)(如按 IP、用户 ID、接口路径限流),并在路由中启用限流过滤器。

  • 示例 1:按 IP 限流(同一 IP 单位时间内最多 N 个请求)① 定义 KeyResolver(获取客户端 IP): 

    @Configuration
    public class GatewayConfig {
        

    ② 在路由中配置限流过滤器:

    spring:
      cloud:
        gateway:
          routes:
            - id: user-service-route
              uri: lb://user-service
              predicates:
                - Path=/user/**
              filters:
                - name: RequestRateLimiter  

    说明:replenishRate=10表示每秒生成 10 个令牌,burstCapacity=20表示最多允许突发 20 个请求(超过则限流,返回 429 状态码)。

  • 示例 2:按接口路径限流(同一接口单位时间内最多 N 个请求)① 定义按路径的 KeyResolver:

    @Bean
    public KeyResolver pathKeyResolver() {
        return exchange -> Mono.just(
            exchange.getRequest().getPath().toString()  

    ② 路由中引用pathKeyResolver即可。

鉴权是网关的重要职责,通常基于 Token(如 JWT)实现:客户端请求时携带 Token,网关验证 Token 有效性,无效则拒绝访问。

全局过滤器对所有路由生效,步骤如下:

  1. 自定义鉴权过滤器:
  1. 配置白名单: 实际场景中,除了登录接口,可能还有健康检查、公开接口等需要放行,可在过滤器中通过路径匹配实现,或通过配置文件定义白名单:
    gateway:
      auth:
        white-list: /login,/health,/public/**  
    过滤器中读取白名单并判断是否放行。
  • 跨域配置:解决前端跨域问题(浏览器限制不同域名的请求):

    spring:
      cloud:
        gateway:
          globalcors:
            cors-configurations:
              '[/**]':  
  • 熔断降级:结合 Resilience4j,当下游服务超时 / 异常时返回降级响应:

    spring:
      cloud:
        gateway:
          routes:
            - id: user-service-route
              uri: lb://user-service
              predicates:
                - Path=/user/**
              filters:
                - name: CircuitBreaker  

    需额外定义/fallback/user接口,返回降级响应(如{"code":503,"msg":"服务暂时不可用"})。

Spring Cloud 网关通过路由转发连接客户端与微服务,通过断言匹配请求,通过过滤器实现限流、鉴权等共性功能。核心配置中,限流依赖 Redis 和令牌桶算法,鉴权依赖自定义全局过滤器验证 Token,二者共同保障微服务的安全性和稳定性。