百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

一文讲通springcloud gateway基础

ztj100 2024-10-29 18:20 34 浏览 0 评论

关于springcloud gateway的介绍闲言少叙,直接上手

快速上手

使用spring cloud gateway非常容易上手,在全面学习之前,我们先来看一个简单的小例子。

创建一个spring boot项目

使用spring initializr创建一个spring boot项目,选择webflux和gateway的依赖。

编写一个简单的路由

在application.yml中添加如下配置:

spring:
  cloud:
    gateway:
      routes:
        - id: path_route
          predicates:
            - Path=/get
          uri: http://www.baidu.com

通过这个简单的配置文件,可以看出spring cloud gateway是由一些列route组成的

route路由是Spring Cloud Gateway的基本模块,它由一个ID、一个目标URI、一系列的断言和一系列的过滤器组成。

上面这个配置的含义通过断言对路径是/get的请求,转发到uri http://www.baidu.com。

启动项目

启动项目,访问[http://localhost:8080/get,可以看到页面加载了百度首页。

基本流程

熟悉Spring Cloud gateway要解决的问题和基本流程,才能让我们更好的学习它。spring cloud gateway的基本流程如下图所示:

img.png

当客户端发送请求到Spring Cloud Gateway时,spring gateway会根据请求的信息和路由规则匹配相应的Gateway Web Handler。Handler会通过一个filter的链路来对请求进行处理,filter可以在request代理发送前或者发送后进行数据处理。

核心概念

路由

路由是Spring Cloud Gateway的基本模块,它由一个ID、一个目标URI、一系列的断言和一系列的过滤器组成。 当一个请求进入Spring Cloud Gateway时,系统会按照顺序去试着匹配所有的路由,当匹配成功时,就会执行相应的过滤器链。然后转发给目标URI。

实际上使用Spring Cloud Gateway时,我们主要的工作就是指定路由规则。也就是指定路由的ID、目标URI、断言和过滤器。指定路由规则的方式有两种,一种是在配置文件中指定,另一种是通过编码的方式指定。

配置文件指定路由规则

在application.yml中添加如下配置:

spring:
  cloud:
    gateway:
      routes:
        - id: path_route
          uri: http://www.baidu.com
          predicates:
            - Path=/get
        - id: host_route
          uri: http://www.baidu.com
          predicates:
            - Host=**.baidu.com

编码指定路由规则

在Spring Cloud Gateway中,我们可以通过编码的方式去指定路由规则,这种方式更加灵活,我们可以在运行时动态的添加、删除路由规则。

@Configuration
public class GatewayConfig {


    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("path_route", r -> r.path("/get")
                        .uri("http://www.baidu.com"))
                .route("host_route", r -> r.host("*.baidu.com")
                        .uri("http://www.baidu.com"))
                .build();
    }
}

无论是哪种方式,在路由的配置中,我们基本上需要做的就是指定断言、设定过滤器、指定跳转或者处理的handler。 下面我们就一一了解下这些概念。

断言

断言是一个布尔表达式,它的作用是判断请求是否满足路由的条件。 如果断言为true,则匹配该路由,否则不匹配。 断言可以通过配置文件或者编码的方式去指定。

配置文件指定断言

在配置文件中指定断言又有两种方式,一种是快捷方式实现,一种是全量方式实现。

快捷方式实现

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - Cookie=mycookie,mycookievalue

全量方式实现

spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: https://example.org
          predicates:
            - name: Cookie
              args:
                name: mycookie
                regexp: mycookievalue

通过上述两种方式,我们可以看到:快捷方式通过逗号分隔的方式去指定断言的名称和参数,全量方式通过name和args两个属性去指定断言的名称和参数。

编码指定断言

在编码中指定断言,我们可以通过PredicateSpec的方法去指定断言,如下:

@Configuration
public class GatewayConfig {


    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("path_route", r -> r.path("/get").uri("http://www.baidu.com"))
                .route("host_route", r -> r.host("*.baidu.com").uri("http://www.baidu.com"))
                .build();
    }
}

在上述例子中,我们通过编码的方式去指定了两个路由规则,分别是path_route和host_route。我们通过编码的方式去设定断言、过滤器和目标URI。

断言中的segment

在断言中可以使用segment进行占位。并且segment代表的值,可以作为变量用在下面会提到的GatewayFilter中。

举个例子。

spring:
  cloud:
    gateway:
      routes:
      - id: path_route
        uri: https://example.org
        predicates:
        - Path=/red/{segment},/blue/{segment}
        filters:
        - AddRequestHeader=X-Request-Red, Blue-{segment}

这个断言可以接收/red/1或者/red/1/或者/red/blue或者/blue/green

如果matchTrailingSlash设置为false,/red/1/这种最后带/的就不能接收。matchTrailingSlash默认是true。

断言的总结

当你理解了断言的意图及配置方式后,使用断言就变得非常简单。一些常用的内置的断言工厂,你可以通过官网去学习他们的使用方法。

过滤器

过滤器是Spring Cloud Gateway的核心组件,它的作用是在请求被路由之前或之后对请求进行修改。Spring Cloud Gateway的过滤器分为两种类型:GatewayFilter和GlobalFilter

  • GlobalFilter:全局过滤器,可以在请求被路由之前或之后对请求进行修改。
  • GatewayFilter:作用于单个路由的局部过滤器,可以在请求被路由之前或之后对请求进行修改。

全局过滤器

全局过滤器是作用于所有路由的过滤器,可以在请求被路由之前或之后对请求进行修改。Spring Gateway内置了一些全局过滤器。除了内置的常用全局过滤器以外,我们还可以自定义全局过滤器。关于内置的全局过滤器,你可以通过官网去一一了解,或者有用到全局过滤器的时候先去官网查找。如果没有合适的再考虑自定义过滤器。

配置文件指定全局过滤器

spring:
  cloud:
    gateway:
      globalfilters:
        - name: AddRequestHeader
          args:
            name: X-Request-Global-Foo
            value: Global-Bar

编码指定全局过滤器

@Configuration
public class GatewayConfig {
    @Bean
    public GlobalFilter customGlobalFilter() {
        return (exchange, chain) -> {
            ServerHttpRequest request = exchange.getRequest().mutate().header("X-Request-Global-Foo", "Global-Bar").build();
            return chain.filter(exchange.mutate().request(request).build());
        };
    }
}

自定义全局过滤器

自定义过滤器需要实现GatewayFilter接口,如下:

@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {


    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("global filter");
        return chain.filter(exchange);
    }


    @Override
    public int getOrder() {
        return 0;
    }
}

在实际的使用中可以根据自己的业务需求去使用或者组合使用合适的过滤器。

局部过滤器

局部过滤器是作用于单个路由的过滤器,可以在请求被路由之前或之后对请求进行修改。Spring Gateway内置了一些局部过滤器。除了内置的常用局部过滤器以外,我们还可以自定义局部过滤器。 关于内置的全局过滤器,你可以通过官网去一一了解,或者有用到全局过滤器的时候先去官网查找。如果没有合适的再考虑自定义过滤器。

配置文件中配置局部过滤器

在配置文件中,定义的Router中,我们通过Filters来指定过滤器。在Filters中,我们可以指定多个过滤器,过滤器的执行顺序是按照Filters中的顺序来执行的。在每个过滤器中,我们通过Name和Args来指定过滤器的名称和参数。或者我们可以通过 Name =Args的方式来设定过滤器。

spring:
  cloud:
    gateway:
      routes:
        - id: path_route
          uri: http://www.baidu.com
          predicates:
            - Path=/get
          filters:
            - AddRequestHeader=X-Request-Foo, Bar
            - AddResponseHeader=X-Response-Foo, Bar
            - DedupeResponseHeader=Foo
            - Hystrix=fooCommand
            - PrefixPath=/httpbin
            - PreserveHostHeader
            - RemoveRequestHeader=Foo
            - RemoveResponseHeader=Foo
            - RewritePath=/foo/(?<segment>.*), /$\{segment}
            - RewriteResponseHeader=Location, http://newlocation.org
            - RequestRateLimiter=5, 1, SECONDS
            - Retry=3
            - SaveSession
            - SecureHeaders
            - SetPath=/foo/{segment}
            - SetRequestHeader=X-Request-Foo, Bar
            - SetResponseHeader=X-Response-Foo, Bar
            - SetStatus=401
            - StripPrefix=1
            - StripRequestHeader=Foo
            - StripResponseHeader=Foo
            - Weight=foo, 5

编码使用局部过滤器

在编码中,我们可以通过Filters来指定过滤器。在Filters中,我们可以指定多个过滤器,过滤器的执行顺序是按照Filters中的顺序来执行的。

@Configuration
public class GatewayConfig {


    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("path_route", r -> r.path("/get")
                        .filters(f -> f.addRequestHeader("X-Request-Foo", "Bar")
                                .addResponseHeader("X-Response-Foo", "Bar"))
                        .uri("http://www.baidu.com"))
                .build();
    }
}

自定义局部过滤器

自定义过滤器需要实现GatewayFilter接口,如下:

@Component
public class MyGatewayFilter implements GatewayFilter, Ordered {


    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("gateway filter");
        return chain.filter(exchange);
    }


    @Override
    public int getOrder() {
        return 0;
    }
}

Handler Function

通过配置断言和过滤器,可以让Spring Cloud Gateway将请求路由到指定的服务上。但是,如果我们想要在Spring Cloud Gateway中直接处理请求,而不是将请求路由到指定的服务上,那么我们就需要使用Handler Function。

Handler Function是WebFlux中的一个概念,它是一个函数,它接收一个ServerRequest对象,返回一个Mono对象。在Spring Cloud Gateway中,我们可以通过Handler Function来处理请求,而不是将请求路由到指定的服务上。

自定义一个Handler Function

自定义一个Handler Function需要实现HandlerFunction接口,如下:

@Component
public class MyHandlerFunction implements HandlerFunction<ServerResponse> {


    @Override
    public Mono<ServerResponse> handle(ServerRequest request) {
        return ServerResponse.ok().body(BodyInserters.fromObject("hello world"));
    }
}

使用Handler Function

import org.springframework.beans.factory.annotation.Autowired;


@Configuration
public class GatewayConfig {
    @Autowired
    private MyHandlerFunction myHandlerFunction;
    @Bean
    public RouterFunction<ServerResponse> htmlRouterFunction() {
        return RouterFunctions.route(RequestPredicates.path("/fallback"), myHandlerFunction));
    }
}

总结

Spring Cloud Gateway在微服务中使用相当的简单方便。大多数使用,我们只需要配置Spring Cloud Gateway连接到注册中心,然后配置路由规则即可。甚至很多时候,路由配置都不需要设计,他会默认把请求和注册中心的服务进行匹配,如果匹配到,就会自动路由到对应的服务上。

相关推荐

Python 操作excel的坑__真实的行和列

大佬给的建议__如何快速处理excelopenpyxl库操作excel的时候,单个表的数据量大一些处理速度还能接受,如果涉及多个表甚至多个excel文件的时候速度会很慢,还是建议用pandas来处理,...

Python os.path模块使用指南:轻松处理文件路径

前言在Python编程中,文件和目录的操作是非常重要的一部分。为了方便用户进行文件和目录的操作,Python标准库提供了os模块。其中,os.path子模块提供了一些处理文件路径的函数和方法。本文主要...

Python常用内置模块介绍——文件与系统操作详解

Python提供了多个强大的内置模块用于文件和系统操作,下面我将详细介绍最常用的几个模块及其核心功能。1.os模块-操作系统交互...

Python Flask 建站框架实操教程(flask框架网页)

下面我将带您从零开始构建一个完整的Flask网站,包含用户认证、数据库操作和前端模板等核心功能。##第一部分:基础项目搭建###1.创建项目环境```bash...

为你的python程序上锁:软件序列号生成器

序列号很多同学可能开发了非常多的程序了,并且进行了...

PO设计模式全攻略,在 UI 自动化中的实践总结(以企业微信为例)

一、什么是PO设计模式?PO(PageObject)设计模式将某个页面的所有元素对象定位和对元素对象的操作封装成一个Page类,即一个py文件,并以页面为单位来写测试用例,实现页面对象和测试用例的...

这种小工具居然也能在某鱼卖钱?我用Python一天能写...

前两天在某鱼闲逛,本来想找个二手机械键盘,结果刷着刷着突然看到有人在卖——Word批量转PDF小工具...

python打包成exe,程序有图标,但是任务栏和窗口都没有显示图标

代码中指定图标信息#设置应用ID,确保任务栏图标正确显示ifsys.platform=="win32":importctypesapp_id=...

使用Python构建电影推荐系统(用python做推荐系统)

在日常数据挖掘工作中,除了会涉及到使用Python处理分类或预测任务,有时候还会涉及推荐系统相关任务。...

python爬取并分析淘宝商品信息(python爬取淘宝商品数据)

python爬取并分析淘宝商品信息背景介绍一、模拟登陆二、爬取商品信息1.定义相关参数2.分析并定义正则3.数据爬取三、简单数据分析1.导入库2.中文显示3.读取数据4.分析价格分布5.分析销售...

OpenCV入门学习基础教程(从小白变大神)

Opencv是用于快速处理图像处理、计算机视觉问题的工具,支持多种语言进行开发如c++、python、java等,下面这篇文章主要给大家介绍了关于openCV入门学习基础教程的相关资料,需要的朋友可以...

python图像处理-一行代码实现灰度图抠图

抠图是ps的最基本技能,利用python可以实现用一行代码实现灰度图抠图。基础算法是...

从头开始学python:如何用Matplotlib绘图表

Matplotlib是一个用于绘制图表的库。如果你有用过python处理数据,那Matplotlib可以更直观的帮你把数据展示出来。直接上代码看例子:importmatplotlib.pyplot...

Python爬取爱奇艺腾讯视频 250,000 条数据分析为什么李诞不值得了

在《Python爬取爱奇艺52432条数据分析谁才是《奇葩说》的焦点人物?》这篇文章中,我们从爱奇艺爬取了5万多条评论数据,并对一些关键数据进行了分析,由此总结出了一些明面上看不到的数据,并...

Python Matplotlib 库使用基本指南

简介Matplotlib是一个广泛使用的Python数据可视化库,它可以创建各种类型的图表、图形和可视化效果。无论是简单的折线图还是复杂的热力图,Matplotlib提供了丰富的功能来满足我们...

取消回复欢迎 发表评论: