GetWay

news2024/12/29 8:44:34

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做统一鉴权,负载均衡,服务发现

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DeepDriving | CUDA编程-03:线程层级

本文来源公众号“DeepDriving”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;CUDA编程-03:线程层级 DeepDriving | CUDA编程-01&#xff1a; 搭建CUDA编程环境-CSDN博客 DeepDriving | CUDA编程-02&#xff1a; 初识CUDA编程-C…

操作系统总结3

目录 2.3.3 进程互斥的硬件的实现方法 &#xff08;1&#xff09;知识总览 &#xff08;2&#xff09;中断的屏蔽方法 &#xff08;3&#xff09;TestAndSet指令 &#xff08;4&#xff09;Swap指令 总结 2.3.4 信号量机制 &#xff08;1&#xff09;知识总览 &#x…

IO游戏设计思路

1、TCP ,UDP ,KCP ,QUIC TCP 协议最常用的协议 UDP协议非常规的协议&#xff0c;因为需要在线广播&#xff0c;貌似运营商会有一些影响 KCP 基于UDP的协议&#xff0c;GitHub - l42111996/java-Kcp: 基于java的netty实现的可靠udp网络库(kcp算法)&#xff0c;包含fec实现&am…

50.WEB渗透测试-信息收集-CDN识别绕过(3)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;49.WEB渗透测试-信息收集-CDN识别绕过&#xff08;2&#xff09; 关于cdn的识别方法内容…

智享无人直播系统(三代)融合AI智能互动,成就无人直播行业的新巨星!

随着直播行业的不断发展&#xff0c;智享直播&#xff08;三代&#xff09;作为首家自主研发的智能AI直播软件引领了行业的新潮流。相比市场上的其他同类软件&#xff0c;我们的软件通过创新的功能实现了直播间的AI智能互动&#xff0c;提供了丰富而个性化的直播体验。最重要的…

坚守互联网底层逻辑,搜狐走向长期主义的next level

2024年以来&#xff0c;随着我国经济回升向好态势进一步巩固增强&#xff0c;网络内容供给不断丰富&#xff0c;新型消费持续活跃&#xff0c;互联网板块整体估值向预期进行修正。因此&#xff0c;中概互联网指数ETF&#xff08;KWEB&#xff09;一转颓势&#xff0c;截至5月21…

拼多多:电商卷王

618大促将至&#xff0c;你还在天天算怎么用券吗&#xff1f;各电商卷来卷去&#xff0c;但可能都卷不过“天天618”的——拼多多。 5月22日&#xff0c;拼多多公布Q1财报&#xff0c; 营收同比增长131%至868.1亿人民币&#xff0c;调整后净利润同比增长202%至306.0亿元人民币…

Vue从入门到实战Day11

一、为什么要学Vue3 Vue3官网&#xff1a;简介 | Vue.js 1. Vue3的优势 2. Vue2选项式API vs Vue3组合式API 示例&#xff1a; 二、create-vue搭建Vue3项目 1. 认识create-vue create-vue是Vue官方新的脚手架工具&#xff0c;底层切换到了vite(下一代构建工具)&#xff0c;为…

【Vue2.x】props技术详解

1.什么是prop&#xff1f; 定义&#xff1a;组件标签上注册的一些自定义属性作用&#xff1a;向子组件传递数据特点 可以传递任意数量的prop可以传递任意类型的prop 2.prop校验 为了避免乱传数据&#xff0c;需要进行校验 完整写法 将之前props数组的写法&#xff0c;改为对象…

【搜索】BFS

#include <iostream> #include <cstring> #include <queue>using namespace std;const int N 110;typedef pair<int, int> PII;int n, m; int g[N][N], d[N][N];//存放地图//存每一个点到起点的距离int bfs() {queue< PII > q;q.push({0, 0});m…

Docker技术搭建Grafana监控平台

centos7虚拟机和docker的安装&#xff1a;可以参考之前的博文 CPU、mysql-exporter、docker监控模板&#xff1a;百度网盘 提取码&#xff1a;0000 先查看服务器时间是否和当前时间一致&#xff0c;如果不一致&#xff0c;查看对应设置&#xff1a;centos7时间同步博文 一、…

计网期末复习指南:万字总结计算机网络体系结构 | 计算机网络的组成、类别、性能

目录 一.互联网的发展阶段 二.计算机网络的类别 三.互联网的组成 ▐ 网络边缘部分 客户/服务器方式&#xff08;C/S方式&#xff09; 对等方式&#xff08;P2P方式&#xff09; ▐ 网络核心部分 电路交换 报文交换 分组交换 四.计算机网络的性能 ▐ 速率 ▐ 带宽 …

错误0xc0000022的3种解决方法

程序无法正常启动&#xff0c;报错代码为0xc0000022。当你的电脑运行程序出现这种情形&#xff0c;多半是由于系统的权限问题引起的。 原因一&#xff1a;应用程序的访问权限不足 有时候&#xff0c;直接打开文件时会遇到“0xc0000022” 错误&#xff0c;但是右键“以管理员身份…

深入解析力扣161题:相隔为 1 的编辑距离(逐字符比较与动态规划详解)

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

手把手教你搭建一个花店小程序商城

如果你是一位花店店主&#xff0c;想要为你的生意搭建一个精美的小程序商城&#xff0c;以下是你将遵循的五个步骤。 步骤1&#xff1a;登录乔拓云平台进入后台 首先&#xff0c;你需要登录乔拓云平台的后台管理页面。你可以在电脑或移动设备上的浏览器中输入乔拓云的官方网站…

STM32使用旋转编码开关

一、旋转编码开关如何工作 编码器内部有一个开槽圆盘&#xff0c;连接到公共接地引脚 C。它还具有两个接触针 A 和 B&#xff0c;如下所示。 当您转动旋钮时&#xff0c;A 和 B 按照特定顺序与公共接地引脚 C 接触&#xff0c;具体顺序取决于转动旋钮的方向。 当它们与公共地接…

VSCode SAP Systems配置HTTPS访问SAP

第一次访问提示&#xff0c;Self-Signed 证书 解决办法&#xff1a;https访问SAP Fiori网站&#xff0c;导出SSL证书为DER格式保存到硬盘上 双击DER文件&#xff0c;导入到系统 退出VSCode&#xff0c;再次启动 Test Connection, 提示 The system URL is using a hostname o…

计算机系统概述习题

选择题 电子计算机问世至今&#xff0c;新型计算机不断推陈出新&#xff0c;不管怎么更新&#xff0c;依然具有“存储程序”的特点&#xff0c;最早提出这种概念的是(B) A. 巴贝奇 B. 冯*诺伊曼 C. 帕斯卡 D. 贝尔 B下列描述中___是正确的。 A. 控制器能理解&#xff0c;解释…

【C语言深度解剖】(17):预处理和程序环境

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《C语言深度解剖》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多C语言深度解剖点击专栏链接查看&…

gpt-4o继续迭代考场安排程序 一键生成考场清单

接上两篇gpt-4o考场安排-CSDN博客&#xff0c;考场分层次安排&#xff0c;最终exe版-CSDN博客 当然你也可以只看这一篇。 今天又添加了以下功能&#xff0c;程序见后。 1、自动分页&#xff0c;每个考场打印一页 2、添加了打印试场单页眉 3、添加了页脚 第X页&#xff0c;…