GetWay

SpringCloud - Spring Cloud 之 Gateway网关,Route路由,Predicate 谓词/断言,Filter 过滤器(十三)_spring.cloud.gateway.routes-CSDN博客

官网:Spring Cloud Gateway

工作原理:Spring Cloud Gateway

Glossary

  • Route: The basic building block of the gateway. It is defined by an ID, a destination URI, a collection of predicates, and a collection of filters. A route is matched if the aggregate predicate is true.

  • Predicate: This is a Java 8 Function Predicate. The input type is a Spring FrameworkServerWebExchange. This lets you match on anything from the HTTP request, such as headers or parameters.

  • Filter: These are instances of GatewayFilter that have been constructed with a specific factory. Here, you can modify requests and responses before or after sending the downstream request.

一、Route:路由

    1)、正常路由

        1、引入依赖

<!--引入nacos discovery-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

        2、修改配置文件:如果spring.cloud.gateway.discovery.locator.enabled设置true,Gateway启动时将注册中心查询到的所有服务,自动创建默认路由规则: 服务名/path

spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: localhost:8848
    gateway:
      routes:
        - id: user
          uri: http://localhost:8083
          predicates:
            - Path=/user/**
          filters:
            - StripPrefix=1
      discovery:
        locator:
          enabled: true #设置ture默认设置上面的route

    2)、添加loadbalancer负载

        1、添加依赖        

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

        2、修改配置文件

spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: localhost:8848
    gateway:
      routes:
        - id: user
          uri: lb://user #loadbalancer负载修改
          predicates:
            - Path=/user/**
          filters:
            - StripPrefix=1
      discovery:
        locator:
          enabled: true

  3)、整合nacos实现动态路由        

        1、nacos service配置创建gateway.yaml文件,保存gateway路由信息

        2、引入配置

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

        3、增加bootstrap.yaml配置

spring:
  cloud:
    nacos:
      # nacos作为配置中心的地址
      server-addr: localhost:8848
      config:
        file-extension: yaml
        shared-configs[0]:   # gateway.yaml
          data-id: gateway.yaml
          refresh: true

     4、修改nacos service配置创建gateway.yaml文件,动态改变路由

        5、原理:nacos修改配置文件->push客户端->nacos客户端调用NacosContextRefresher#registerNacosListener->发布RefreshEvent事件

                        ->RefreshEventListener监听器->this#refresh#refresh() ->this#scoper#refreshAll()->发布RefreshScopeRefreshEvent事件:this#context#publishEvent(new RefreshScopeRefreshedEvent()) -> RouteRefreshListener监听器调用reset方法,发布RefreshRouteEnver事件

                        ->CachingRouteLocator#onApplicationEvent完成路由规则的更新

                简易版:nocos修改配置文件 -> push客户端 -> 客户端发布RefreshEvent事件、RefreshScopeRefreshEvent事件、RefreshRouteEnver事件 ->CachingRouteLocator完成本地缓存更新

    3)、设置日志级别    

logging:
  level:
    reactor.netty: debug

    4)、设置actuator api:Spring Cloud Gateway

        1、引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

        2、修改配置文件

management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: always
        3、常见api操作: Spring Cloud Gateway
        4、访问: http://localhost:8090/actuator/gateway/routes
二、Predicate:断言:
    1、Predicate与Filter两种配置方式: Spring Cloud Gateway
            1)、快捷配置:Shortcut configuration
spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - Cookie=mycookie,mycookievalue

            1)、完整扩展参数:Fully Expanded Arguments

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

    2、路由断言工厂

        

        1)、The After Route Predicate Factory:在指定事件之后的请求匹配

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - After=2017-01-20T17:42:47.789-07:00[America/Denver]

        2)、The Before Route Predicate Factory:在指定事件之前的请求匹配

spring:
  cloud:
    gateway:
      routes:
      - id: before_route
        uri: https://example.org
        predicates:
        - Before=2017-01-20T17:42:47.789-07:00[America/Denver]

       3)、The Between Route Predicate Factory:在指定事件之间的请求匹配

spring:
  cloud:
    gateway:
      routes:
      - id: between_route
        uri: https://example.org
        predicates:
        - Between=2024-05-15T13:42:47.789-07:00[Asia/Shanghai], 2024-05-15T14:42:47.789-07:00[Asia/Shanghai]

       4)、The Cookie Route Predicate Factory:带有指定Cookie名的请求匹配

spring:
  cloud:
    gateway:
      routes:
      - id: cookie_route
        uri: https://example.org
        predicates:
        - Cookie=chocolate, ch.p

       5)、The Header Route Predicate Factory:带有指定请求头的请求匹配

spring:
  cloud:
    gateway:
      routes:
      - id: header_route
        uri: https://example.org
        predicates:
        - Header=X-Request-Id, \d+

      6)、The Host Route Predicate Factory:带有指定host的请求匹配

spring:
  cloud:
    gateway:
      routes:
      - id: host_route
        uri: https://example.org
        predicates:
        - Host=**.somehost.org,**.anotherhost.org

     7)、The Method Route Predicate Factory:指定方法请求匹配

spring:
  cloud:
    gateway:
      routes:
      - id: method_route
        uri: https://example.org
        predicates:
        - Method=GET,POST

     8)、The Path Route Predicate Factory:指定请求路径请求匹配

spring:
  cloud:
    gateway:
      routes:
      - id: path_route
        uri: https://example.org
        predicates:
        - Path=/red/{segment},/blue/{segment}

     9)、The Query Route Predicate Factory:指定查询参数请求匹配

spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: https://example.org
        predicates:
        - Query=green

     10)、The RemoteAddr Route Predicate Factory:指定远程调用ip请求匹配

spring:
  cloud:
    gateway:
      routes:
      - id: remoteaddr_route
        uri: https://example.org
        predicates:
        - RemoteAddr=192.168.1.1/24 #24 是子网掩码

     11)、The Weight Route Predicate Factory:指定远程调用ip请求匹配:使用权重来路由相应请求,以下代码表示有80%的请求会被路由到weighthigh.org、20%会被路由到weightlow.org

spring:
  cloud:
    gateway:
      routes:
      - id: weight_high
        uri: https://weighthigh.org
        predicates:
        - Weight=group1, 8
      - id: weight_low
        uri: https://weightlow.org
        predicates:
        - Weight=group1, 2

     12)、The XForwarded Remote Addr Route Predicate Factory:指定请求X-Forwarded-For请求头匹配

spring:
  cloud:
    gateway:
      routes:
      - id: xforwarded_remoteaddr_route
        uri: https://example.org
        predicates:
        - XForwardedRemoteAddr=192.168.1.1/24

     13)、自定义断言

            1、创建时间配置

@Data
public class JackTimeBetweenConfig {
    private LocalTime begin;
    private LocalTime end;
}

            2、创建断言工厂

@Component
public class SkTimeBetweenRoutePredicateFactory extends AbstractRoutePredicateFactory<SkTimeBetweenConfig> {
    public SkTimeBetweenRoutePredicateFactory() {
        super(SkTimeBetweenConfig.class);
    }

    // 定义配置配与配置文件中的配置项的映射关系
    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("begin", "end");
    }

    @Override
    public Predicate<ServerWebExchange> apply(SkTimeBetweenConfig config) {
        // 获取配置文件中的配置值
        LocalTime begin = config.getBegin();
        LocalTime end = config.getEnd();


        // full
        return new Predicate<ServerWebExchange>() {
            @Override
            public boolean test(ServerWebExchange serverWebExchange) {
                LocalTime now = LocalTime.now();
                return now.isAfter(begin) && now.isBefore(end);
            }
        };
    }
}

            3、配置

spring:
  cloud:
    gateway:
      routes:
        - id: sktimebetween
          uri: lb://user    # 集成了loadbalancer   根据lb://   order名称进行服务发现和负载均衡得到一个结果值   http://localhost:9091/2/3   /order/query
          predicates:    # &&
          - Path=/time/**    # localhost:8090/jack/order/query
          - SkTimeBetween=下午2:00,下午4:00
          filters:
            - StripPrefix=1

三、Filter:过滤器

    1、局部过滤器

        

        1)、AddRequestHeader GatewayFilter Factory:为请求添加请求头

        2)、AddRequestParameter GatewayFilter Factory:为请求添加请求参数

        3)、AddResponseHeader GatewayFilter Factory:为响应添加响应头

        4)、RequestRateLimiter GatewayFilter Factory:请求限流

        5)、StripPrefix GatewayFilter Factory:表示要从前截取的路径个数

        6)、StripPrefix GatewayFilter Factory

        ....等等

    1.1、自定义局部过滤器

        1)、新增局部过滤器       

@Slf4j
@Component
public class LogPrintGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {
    @Override
    public GatewayFilter apply(NameValueConfig config) {
        return ((exchange, chain) -> {
            // 打印日志
            log.info("打印日志...{},{}",config.getName(),config.getValue());
            ServerHttpRequest request = exchange.getRequest().mutate().build();
            return chain.filter(exchange.mutate().request(request).build());
        });
    }
}

        2)、新增配置

  filters:
    - StripPrefix=1
    - LogPrint=sk,18

  2、全局过滤器

         

    2.1、自定义全局过滤器

        1)、新增自定义全局过滤器

@Component
public class CheckHeaderTokenGlobalFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String value = exchange.getRequest().getHeaders().getFirst("token");// 以token为key的值
        if("token令牌".equals(value)){
            return chain.filter(exchange);
        }
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        return exchange.getResponse().setComplete();
    }

    // order值越小,执行的优先级就越高
    @Override
    public int getOrder() {
        return 0;
    }
}

        2)、请求头token入参含有token令牌

五、与nginx网关差异

        1、API 网关介绍

网关 =  路由转发 + 过滤器(geteway filler 和 global fillter)

角色:一个API架构,用来保护、增强、控制 对于API服务的访问,用来管理权限、访问控制、流量限制等

        2、nginx

    一个高性能的http和反向代理web服务器

        3、geteway

    微服务网关,统一路由、统一鉴权,跨域,限流等功能,springcloud gateway基于webflux框架实现

        4、区别

            1)、语言不同:nginx是c语言写的,gateway是java语言写的

            2)、功能不同:nginx做总流量入口,反向代理,负载均衡等,还可以做web服务器;gateway做路由,断言,过滤器

            3)、角色不同:nginx做反向代理、负载均衡;gateway做统一鉴权,负载均衡,服务发现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/637723.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot:SpringBoot 如何优雅地定制JSON响应数据返回

一、前言 目前微服务项目中RESTful API已经是前后端对接数据格式的标配模式了&#xff0c;RESTful API是一种基于REST&#xff08;Representational State Transfer&#xff0c;表述性状态转移&#xff09;原则的应用程序编程接口&#xff08;Application Programming Interfac…

光伏电站在线监测智能诊断系统:开启无人值守新纪元

光伏电站在线监测智能诊断系统&#xff1a;开启无人值守新纪元 大家都知道光伏电站是通过汲取着太阳的光芒&#xff0c;为人类提供源源不断的电能源。然而&#xff0c;随着光伏电站规模的扩大和复杂性的增加&#xff0c;如何有效提高发电效率、减少人工维护成本&#xff0c;实…

前端菜鸡,对于35+程序员失业这个事有点麻了

“经常看到30岁程序员失业的新闻&#xff0c;说实话&#xff0c;有点麻。目前程序员供求关系并未失衡&#xff0c;哪怕是最基础的前端或者后台、甚至事务型的岗位也是足够的。 事实上&#xff0c;现在一个开出的岗位要找到一位尽职尽责能顺利完成工作的程序员并不是一件那么容…

YOLOv8原理详解

Yolov8是2023年1月份开源的。与yolov5一样&#xff0c;支持目标检测、分类、分割任务。 Yolov8主要改进之处有以下几个方面&#xff1a; Backbone&#xff1a;依旧采用的CSP的思想&#xff0c;不过将Yolov5中的C3模块替换为C2F模块&#xff0c;进一步降低了参数量&#xff0c…

mysql实战——mysql5.7升级到mysql8.0

1、上传mysql8.0压缩包到/usr/local目录下 tar -zxvf mysql-8.0.25-linux-glibc2.12-x86_64.tar.xz mv mysql-8.0.25-linux-glibc2.12-x86_64 mysql8 #更改文件夹所属 chown -R mysql.mysql /usr/local/mysql8/ 2、更改配置文件my.cnf vi /etc/my.cnf # 最后几个for8.0的参数要…

Java输入与输出详解

Java输入和输出 前言一、Java打印Hello World二、输出到控制台基本语法代码示例格式化字符串 三、从键盘输入读入一个字符正确写法 使用 Scanner 读取字符串/整数/浮点数使用 Scanner 循环读取 N 个数字 前言 推荐一个网站给想要了解或者学习人工智能知识的读者&#xff0c;这…

tomcat jdbc连接池的默认配置

MySQL 5.0 以后针对超长时间数据库连接做了一个处理&#xff0c;即一个数据库连接在无任何操作情况下过了 8 个小时后(MySQL 服务器默认的超时时间是 8 小时)&#xff0c;MySQL 会自动把这个连接关闭。在数据库连接池中的 connections 如果空闲超过 8 小时&#xff0c;MySQL 将…

详解 UML 中的关系概念

关联&#xff08;Association&#xff09; 表示两个类之间的一种语义性联系。例如: 学生与班级之间的关联关系。 有向关联&#xff08;Directed Association&#xff09; 关联关系有方向性,表示一个类能访问另一个类,但不一定反过来。例如: 教师能查看学生的成绩,但学生不能查…

PMapper:助你在AWS中实现IAM权限快速安全评估

关于PMapper PMapper是一款功能强大的脚本工具&#xff0c;该工具本质上是一个基于Python开发的脚本/代码库&#xff0c;可以帮助广大研究人员识别一个AWS账号或AWS组织中存在安全风险的IAM配置&#xff0c;并对IAM权限执行快速评估。 PMapper可以将目标AWS帐户中的不同IAM用户…

C++入门:从C语言到C++的过渡(1)

目录 1.什么是C 2.C的标准库 3.命名空间 3.1为什么要存在命名空间 3.2命名空间的定义 3.3命名空间的使用 3.3.1域作用限定符 3.3.2using关键字引入某个成员 3.3.3using关键字引入命名空间名称 3.4命名空间的嵌套 3.5命名空间的合并 4.C中的输入与输出 1.什么是C C&am…

BatBot智慧能源管理平台,更加有效地管理能源

随着能源消耗的不断增加&#xff0c;能源管理已成为全球面临的重要问题。BatBot智慧能源管理作为一种的能源管理技术&#xff0c;促进企业在用能效率及管理有着巨大的提升。 BatBot智慧能源管理是一种基于人工智能技术的能源管理系统&#xff0c;通过智能分析和优化能源使用&…

7. 3 层神经网络的实现和输出层的激活函数

目录 1. 3 层神经网络的实现 1.1 输入层数据到 1 层神经元 1.2 1 层神经元到 2 层神经元 1.3 2 层神经元到输出层神经元 2. 输出层的激活函数 2.1 恒等函数 2.2 softmax 函数 2.2.1 softmax 函数表达式 2.2.2 softmax 代码实现 2.2.3 softmax 的改进 2.2.3 softmax 函…

Mixiy(米思齐)安装

Mixiy(米思齐)安装 官网地址&#xff1a;爱上米思齐 打开官网&#xff0c;选择下图的软件进行下载 复制提取码&#xff0c;点击链接跳转到网盘进行下载&#xff0c;选择(RC4完整版) 下载完成后&#xff0c;解压到合适的位置&#xff0c;进入文件夹&#xff0c;双击Mixly.exe即…

Spark SQL【Java API】

前言 之前对 Spark SQL 的影响一直停留在 DSL 语法上面&#xff0c;感觉可以用 SQL 表达的&#xff0c;没有必要用 Java/Scala 去写&#xff0c;但是面试一段时间后&#xff0c;发现不少公司还是在用 SparkSQL 的&#xff0c;京东也在使用 Spark On Hive 而不是我以为的 Hive O…

C++数据结构——哈希表

前言&#xff1a;本篇文章将继续进行C数据结构的讲解——哈希表。 目录 一.哈希表概念 二.哈希函数 1.除留取余法 三.哈希冲突 1.闭散列 线性探测 &#xff08;1&#xff09;插入 &#xff08;2&#xff09;删除 2. 开散列 开散列概念 四.闭散列哈希表 1.基本框架 …

一.ffmpeg 将内存中的H264跟PCM 数据流合成多媒体文件

在有一些嵌入式平台中&#xff0c;H264数据流一般来自芯片内部的硬编码器&#xff0c; AAC音频数据则是通过采集PCM进行软编码&#xff0c;但是如何对它实时进行封装多媒体文件 &#xff0c;参考ffmpeg example&#xff0c;花了一些时间终于实现了该功能。 流程图如下&#xf…

es问题汇总--待完善

1. 查询某个索引库中数据总量 方式一&#xff1a; CountRequest 鄙人喜欢这种方式 public long getTotalNum(String indexName) throws IOException {CountRequest countRequest new CountRequest(indexName);// 如果需要&#xff0c;你可以在这里添加查询条件// countReques…

内脏油脂是什么?如何减掉?

真想减的人&#xff0c;减胖是很容易的&#xff0c;但想要形体美又健康&#xff0c;还是得从减内脏油脂开始&#xff0c;那么&#xff0c;问题来了&#xff0c;什么是内脏油脂&#xff1f; 油脂它分部于身体的各个角落&#xff0c;四肢、腹部、腰、臀部、脸、脖子...等&#xf…

暴雨信息液冷计算解决方案亮相CCIG 2024

5月24日&#xff0c;2024中国图象图形大会&#xff08;CCIG&#xff09;在陕西西安正式开幕。作为涵盖图像图形各专业领域的综合性的全国性学术会议&#xff0c;CCIG面向开放创新、交叉融合的发展趋势&#xff0c;为图像图形相关领域的专家学者和产业界的同仁&#xff0c;搭建了…

深入用户内心:设计师如何通过可用性测试洞察用户需求

可用性测试是指让用户体验产品的原型或成品。设计师通过观察和分析用户的使用行为和感受&#xff0c;进一步合理地改进产品的设计方法。你可能会想知道我们可以用什么方法来测试可用性&#xff1f;随着互联网行业的快速迭代更新&#xff0c;可用性测试衍生出了许多类型和方法。…