• Spring Cloud Gateway网关中各个过滤器的作用与介绍



    在这里插入图片描述

    🎉欢迎来到架构设计专栏~Spring Cloud Gateway网关中各个过滤器的作用与介绍



    随着微服务架构的兴起,API网关变得越来越重要。它是微服务体系结构中的一个关键组件,用于处理所有传入和传出的请求流量,同时还提供了一些关键的功能,如身份验证、安全性、监控、负载均衡和路由。Spring Cloud Gateway是一个基于Spring Framework 5,Spring Boot 2和Project Reactor的API网关工具,它的灵活性和强大性使得它成为了构建微服务架构的理想选择。

    在这里插入图片描述

    Spring Cloud Gateway通过一系列的过滤器来处理请求,并将请求路由到适当的微服务。这些过滤器是它的核心组成部分,每个过滤器都有自己的特定功能。在本文中,我们将深入探讨Spring Cloud Gateway中各个过滤器的作用与介绍。

    在这里插入图片描述

    1. Route To Request URL Filter(路由过滤器)

    路由过滤器是Spring Cloud Gateway的核心过滤器之一。它的主要作用是根据请求的URL将请求路由到适当的目标微服务。这个过滤器是必需的,因为API网关通常要处理多个微服务,而路由过滤器负责将请求发送到正确的微服务。

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("example_route", r -> r
                .path("/example/**")
                .uri("http://example.com"))
            .build();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在上面的示例中,我们创建了一个自定义的路由配置,将以/example/开头的请求路由到http://example.com这个目标微服务。

    2. Gateway Filter(全局过滤器)

    Gateway Filter是Spring Cloud Gateway中的全局过滤器,它可以应用到所有的路由请求上。全局过滤器通常用于实现与安全性、性能监控和日志记录等相关的全局功能。

    以下是一个示例,展示如何创建一个全局的Gateway Filter:

    @Bean
    public GlobalFilter customGlobalFilter() {
        return (exchange, chain) -> {
            // 在此处编写全局过滤器逻辑
            ServerHttpRequest request = exchange.getRequest();
            // 可以进行各种处理,如请求日志记录、性能监控等
            return chain.filter(exchange);
        };
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3. Pre Filter(前置过滤器)

    前置过滤器是在请求被路由到目标微服务之前执行的过滤器。它可以用于修改请求、记录日志、添加头信息等操作。前置过滤器通常用于请求处理前的预处理任务。

    在这里插入图片描述

    以下是一个前置过滤器的示例,它用于在请求头中添加一个自定义的标头:

    @Bean
    public GlobalFilter customPreFilter() {
        return (exchange, chain) -> {
            ServerHttpRequest request = exchange.getRequest().mutate()
                .header("X-Custom-Header", "Custom-Value")
                .build();
            return chain.filter(exchange.mutate().request(request).build());
        };
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4. Post Filter(后置过滤器)

    后置过滤器是在请求被路由到目标微服务之后执行的过滤器。它可以用于修改响应、记录日志、添加响应头信息等操作。后置过滤器通常用于请求处理后的后续处理任务。
    在这里插入图片描述

    以下是一个后置过滤器的示例,它用于在响应头中添加一个自定义的标头:

    @Bean
    public GlobalFilter customPostFilter() {
        return (exchange, chain) -> {
            return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                ServerHttpResponse response = exchange.getResponse();
                response.getHeaders().add("X-Custom-Header", "Custom-Value");
            }));
        };
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    5. Error Filter(错误过滤器)

    错误过滤器是在请求或响应过程中发生错误时执行的过滤器。它通常用于处理异常情况,例如返回特定的错误响应、记录错误日志等。

    以下是一个错误过滤器的示例,它用于处理异常并返回自定义的错误响应:

    @Bean
    public GlobalFilter customErrorFilter() {
        return (exchange, chain) -> {
            return chain.filter(exchange).onErrorResume(ex -> {
                ServerHttpResponse response = exchange.getResponse();
                if (ex instanceof CustomException) {
                    response.setStatusCode(HttpStatus.BAD_REQUEST);
                    return response.setComplete();
                }
                return Mono.error(ex);
            });
        };
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    6. Rewrite Path Filter(路径重写过滤器)

    路径重写过滤器用于修改请求的URL路径。它可以用于将请求路由到不同的路径或微服务,或者用于隐藏后端微服务的实际路径。

    以下是一个路径重写过滤器的示例,它将请求的路径从/api/v1/resource重写为/v1/resource

    @Bean
    public GlobalFilter customRewritePathFilter() {
        return (exchange, chain) -> {
            ServerHttpRequest request = exchange.getRequest();
            URI uri = request.getURI();
            URI newUri = UriComponentsBuilder.fromUri(uri)
                .path("/v1" + uri.getPath())
                .build()
                .toUri();
            ServerHttpRequest modifiedRequest = request.mutate().uri(newUri).build();
            return chain.filter(exchange.mutate().request(modifiedRequest).build());
        };
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    7. Rate Limit Filter(速率限制过滤器)

    速率限制过滤器用于控制请求的速率,防止过多的请求导致系统负载过高。它可以基于时间窗口内的请求次数来限制速率。

    以下是一个速率限制过滤器的示例,它限制每个IP地址在一分钟内最多只能发送100个请求:

    @Bean
    public KeyResolver ipKeyResolver() {
        return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
    }
    
    @Bean
    public CustomKeyResolver customKeyResolver() {
        return new CustomKeyResolver();
    }
    
    public class CustomKeyResolver implements KeyResolver {
        @Override
        public Mono<String> resolve(ServerWebExchange exchange) {
            // 在此处编写自定义的速率限制逻辑
            return Mono.just("custom-key");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    上述示例中,我们使用ipKeyResolver来限制每个IP地址的请求速率,并使用customKeyResolver来进行自定义的速率限制。

    8. Strip Prefix Filter(前缀删除过滤器)

    前缀删除过滤器用于删除请求的URL路径前缀。它通常用于将请求从网关路由到后端微服务时,去掉不需要的前缀。

    以下是一个前缀删除过滤器的示例,它删除请求路径的前缀/api

    @Bean
    public GlobalFilter customStripPrefixFilter() {
        return (exchange, chain) -> {
            ServerHttpRequest request = exchange.getRequest();
            URI uri = request.getURI();
            URI newUri = UriComponentsBuilder.fromUri(uri)
                .path(uri.getPath().replaceFirst("/api", ""))
                .build()
                .toUri();
            ServerHttpRequest modifiedRequest = request.mutate().uri(newUri).build();
            return chain.filter(exchange.mutate().request(modifiedRequest).build());
        };
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    结论

    Spring Cloud Gateway提供了丰富的过滤器功能,使您能够轻松地处理请求和响应,实现各种功能,如路由、安全性、日志记录、速率限制等。通过合理配置和组合这些过滤器,您可以构建强大、灵活且高度可定制的API网关,满足不同场景下的需求。

    在这里插入图片描述

    在实际项目中,根据具体的业务需求和安全策略,您可以选择使用适当的过滤器来增强您的API网关。希望本文对于理解Spring Cloud Gateway中各个过滤器的作用有所帮助,也能够帮助您更好地构建微服务架构中的API网关。
    在这里插入图片描述

    如果您有兴趣,可以尝试自己编写和定制过滤器,以满足特定的需求。通过深入研究和实践,您将更好地掌握Spring Cloud Gateway的强大功能,从而构建出高效、可靠的微服务系统。祝您在API网关的使用中取得成功!


    🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏
    📜您可能感兴趣的内容:

    在这里插入图片描述

  • 相关阅读:
    数仓开发之DIM层
    Qt出现假死冻结现象
    [附源码]Python计算机毕业设计Django软考刷题小程序
    知名工业企业代表团赴实在智能交流,共同推动企业数字化转型
    驱动开发第二天
    手写 分页
    【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(8 月 24 日论文合集)
    【高效开发工具系列】PlantUML入门使用
    BCC源码内容概览(4)
    dubbo Can not lock the registry cache file
  • 原文地址:https://blog.csdn.net/qq_43546721/article/details/133622282