• 4.Spring Cloud Gateway 入门与使用【SpringCloudGateway组成、断言的多种类型、结合Nacos和LoadBalancer使用、过滤器使用、限流使用、重试过滤器使用】


    1.什么是网关?

    网关是一种网络设备,用于连接两个或多个不同网络,将数据从一个网络转发到另一个网络。它充当了两个网络之间的桥梁,负责转发数据并处理来自不同网络的通信协议转换。
    网关具备转发、路由和过滤数据的功能。它能够识别不同网络中的数据包,并根据其目的地址和源地址决定如何转发数据。同时,网关还可以实施网络安全策略,对进出的数据包进行检查和过滤,保护网络安全。
    网关在互联网中起到重要作用,它连接了内部局域网和外部互联网,使得数据能够在不同网络之间传递和交换。
    在这里插入图片描述

    2.网关有什么用?

    网关的主要作用有以下几个:

    1. 路由功能:网关可以根据目标地址的不同,选择最佳的路径将数据包从源网络路由到日标网络。它通过维护路由表来确定数据包的转发方向,并选择最优的路径。
    2. 安全控制(统一认证授权):网关可以实施网络安全策略,对进出的数据包进行检查和过滤。它可以验证和授权来自源网络的数据包,并阳止未经授权的访问。防火墙是一种常见的网关设备,用于过滤和保护网络免受恶意攻击和未经授权的访问。
    3. 协议转换:不同网络使用不同的通信协议,网关可以进行协议转换,使得不同网络的设备可以互相通信。例如,例如将 HTTPS 协议转换成 HTTP 协议。
    4. 网络地址转换(NAT):网关还可以执行网络地址转换,将内部网络使用的私有 IP 地址转换为外部网络使用的公共 IP 地址,以实现多台计算机共享一个公共 IP 地址出去上网。
      在这里插入图片描述

    3.Spring Cloud Gateway 组成

    1. 路由(Route):定义了请求应该被转发到哪个目标地址。路由由 ID、目标 URI、断言和过滤器组成。通过面置多个路由,可以实现不同请求的路由规则。
    2. 断言(Predicate):用于匹配请求的条件,如果请求匹配断言条件,则会被路由到对应的目标地址。断言可以基于请求的路径、请求头、请求参数等信息进行匹配。
    3. 过滤器(Filter):用于在请求路由前或路由后进行一些处理,如添加头部信息、修改请求体等。过滤器可以在全局范围或特定路由范围内配置,多个过滤器可以组成过滤器链。
      在这里插入图片描述

    4.Spring Cloud Gateway 基础使用 ★

    Spring Cloud Gateway 使用步骤如下

    1. 添加 Gateway 依赖。
    2. 设置网关路由规则。

    具体实现如下

    添加依赖

            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-gatewayartifactId>
            dependency>
    

    设置路由规则

    spring:
      cloud:
        gateway:
          routes:
          - id: userservice
            uri: http://localhost:9090 # 路由
            predicates: # 断言
            - Path=/user/**
            - Header=X-Header-Flag, \d+
          - id: orderservice
            uri: http://localhost:9091
            predicates:
            - Path=/order/**
    server:
      port: 10086
    

    在这里插入图片描述
    在这里插入图片描述

    5.匹配多个 Path ★

    Spring Cloud Gateway(网关路由规则)中是允许设置多个 Path 的,只需要在 Path 中使用英文逗号"“隔开即可
    如下所示:

    gateway :
    	routes:
    	- id: userservice
    	uri: http://192.168.1.7:51627
    	predicates:
    	-Path=/user/**,/u/**
    

    6.更多断言 (Predicate) 类型 ★

    Spring Cloud Gateway 支持的断言类型目前有 12 种,包含以下这些:

    1. 根据时间匹配(包含 3 种类型)
      a.After:请求在指定时间之后才匹配,
      b.Before:请求在指定时间之前才匹配,
      c.Between:请求在指定时间中间才匹配。
    2. Cookie:配置请求中的 Cookie 值。
    3. Header:配置请求中的 Header 值,
    4. Host:匹配请求头中的 Host 值,
    5. Method:匹配请求头中的 Method 的值。
    6. Path:匹配请求路径。
    7. Query:匹配请求参数。
    8. RemoteAddr:匹配请求的IP 地址,支持 IPV4 和IPV6
    9. Weight:根据权重来分发请求,权重根据 qroup 来计算,
    10. XForwardedRemoteAddr:根据X-Forwarded-For 所配
      在这里插入图片描述
      在这里插入图片描述

    6.1 根据时间匹配

    spring:
    	cloud:
    		gateway:
    			routes:
    			-id: userservice
    			uri: http://192.168.1.7:51627
    			predicates:
    			-Before=2023-11-02T19:05:08.020+08:00[Asia/shanghai]
    

    7.Gateway+Nacos+LoadBalancer

    在这里插入图片描述

    7.1 添加依赖

    <!--注册中心--3
    >
    <groupId>com.alibaba.cloudgroupId><artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>dependency><dependency>
    <groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-starter-gatewayartifactId>dependency>
    <dependency>
    <groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-starter-loadbalancerartifactId>dependency>
    

    7.2 设置路由规则 ★

    在这里插入图片描述

    8.过滤器

    8.1 什么是过滤器?

    过滤器通常用于拦截、处理或修改数据流或事件流,在数据流中执行特定的操作或转换。

    8.2 为什么需要用过滤器?

    • 功能扩展和定制:过滤器可以用于对现有功能进行扩展和定制。通过拦截和处理数据流或事件流,可以修改数据,增加额外的功能逻辑,实现特定的业务需求。例如,可以使用过滤器在请求之前进行身份验证、权限控制,或者在响应之后进行日志记录、数据转换等操作。
    • 数据校验和过滤:过滤器可以用于对数据进行校验和过滤。在接收到数据之后,可以使用过滤器对数据进行检查,验证数据的合法性,过滤掉无效或不符合要求的数据。这有助于保证数据的准确性、完整性和安全性。
    • 安全保护:过滤器可以用于提供安全保护措施。可以使用过滤器对输入的请求进行检查和清洗,以防止潜在的安全漏洞,例如跨站脚本攻击(XSS)、跨站请求伪造(CSRF)等攻击。过滤器还可以进行访问控制,验证权限和实施安全策略。
    • 性能优化:过滤器可以用于性能优化。例如,在数据处理流水线中,可以使用过滤器对数据进行转换、过滤或缓存,以提高处理速度和效率。过滤器还可以用于数据压缩、缓存预热等场景,减少数据传输和处理的成本。
    • 统一处理和逻辑复用:过滤器提供了一种统一的处理方式,可以在不同的组件或模块上应用相同的逻辑或处理方式。通过将处理逻辑抽象为过滤器,可以避免重复代码、统一错误处理和异常处理等,提高代码的复用性和可维护性。

    8.3 Spring Cloud Gateway 过滤器

    Spring Cloud Gateway 是一个基于 Spring WebFlux 的 API 网关,提供了路由和过滤器功能。过滤器在请求和响应的生命周期中起到重要作用。Spring Cloud Gateway 提供了三种类型的过滤器:内置过滤器、全局过滤器和自定义过滤器。

    1. 内置过滤器 filters: ★

    内置过滤器是 Spring Cloud Gateway 提供的预定义过滤器,常用于常见的网关功能,如鉴权、限流、重试等。

    常见的内置过滤器有:

    • AddRequestHeader
    • AddRequestParameter
    • AddResponseHeader
    • DedupeResponseHeader
    • PrefixPath
    • RedirectTo
    • RemoveRequestHeader
    • RemoveResponseHeader
    • RewritePath
    • SetPath
    • SetRequestHeader
    • SetResponseHeader
    • StripPrefix

    示例代码:

    spring:
      cloud:
        gateway:
          routes:
          - id: add_request_header_route
            uri: http://httpbin.org:80
            filters:
            - AddRequestHeader=X-Request-Example, ExampleValue
            predicates:
            - Path=/get
    

    在这个示例中,AddRequestHeader 过滤器会在请求头中添加 X-Request-Example 头,值为 ExampleValue

    2. 全局过滤器 implements GlobalFilter, Ordered ★

    全局过滤器是应用于所有路由的过滤器。它们通常用于跨所有路由的通用功能,如日志记录、监控等。

    示例代码:

    import org.springframework.cloud.gateway.filter.GlobalFilter;
    import org.springframework.cloud.gateway.filter.factory.rewrite.ModifyRequestBodyGatewayFilterFactory;
    import org.springframework.core.Ordered;
    import org.springframework.stereotype.Component;
    import org.springframework.web.server.ServerWebExchange;
    import reactor.core.publisher.Mono;
    
    @Component
    public class CustomGlobalFilter implements GlobalFilter, Ordered {
    
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            System.out.println("Global Pre Filter executed");
            return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                System.out.println("Global Post Filter executed");
            }));
        }
    
        @Override
        public int getOrder() {
            return -1; // Order of the filter
        }
    }
    

    在这个示例中,CustomGlobalFilter 是一个全局过滤器,它会在每个请求前后打印日志。

    3. 自定义过滤器 AbstractGatewayFilterFactory

    自定义过滤器是用户根据具体需求编写的过滤器,可以应用于特定路由或全局。

    示例代码:

    import org.springframework.cloud.gateway.filter.GatewayFilter;
    import org.springframework.cloud.gateway.filter.GatewayFilterChain;
    import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
    import org.springframework.stereotype.Component;
    import org.springframework.web.server.ServerWebExchange;
    import reactor.core.publisher.Mono;
    
    @Component
    public class CustomFilter extends AbstractGatewayFilterFactory<CustomFilter.Config> {
    
        public CustomFilter() {
            super(Config.class);
        }
    
        @Override
        public GatewayFilter apply(Config config) {
            return (exchange, chain) -> {
                System.out.println("Custom Pre Filter executed");
                return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                    System.out.println("Custom Post Filter executed");
                }));
            };
        }
    
        public static class Config {
            // Configuration properties for the filter
        }
    }
    

    在这个示例中,CustomFilter 是一个自定义过滤器,它会在特定路由的请求前后打印日志。

    配置自定义过滤器:
    spring:
      cloud:
        gateway:
          routes:
          - id: custom_filter_route
            uri: http://httpbin.org:80
            filters:
            - name: CustomFilter
            predicates:
            - Path=/get
    

    在这个配置中,CustomFilter 会应用于 /get 路径的请求。

    总结

    • 内置过滤器:Spring Cloud Gateway 提供的预定义过滤器,适用于常见的网关功能。
    • 全局过滤器:应用于所有路由的过滤器,适用于跨所有路由的通用功能。
    • 自定义过滤器:用户根据具体需求编写的过滤器,可以应用于特定路由或全局。

    通过这些过滤器,Spring Cloud Gateway 提供了灵活的请求和响应处理能力,满足各种网关需求。

    限流 ★

    在这里插入图片描述
    在这里插入图片描述

    重试过滤器 ★

    在这里插入图片描述

    9.工作原理

    SpringCloudGateway的工作原理可以概括为以下几个关键点:

    1. 核心组件

      • Filter:过滤器是SpringCloudGateway中用于处理请求和响应的重要组件。它们可以在请求进入或离开网关时执行特定的操作,如身份验证、限流、日志记录等。
      • Route:路由是网关最基础的部分,用于定义请求的转发规则。每个路由都由一个唯一的标识符和一个或多个断言组成。
      • Predicates:断言用于匹配请求,决定请求是否符合路由条件。如果断言为真,则说明请求URL和配置的路由匹配。
      • GatewayFilter:Spring Cloud Gateway中的过滤器分为两种类型,分别是Gateway Filter和Global Filter。它们可以对请求和响应进行处理。
    2. 路由机制

      • SpringCloudGateway使用路由模型来定义请求的转发规则。每个路由都由一个唯一的标识符和一个或多个断言组成。
      • 匹配成功后,请求将按照定义的规则转发到相应的服务。
    3. 过滤器机制

      • 过滤器可以在请求进入或离开网关时执行特定的操作。
      • 通过在路由中添加过滤器,可以实现更加灵活的请求处理逻辑。
    4. 动态路由

      • 动态路由允许在运行时根据条件动态添加或修改路由规则。
      • 编程式动态路由通过编程式API,可以在运行时动态创建、修改或删除路由规则。
    5. 性能与特性

      • SpringCloudGateway基于WebFlux框架开发,默认使用RxNetty作为响应式Web容器,通过非阻塞方式处理高并发请求,提升服务资源利用的可伸缩性。
      • 支持动态路由,能够匹配任何请求属性上的路由。
      • 支持基于HTTP请求的路由匹配(如Path、Method、Header、Host等)。
      • 集成了Hystrix断路器,提供限流等功能。
      • 过滤器可以修改HTTP请求和HTTP响应(如增加/修改Header、增加/修改请求参数、改写请求Path等)。
    6. 与Zuul的性能对比

      • SpringCloudGateway的RPS(每秒请求数)是Zuul的1.6倍,显示出更优秀的性能。

    综上所述,SpringCloudGateway通过其核心组件(Filter、Route、Predicates和GatewayFilter)和路由、过滤器机制,以及动态路由等特性,为微服务架构提供了一种简单而有效的API路由管理方式,并具备高性能和丰富的功能。

    面试题

    20. 什么是网关?网关有什么用?

    1.典型回答
    在微服务架构中,网关(Gateway)是一个提供统一访问地址的组件,它充当了客户端和内部微服务之间的中介,。
    网关主要负责流量路由和转发,将外部请求引导到相应的微服务实例上,同时提供一些功能,如身份认证、授权、限流、监控、日志记录等。

    网关有什么用?
    网关的主要作用有以下几个:

    1. 路由功能:网关可以根据目标地址的不同,选择最佳的路径将数据包从源网络路由到目标网络。它通过维护路由表来确定数据包的转发方向,并选择最优的路径。
    2. 安全控制(统一认证授权):网关可以实施网络安全策略,对进出的数据包进行检查和过滤。它可以验证和授2权来自源网络的数据包,并阻止未经授权的访问。防火墙是一种常见的网关设备,用于过滤和保护网络免受恶意攻击和未经授权的访问。
    3. 协议转换:不同网络使用不同的通信协议,网关可以进行协议转换,使得不同网络的设备可以互相通信。例如,例如将 HTTPS 协议转换成 HTTP 协议。
    4. 网络地址转换(NAT):网关还可以执行网络地址转换,将内部网络使用的私有IP 地址转换为外部网络使用的公共 IP 地址,以实现多台计算机共享一个公共 IP 地址出去上网。

    21. SpringcloudGateway网关是如何工作的?

    执行流程如下

    1. 客户端向 Spring Cloud Gateway 网关发出请求
    2. 网关映射处理程序(Gateway Headler Mapping)会根据请求路径进行路由匹配,然后再将其发送到网关 Web处理器(Gateway Web Headler)进行处理。
    3. 网关处理器会经过过滤器链(Filter)进行预处理,而过滤器又分为前置过滤器(请求之前执行的过滤器)和后置过滤器(请求之后执行的过滤器)。
    4. 过滤器都通过之后,最后再将请求的发送给目标服务(也称为代理的服务)

    22. SpringCloudGateway过滤器的分类有哪些?过滤器底层是如何实现的?

    Spring Cloud Gateway的过滤器可以分为两类:全局过滤器和局部过滤器。

    1. 全局过滤器:全局过滤器对所有路由生效,可以用来实现一些全局的功能,比如鉴权、日志记录等。

    2. 局部过滤器:局部过滤器只对特定的路由生效,可以根据需要为不同的路由配置不同的过滤逻辑。

    Spring Cloud Gateway的过滤器底层是基于Netty实现的。在Spring Cloud Gateway中,过滤器是通过实现GatewayFilter接口或者GlobalFilter接口来实现的。当请求经过Gateway时,会依次经过配置的过滤器链,每个过滤器可以对请求进行修改、校验、记录日志等操作,然后将请求传递给下一个过滤器或者目标服务。过滤器可以在请求前、请求后或者异常时执行相应的逻辑,从而实现对请求的处理和控制。

  • 相关阅读:
    【licode】Single Peer Connection - Feature Review
    神经网络与深度学习(四)
    Win10系统下torch.cuda.is_available()返回为False的问题解决
    vue组件通信6种方式总结(常问知识点)
    【pytest】html报告修改和汉化
    Kafka的设计原理
    dialog宽度无法占满手机屏幕的解决方案
    开源的java视频处理库介绍
    调用API接口的一些注意技巧
    LeetCode75——Day9
  • 原文地址:https://blog.csdn.net/m0_63571404/article/details/139395870