系列十、Spring Cloud Gateway

这篇具有很好参考价值的文章主要介绍了系列十、Spring Cloud Gateway。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Spring Cloud Gateway

1.1、概述

        Spring Cloud全家桶中有个很重要的组件就是网关,在1.x版本中采用的是Zuul网关,但是在2.x版本中,由于Zuul的升级一直跳票,Spring Cloud最后自己研发了一个网关替代Zuul,即:Spring Cloud Gateway。简单点讲Gateway就是原Zuul1.x版的替代品。

1.2、 Zuul1.x官网

https://github.com/Netflix/zuul/wiki

1.3、Gateway官网

https://spring.io/projects/spring-cloud-gateway/#overview

系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

1.4、Gateway源码架构

系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

1.5、已经有了Zuul为什么又出现了Gateway

(一)neflix不太靠谱,zuul2.0一直跳票,迟迟不发布;

         一方面因为Zuul1.0已经进入了维护阶段,而Gateway是Spring Cloud团队研发的,是亲儿子产品,值得信赖。而且很多功能Zuul都没有Gateway使用起来简单便捷,Gateway是基于异步非阻塞模型上进行开发的,性能方面不需要担心。虽然Netflix早就发布了最新的 Zuul 2.x,但 Spring Cloud 貌似没有整合计划。而且Netflix相关组件都宣布进入维护期;不知前景如何?
 多方面综合考虑Gateway是很理想的网关选择。

(二)Spring Cloud Gateway具有如下特性:

        (1)基于Spring Framework 6, Project Reactor 和 Spring Boot 3.0 进行构建;
        (2)动态路由:能够匹配任何请求属性;
        (3)可以对路由指定 Predicate(断言)和 Filter(过滤器);
        (4)集成Hystrix的断路器功能;
        (5)集成 Spring Cloud 服务发现功能;
        (6)易于编写的 Predicate(断言)和 Filter(过滤器);
        (7)请求限流功能;
        (8)支持路径重写。

(三)Spring Cloud Gateway 与 Zuul的区别:

        在SpringCloud Finchley 正式版之前,Spring Cloud 推荐的网关是 Netflix 提供的Zuul:
        (1)Zuul 1.x,是一个基于阻塞 I/ O 的 API Gateway;
        (2)Zuul 1.x 基于Servlet 2. 5使用阻塞架构,它不支持任何长连接(如 WebSocket) ,Zuul 的设计模式和Nginx较像,每次 I/ O 操作都是从工作线程中选择一个执行,请求线程被阻塞到工作线程完成,但是差别是Nginx 用C++ 实现,Zuul 用 Java 实现,而 JVM 本身会有第一次加载较慢的情况,使得Zuul 的性能相对较差;
        (3)Zuul 2.x理念更先进,想基于Netty非阻塞和支持长连接,但Spring Cloud目前还没有整合。 Zuul 2.x的性能较 Zuul 1.x 有较大提升。在性能方面,根据官方提供的基准测试, Spring Cloud Gateway 的 RPS(每秒请求数)是Zuul 的 1. 6 倍。
        (4)Spring Cloud Gateway 建立 在 Spring Framework 5、 Project Reactor 和 Spring Boot 2 之上, 使用非阻塞 API;

1.6、常用功能

        反向代理、鉴权、流量控制、熔断、日志监控...

1.7、微服务架构中网关的位置

系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

1.8、三大核心概念

1.8.1、路由(Route)

        路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由。

1.8.2、断言(Predicate)

        断言参考的是Java8的java.util.function.Predicate,开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由。

1.8.3、过滤器(Filter)

指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。

1.9、工作流程

1.9.1、核心逻辑

        路由转发 + 执行过滤器链

1.9.2、工作流程

官网:How It Works :: Spring Cloud Gateway

系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

        客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。Filter在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等有着非常重要的作用。

1.10、断言工厂配置(Route Predicate Factories)

1.10.1、概述

        当请求Gateway的时候,使用断言对请求进行匹配,如果匹配成功就路由转发,如果匹配失败就返回404。Spring Cloud中的Gateway分为两大类,即:内置的自定义的,下面详细介绍!

官网:Route Predicate Factories :: Spring Cloud Gateway

1.10.2、(内置)基于Datetime类型的断言工厂

        Datetime类型的断言工厂用于断言时间,断言为真则路由,否则404,主要有3个,如下:

系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

注意事项:这里的时间是带时区的时间,可以通过ZonedDateTime.now()获取

        系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

案例:

        系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

1.10.3、(内置)基于远程地址的断言工厂

系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

案例:

       系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

1.10.4、(内置)基于Cookie的断言工厂

系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

案例:

        系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

1.10.5、(内置)基于Header的断言工厂

系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

案例:

       系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

1.10.6、(内置)基于Host的断言工厂

系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

案例:

        系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

1.10.7、(内置)基于Method请求方法的断言工厂

系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

案例:

        系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

1.10.8、(内置)基于Path请求路径的断言工厂

系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

案例:

        系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

1.10.9、(内置)基于Query请求参数的断言工厂

系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

案例:

        系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

        系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

1.10.10、(内置)基于路由权重的断言工厂

系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

案例:

        系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

1.10.11、(自定义)基于权限的断言工厂

概述:

        上述内置的断言工厂已经能够满足我们日常工作的绝大部分场景,但是当内置的断言工厂不满足我们的需求时,那么我们可以通过自定义断言工厂的方式进行扩展,具体过程如下:

自定义断言工厂的步骤:

        (1)创建一个类并纳入Spring管理,添加@Component注解;

        (2)类必须以RoutePredicateFactory作为结尾,约定大于配置!

        (3)类必须继承自AbstractRoutePredicateFactory;

        (4)必须声明静态内部类、声明属性来接收配置文件中对应的断言信息;

        (5)结合shortcutFieldOrder进行绑定;

        (6)通过apply方法进行逻辑判断,如果为true则匹配成功,否则匹配失败;

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2024/1/4 9:38
 * @Description: 自定义断言工厂
 * 功能:校验用户的权限,如果用户是已授权用户则放行,否则失败!
 */
@Component
public class AuthRoutePredicateFactory extends AbstractRoutePredicateFactory<AuthRoutePredicateFactory.Config> {

    public static final String AUTHED_USER = "admin";

    public AuthRoutePredicateFactory() {
        super(AuthRoutePredicateFactory.Config.class);
    }

    public List<String> shortcutFieldOrder() {
        return Collections.singletonList("name");
    }

    public Predicate<ServerWebExchange> apply(final AuthRoutePredicateFactory.Config config) {
        return new GatewayPredicate() {
            public boolean test(ServerWebExchange serverWebExchange) {
                if (AUTHED_USER.equals(config.getName())) {
                    return true;
                }
                return false;
            }
        };
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Validated
    public static class Config {
        private String name;
    }
    
}

系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

1.11、过滤器工厂配置(局部)

1.11.1、内置

https://docs.spring.io/spring-cloud-gateway/reference/spring-cloud-gateway/gatewayfilter-factories.html

系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

1.11.2、自定义

概述:

        1.7.1官网提供的内置过滤器已经能够满足我们日常工作的绝大部分场景,但是当内置的过滤器不满足我们的需求时,那么我们可以通过自定义过滤器的方式进行扩展,具体过程如下:

自定义过滤器的步骤:

        (1)创建一个类并纳入Spring管理,添加@Component注解;

        (2)类必须以GatewayFilterFactory作为结尾,约定大于配置!

        (3)类必须继承自AbstractGatewayFilterFactory;

        (4)必须声明静态内部类、声明属性来接收配置文件中对应的断言信息;

        (5)结合shortcutFieldOrder进行绑定;

        (6)通过apply方法进行逻辑判断,如果为true则匹配成功,否则匹配失败;

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2024/1/4 10:28
 * @Description: 自定义过滤器
 */
@Component
public class AuthGatewayFilterFactory extends AbstractGatewayFilterFactory<AuthGatewayFilterFactory.Config> {
    public AuthGatewayFilterFactory() {
        super(AuthGatewayFilterFactory.Config.class);
    }

    public List<String> shortcutFieldOrder() {
        return Arrays.asList("value");
    }

    public GatewayFilter apply(final AuthGatewayFilterFactory.Config config) {
        return new GatewayFilter(){
            @Override
            public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                /**
                 * (1)name参数为空:成功
                 * (2)name参数不为空:获取name参数,值不等于value就失败,否则成功
                 */
                String name = exchange.getRequest().getQueryParams().getFirst("name");
                if (StringUtils.isNotBlank(name)) {
                    if (name.equals(config.getValue())) {
                        return chain.filter(exchange);
                    } else {
                        exchange.getResponse().setStatusCode(HttpStatus.NOT_FOUND);
                        return exchange.getResponse().setComplete();
                    }
                }
                return chain.filter(exchange);
            }
        };
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class Config {
        private String value;
    }
}

系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba 

1.12、全局过滤器(Global Filter)配置

1.12.1、概览

系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba

1.12.2、局部过滤器 vs 全局过滤器

局部过滤器:针对某个路由,需要在路由中进行配置

全局过滤器:针对所有路由请求,一旦定义就会投入使用,无需配置

GlobalFilter和GatewayFilter有着一样的定义,只不过前者会作用于所有的路由;

1.13、统一处理跨域

1.13.1、官网(配置方式)

https://docs.spring.io/spring-cloud-gateway/reference/spring-cloud-gateway/cors-configuration.html

系列十、Spring Cloud Gateway,Spring Cloud Alibaba系列,Gateway,cloud alibaba文章来源地址https://www.toymoban.com/news/detail-777496.html

1.13.2、代码方式

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2024/1/4 12:53
 * @Description:
 */
@Configuration
public class MyCorsConfig {

    @Bean
    public CorsWebFilter corsWebFilter() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.addAllowedHeader("*");

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**",corsConfiguration);

        return new CorsWebFilter(source);
    }

}

到了这里,关于系列十、Spring Cloud Gateway的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringCloud 微服务系列——Spring Cloud Alibaba 微服务工具集

    ✅作者简介:2022年 博客新星 第八 。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:SpringCloud 微服务学习专栏 ✨特色专栏:国学周更-心性养成之路 🥭本文内容:SpringCloud 微服

    2024年02月04日
    浏览(36)
  • 【Spring Cloud Alibaba】Spring Cloud Alibaba 搭建教程

    JDK 1.8+ Maven 3.6+ Spring Boot 2.2.4.RELEASE Spring Cloud Hoxton.SR1 Spring Cloud Alibaba 2.2.0.RELEASE 官网推荐对应版本 本文主要介绍了如何搭建一个 Spring Cloud Alibaba 项目,适合已经熟练使用 Spring Boot ,想要学习搭建 Spring Cloud Alibaba 项目的小伙伴。 Spring Cloud Alibaba 为分布式应用程序开发提供了

    2023年04月18日
    浏览(36)
  • Spring Cloud和Spring Cloud Alibaba

    Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导层选举、分布式对话、集群状态)。分布式系统的协调导致了锅炉板模式,使用Spring Cloud开发人员可以快速

    2024年04月11日
    浏览(38)
  • Spring Cloud 和Spring Cloud Alibaba

    一、什么是SpringCloud? SpringCloud是基于SpringBoot的一整套实现微服务的框架。他提供了微服务开发所需的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等组件。最重要的是,跟Spring Boot框架一起使用的话,会让你

    2024年02月12日
    浏览(32)
  • Spring Cloud Alibaba

    Spring Cloud Alibaba是一个基于Spring Cloud的开源框架,它提供了一系列的微服务解决方案,如服务注册与发现、配置中心、消息总线、负载均衡、服务熔断、限流等。本文将介绍Spring Cloud Alibaba的基本概念和使用方法。 服务注册与发现是微服务架构中最基本的组件之一,它可以让

    2024年02月04日
    浏览(37)
  • Spring Cloud Alibaba (一)

    1 微服务介绍 1.1 系统架构演变 随着互联网的发展,网站应用的规模也在不断的扩大,进而导致系统架构也在不断的进行变化。 从互联网早起到现在,系统架构大体经历了下面几个过程: 单体应用架构---垂直应用架构---分布 式架构---SOA架构---微服务架构,当然还有悄然兴起的

    2024年02月14日
    浏览(36)
  • Spring Cloud Alibaba面试题

    ​ 1、有了Spring Cloud,为什么又出现了Spring Cloud Alibaba? Spring Cloud netflix 进入维护模式,将模块置于维护模式,意味着 Spring Cloud 团队将不会再向模块添加新功能。我们将修复 block 级别的 bug 以及安全问题,我们也会考虑并审查社区的小型 pull request。 2、什么是Spring Cloud Alibab

    2024年03月12日
    浏览(34)
  • spring cloud alibaba组件介绍

    1.Spring Cloud Alibaba Nacos 是阿里巴巴集团自主研发的动态服务发现、配置管理和服务管理平台。它可以实现服务之间的注册和发现,提供配置管理、服务治理、流量控制等功能。 2.Spring Cloud Alibaba RocketMQ 是阿里巴巴集团自主研发的高性能、高可用、高扩展的分布式消息中间件。

    2024年02月15日
    浏览(33)
  • Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系

    一、前言 在搭建SpringCloud项目环境架构的时候,经常需要选择SpringBoot和SpringCloud进行兼容的版本号。因此,对于选择SpringBoot版本与SpringCloud版本的对应关系很重要,如果版本关系不对应,常见的会遇见项目启动不起来,怪异的则会是你的项目出现一些诡异的问题,查资料也不

    2024年02月07日
    浏览(34)
  • 【Spring Cloud】Spring Cloud Alibaba-- 分布式事务Seata原理

    Seata 是一款开源的分布式事务解决方案,致力于提供高性能与简单易用的分布式事务服务,为用户提供了 AT、TCC、SAGA 和 XA 几种不同的事务模式: AT模式:无侵入式的分布式事务解决方案,适合不希望对业务进行改造的场景,但由于需要添加全局事务锁,对影响高并发系统的

    2024年02月08日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包