谷粒商城实战笔记-26-分布式组件-SpringCloud-Gateway网关核心概念&原理

微服务架构中,API网关扮演着至关重要的角色,它不仅作为微服务间的通信桥梁,还负责安全、监控、限流等职责。

一,网关的发展历程

SpringCloud的网关经历了两代的迭代和更替。

第一代网关是早期的Zuul,由 Netflix 开发并开源。

随着时间的推移和技术的发展,Zuul 面临了一些挑战,比如架构陈旧、性能差、扩展性差、可维护性差,导致其在某些场景下逐渐被其他更现代的技术所取代,如 Spring Cloud Gateway。

虽然Zuul与时俱进的开发2.0版本,但由于SpringCloud Gateway的发展,该版本并未集成都SpringCloud中。

下图是SpringCloud网关的简要发展历程。

二,SpringCloud Gateway

Spring Cloud Gateway作为Spring家族的一员,自诞生以来便以其现代化的设计理念和卓越的性能表现赢得了广大开发者的青睐。

Spring Cloud Gateway的官方文档地址。

1,核心概念

  • 路由(Route): 路由是Spring Cloud Gateway的基本单位,它定义了请求如何从客户端到达目标服务。每个路由包含一组断言(Predicates)和过滤器(Filters),断言用于匹配请求,过滤器则用于在请求/响应链中执行特定操作。

  • 断言(Predicate) : 断言是一种条件语句,用于确定请求是否匹配路由。例如,可以通过路径断言Path来匹配特定的URL路径。

  • 过滤器(Filter): 过滤器用于修改进入或离开网关的请求或响应。它可以执行诸如日志记录、修改请求/响应体、添加响应头等操作。,

2,工作原理

Spring Cloud Gateway的核心是响应式编程模型。它基于Project Reactor框架,能够高效地处理大量并发请求,而不占用过多资源。

  • 客户端Gateway Client发送请求给网关,
  • 网关的HandlerMapping组件根据配置的断言(Predicate),判断是否请求满足某个路由,满足就发给网关的 WebHandler
  • WebHandler 将请求交给一个过滤器链,请求到达目标服务之前,会执行所有过滤器的 pre 方法
  • 请求到达目标服务处理之后再依次执行所有过滤器的 post 方法

3,一看就懂的案例

看下面真实的网关配置,其中包含了前缀匹配和Cookie匹配:

yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
      - id: secure-service-route
        uri: lb://secure-service
        predicates:
        - Path=/api/secure/**
        - Cookie=auth-token,securetoken
        filters:
        - AddRequestHeader=X-Forwarded-Prefix, /api/secure
        - AddRequestParameter=traceId, ${random.value}

上述的Spring Cloud Gateway配置定义了一条名为secure-service-route的路由规则,用于将特定类型的请求转发到一个称为secure-service的后端服务。

逐个解析配置内容:

  1. 路由ID (id: secure-service-route):这是路由的唯一标识符,便于在日志或配置中引用。

  2. 目标URI (uri: lb://secure-service):指定当请求匹配此路由时,应将请求转发到名为secure-service的服务。lb://前缀表示使用负载均衡机制从服务发现中选择一个实例。

  3. 断言 (predicates):

    • Path=/api/secure/**:这表示只有当请求路径以/api/secure/开头时,才会匹配此路由规则。
    • Cookie=auth-token,securetoken:这表示请求必须包含一个名为auth-token的Cookie,且其值必须为securetoken。这是基本的安全检查,确保请求已被认证。
  4. 过滤器 (filters):

    • AddRequestHeader=X-Forwarded-Prefix, /api/secure:在请求被转发之前,向请求头中添加一个名为X-Forwarded-Prefix的头,其值为/api/secure。这有助于后端服务理解请求的原始路径。
    • AddRequestParameter=traceId, ${random.value}:在请求中添加一个名为traceId的查询参数,其值为一个随机生成的字符串。这用于分布式追踪,以便在整个微服务链路中跟踪请求。

3.1,具体请求示例

假设一个客户端发起如下请求:

bash 复制代码
GET /api/secure/userinfo HTTP/1.1
Host: yourapp.example.com
Cookie: auth-token=securetoken

下面是Spring Cloud Gateway处理这个请求的流程:

  1. 接收请求:网关接收到客户端的请求。

  2. 匹配路由 :网关检查其配置的路由规则,寻找匹配的规则。在本例中,请求的路径以/api/secure/开头,并且包含正确的auth-token Cookie,因此它匹配secure-service-route路由规则。

  3. 应用过滤器 :在转发请求之前,网关会应用配置的过滤器。首先,它会向请求头中添加X-Forwarded-Prefix头,然后在请求中添加一个随机生成的traceId参数。

  4. 转发请求 :修改后的请求被转发到secure-service服务。请求可能看起来像这样(简化版):

    bash 复制代码
    GET /userinfo?traceId=random123456 HTTP/1.1
    Host: secure-service.example.com
    X-Forwarded-Prefix: /api/secure
    Cookie: auth-token=securetoken
  5. 处理响应secure-service处理请求并返回响应。

  6. 返回响应:网关接收到响应后,可以再次应用过滤器对响应进行修改,然后将响应返回给原始客户端。

通过这种方式,Spring Cloud Gateway不仅能够智能地将请求路由到正确的服务,而且还能够添加额外的请求头和参数,以增强安全性、追踪能力和上下文信息。

相关推荐
吉大一菜鸡12 分钟前
FPGA学习(基于小梅哥Xilinx FPGA)学习笔记
笔记·学习·fpga开发
荆州克莱3 小时前
mysql中局部变量_MySQL中变量的总结
spring boot·spring·spring cloud·css3·技术
CCSBRIDGE3 小时前
Magento2项目部署笔记
笔记
zquwei3 小时前
SpringCloudGateway+Nacos注册与转发Netty+WebSocket
java·网络·分布式·后端·websocket·网络协议·spring
亦枫Leonlew3 小时前
微积分复习笔记 Calculus Volume 2 - 5.1 Sequences
笔记·数学·微积分
爱码小白4 小时前
网络编程(王铭东老师)笔记
服务器·网络·笔记
LuH11244 小时前
【论文阅读笔记】Learning to sample
论文阅读·笔记·图形渲染·点云
一棵开花的树,枝芽无限靠近你6 小时前
【PPTist】组件结构设计、主题切换
前端·笔记·学习·编辑器
道一云黑板报6 小时前
Flink集群批作业实践:七析BI批作业执行
大数据·分布式·数据分析·flink·kubernetes
犬余7 小时前
设计模式之桥接模式:抽象与实现之间的分离艺术
笔记·学习·设计模式·桥接模式