SpringCloud之网关组件Gateway学习

SpringCloud之网关组件Gateway学习

GateWay简介

Spring Cloud Gateway是Spring Cloud的⼀个全新项目,目标是取代Netflix Zuul,它基于Spring5.0+SpringBoot2.0+WebFlux(基于高性能的Reactor模式响应式通信框架Netty,异步⾮阻塞模型)等技术开发,性能⾼于Zuul,官方测试,Gateway是Zuul的1.6倍,旨在为微服务架构提供种简单有效的统⼀的API路由管理方式。Spring Cloud Gateway不仅提供统的路由方式(反向代理)并且基于 Filter(定义过滤器对请求过滤,完成⼀些功能) 链的式提供了网关基本的功能,例如:鉴权、
流量控制、熔断、路径重写、日志监控等。

Gateway相关概念

Gateway使用

在项目中引入Gateway的依赖,这里要注意的是Gateway不支持Spring boot web包,所以需要排除掉spring-boot-starter-web

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

在微服务系统中,如果没有引入网关组件,用户的请求是直接请求到具体的服务的,而引入网关后,用户的请求会被网关组件处理,然后由网关组件将请求转发给具体的服务实例进行处理。网关组件也是一种服务,也需要被注册到Nacos等注册中心中。引入网关后的架构图如下所示:

在这里插入图片描述

Gateway服务配置,这一部分配置和其它的服务没有区别,是和Nacos注册中心集成的配置

server:
  port: 10010 #网关端口
spring:
  application:
    name: gatewayservice
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        group: testgroup1
        namespace: 8ff552f0-0212-43b2-8ea0-e4c2aa359084
        cluster-name: HZ

GateWay本身的配置如下:

spring:
  cloud:
    gateway: #路由匹配是从前往后,依次匹配的
      routes: #网关路由配置
      - id: providerservice  #路由id,需要唯一
        uri: lb://providerservice  # 路由的目标地址 lb就是负载均衡,后面跟服务名称
        predicates:  #路由断言,其实就是判断请求是否符合路由规则的条件
          - Path=/user/** #路由匹配 只要是以/user开头的请求就会匹配到,P需要大写,不然会报错
      - id: consumerservice
        uri: lb://consumerservice
        predicates:
          - Path=/consumer/**

然后在浏览器输入 http://localhost:10010/consumer/1,就可以访问到consumerservice服务了,这时因为GateWay服务将我们的请求根据配置的路由规则路由到了consumerservice。

路由断言工厂

路由断言工厂的作用是读取用户定义的断言条件,对请求作出判断。
我们上面的配置中的断言规则 Path=/user/** 只是字符串, 这些字符串会被Spring中的org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory处理的,类似的PredicateFactory在GateWay中还有很多。

名称说明
After某个时间之后的请求
Before某个时间之前的请求
Between某两个时间之间的请求
Cookie请求必须包含某些cookie
Header请求必须包含某些Header
Host请求必须是访问某个host(域名)
Method请求必须是指定方式
Path请求路径必须符合指定规则
Query请求参数必须包含指定参数
RemoteAddr请求的ip必须是指定范围
Weight权重处理

上面这些路由断言工厂的具体使用,可以参考官方的路由断言工厂示例

过滤器

GateWay Filter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理。
在这里插入图片描述
Spring提供了31种不同的路由过滤器工厂,具体的使用可以参考官方的:

过滤器工厂官方示例

使用过滤器给请求添加一个请求头:

  cloud:
    gateway: #路由匹配是从前往后,依次匹配的
      routes: #网关路由配置
      - id: providerservice  #路由id,需要唯一
        uri: lb://providerservice  # 路由的目标地址 lb就是负载均衡,后面跟服务名称
        predicates:  #路由断言,其实就是判断请求是否符合路由规则的条件
          - Path=/user/** #路由匹配 只要是以/user开头的请求就会匹配到
      - id: consumerservice
        uri: lb://consumerservice
        predicates:
          - Path=/consumer/**
        filters:  #局部过滤器,只对某个服务起作用
          - AddRequestHeader=truth,This is a headr  #添加请求头

通过@RequestHeader注解来获取请求头的值
在这里插入图片描述
在控制台输出了获取到的请求头
在这里插入图片描述

如果想要过滤器对所有的路由都生效,可以把过滤器工厂写到default下

server:
  port: 10010 #网关端口
spring:
  application:
    name: gatewayservice
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        group: testgroup1
        namespace: 8ff552f0-0212-43b2-8ea0-e4c2aa359084
        cluster-name: HZ
    gateway: #路由匹配是从前往后,依次匹配的
      routes: #网关路由配置
      - id: providerservice  #路由id,需要唯一
        uri: lb://providerservice  # 路由的目标地址 lb就是负载均衡,后面跟服务名称
        predicates:  #路由断言,其实就是判断请求是否符合路由规则的条件
          - Path=/user/** #路由匹配 只要是以/user开头的请求就会匹配到
      - id: consumerservice
        uri: lb://consumerservice
        predicates:
          - Path=/consumer/**
        filters:
          - AddRequestHeader=truth,This is a headr  #添加请求头
      default-filters:
        - AddRequestHeader=truth,This is a headr1

前面提到的两种过滤器的过滤规则都是固定的,是框架给我们提供的;如果想要自定义过滤规则,则需要用到全局过滤器Global Filter。GateWay提供了GlobalFilter接口,只要我们实现这个接口就可以实现自定义的过滤器。重点是如何让过滤器链继续向下执行或者阻止过滤器链向下执行。下面是一个简单的全局过滤器示例:

/**
 * @author DELL
 * @version 1.0
 * @description
 * @date 2024/3/13 22:38:05
 */
@Order(value = 1)  #指定过滤器的执行顺序,值越小越先执行
public class MyGlobalFilter implements GlobalFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //获取请求参数
        MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();

        //获取
        String authorization = params.getFirst("authorization");

        //校验
        if ("admin".equals(authorization)) {
            //放行
            return chain.filter(exchange);
        }

        //拦截
        exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
        
        return exchange.getResponse().setComplete();
    }

}

上面提到了三种过滤器,某个服务的过滤器(filters)、默认的过滤器(default-filters)、全局过滤器(GlobalFilter),如果三种过滤器都进行了配置,那么它们的执行顺序如下:

在这里插入图片描述

  • 每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前
  • GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定
  • 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增
  • 当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行

CROS配置

Gateway中进行跨域的配置如下:

spring:
  application:
    name: gatewayservice
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        group: testgroup1
        namespace: 8ff552f0-0212-43b2-8ea0-e4c2aa359084
        cluster-name: HZ
    gateway: #路由匹配是从前往后,依次匹配的
      routes: #网关路由配置
      - id: providerservice  #路由id,需要唯一
        uri: lb://providerservice  # 路由的目标地址 lb就是负载均衡,后面跟服务名称
        predicates:  #路由断言,其实就是判断请求是否符合路由规则的条件
          - Path=/user/** #路由匹配 只要是以/user开头的请求就会匹配到
      - id: consumerservice
        uri: lb://consumerservice
        predicates:
          - Path=/consumer/**
        filters:
          - AddRequestHeader=truth,This is a headr  #添加请求头
      default-filters:
        - AddRequestHeader=truth,This is a headr1
        
      globalcors:  #跨域配置
        cors-configurations:
          '[/**]':
            allowedOrigins: "http://localhost:8090"  #允许哪些请求跨域
            allowedMethods:  #允许的跨域的请求方式
              - GET
            allowedHeaders: "*"   允许在请求中携带的头信息
            allowCredentials: true # 是否允许携带cookie
            maxAge: 36000 #跨域检测有效期

参考

  1. Gateway官方文档

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

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

相关文章

基于python+vue超市管理系统flask-django-php-nodejs

课题主要分为二大模块&#xff1a;即管理员模块和员工模块&#xff0c;主要功能包括&#xff1a;个人信息修改、员工信息、商品信息、商品进货、商品出库、商品销量等&#xff1b; 目录 摘 要 I Abstrac II 目录 III 1绪论 1 1.1 研究背景 3 1.1.1国内研究现状 3 1.1.2国外研究…

是德科技keysight DSOX3024T示波器

181/2461/8938产品概述&#xff1a; DSOX3024T 示波器 要特性与技术指标 使用电容触摸屏进行简洁的触控操作&#xff1a; •提高调试效率 •触控设计可以简化文档记录 •使用起来就像您喜欢的智能手机或平板电脑一样简单 使用 MegaZoom IV 技术揭示偶发异常&#xff1a; •超快…

图像处理ASIC设计方法 笔记12 图像旋转ASIC中心控制器状态机

P109 1 流水线图像旋转ASIC整体架构 中心控制器负责各个模块的状态控制和数据调度,接收到外部启动信号后,进人芯片初始化阶段,片上FIFO接收外部输入的图像旋转参数、接收完毕后,再利用接收到的旋转角度到查找表中找到对应的正弦和正切值。 中心控制器将接收到的行列信息…

鸿蒙Harmony应用开发—ArkTS-LazyForEach:数据懒加载

LazyForEach从提供的数据源中按需迭代数据&#xff0c;并在每次迭代过程中创建相应的组件。当在滚动容器中使用了LazyForEach&#xff0c;框架会根据滚动容器可视区域按需创建组件&#xff0c;当组件滑出可视区域外时&#xff0c;框架会进行组件销毁回收以降低内存占用。 接口…

Pink老师Echarts教学笔记

可视化面板介绍 ​ 应对现在数据可视化的趋势&#xff0c;越来越多企业需要在很多场景(营销数据&#xff0c;生产数据&#xff0c;用户数据)下使用&#xff0c;可视化图表来展示体现数据&#xff0c;让数据更加直观&#xff0c;数据特点更加突出。 01-使用技术 完成该项目需…

是德科技keysight 53230A频率计数器

181/2461/8938产品概述&#xff1a; Keysight(原Agilent) 53230A 通用频率计数器/计时器可满足您所有的频率和时间间隔测量需求。除了典型的频率和时间间隔测量&#xff0c;它还可执行连续/无间隙测量&#xff0c;以进行基本调制域分析。 53230A 配有可选的猝发测量软件。它可…

腾讯云GPU服务器介绍_GPU实例规格价格_AI_深度学习

腾讯云GPU服务器是提供GPU算力的弹性计算服务&#xff0c;腾讯云GPU服务器具有超强的并行计算能力&#xff0c;可用于深度学习训练、科学计算、图形图像处理、视频编解码等场景&#xff0c;腾讯云百科txybk.com整理腾讯云GPU服务器租用价格表、GPU实例优势、GPU解决方案、GPU软…

Linux进程地址空间详解

文章目录 前言一、程序地址空间二、感受虚拟地址的存在三、进程地址空间四、程序从磁盘加载到内存的过程4.1 物理地址和虚拟地址的区别 五、写时拷贝5.1 解释fork()函数有两个返回值 前言 我们在学习C/C的时候用到的地址是什么地址呢&#xff1f;虚拟地址&#xff1f;物理地址&…

全球首位AI程序员诞生,对程序员的影响分析

全球首位AI程序员诞生&#xff0c;对程序员的影响分析 《全球首位AI程序员诞生&#xff0c;对程序员的影响分析》方向一&#xff1a;AI程序员的优势分析方向二&#xff1a;AI程序员的局限性方向三&#xff1a;对程序员职业的影响方向四&#xff1a;未来展望 博主 默语带您 Go t…

Swagger常用注解

Tag 标注位置controller类 表示Controller类作用 Schema modeal层javaBean 描述模型及属性 Operation 描述方法作用

Docker入门到实践之环境配置

Docker入门到实践之环境配置 docker 环境安装 Ubuntu/Debian: sudo apt update sudo apt install docker.ioCentOS/RHEL: sudo yum install dockerArch Linux: sudo pacman -S docker如果未安装成功&#xff0c;或者env的path未设置成功&#xff0c;运行时会报错 Bash: Do…

Linux详细介绍

Linux操作系统介绍 Linux 是一种开源的类 Unix 操作系统&#xff0c;最初由 Linus Torvalds 在 1991 年创建。与其他操作系统不同&#xff0c;Linux 是一个基于内核的操作系统&#xff0c;其核心是 Linux 内核。Linux 内核是由程序员社区不断开发和改进的&#xff0c;它提供了…

Docker - 哲学 默认网络和 自定义网络 与 linux 网络类型 和 overlay2

默认网络&#xff1a;不指定 --nerwork 不指定 网络 run 一个容器时&#xff0c;会直接使用默认的网络桥接器 &#xff08;docker0&#xff09; 自定义网络&#xff1a;指定 --nerwork 让这两台容器互相通信 的前提 - 共享同一个网络 关于 ip addr 显示 ens160 储存驱动 ov…

基于Springboot的药品管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的药品管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

深度学习 线性神经网络(线性回归 从零开始实现)

介绍&#xff1a; 在线性神经网络中&#xff0c;线性回归是一种常见的任务&#xff0c;用于预测一个连续的数值输出。其目标是根据输入特征来拟合一个线性函数&#xff0c;使得预测值与真实值之间的误差最小化。 线性回归的数学表达式为&#xff1a; y w1x1 w2x2 ... wnxn …

stm32使用定时器实现PWM与呼吸灯

PWM介绍 STM32F103C8T6 PWM 资源&#xff1a; 高级定时器&#xff08; TIM1 &#xff09;&#xff1a; 7 路 通用定时器&#xff08; TIM2~TIM4 &#xff09;&#xff1a;各 4 路 例如定时器2 PWM 输出模式&#xff1a; PWM 模式 1 &#xff1a;在 向上计数 时&#xff0…

网络安全顶会——NDSS '24 论文清单、摘要(上)

1、50 Shades of Support: A Device-Centric Analysis of Android Security Updates Android是迄今为止最受欢迎的操作系统&#xff0c;拥有超过30亿活跃移动设备。与任何软件一样&#xff0c;在Android设备上发现漏洞并及时应用补丁都至关重要。Android开源项目已经开始努力通…

<REAL-TIME TRAFFIC OBJECT DETCTION FOR AUTONOMOUS DRIVING>论文阅读

Abstract 随着计算机视觉的最新进展&#xff0c;自动驾驶迟早成为现代社会的一部分&#xff0c;然而&#xff0c;仍有大量的问题需要解决。尽管现代计算机视觉技术展现了优越的性能&#xff0c;他们倾向于将精度优先于效率&#xff0c;这是实时应用的一个重要方面。大型目标检测…

modelsim与quartus联合仿真ROM读不出数据

modelsim与quartus联合仿真ROM没有数据被读出&#xff0c;很是纳闷。 原因&#xff1a;hex或者mif文件放的不对&#xff0c;放在与db放在同一个文件夹下。modelsim在这个目录查找mif文件或hex。 这是我遇到的问题。当然可能还有其他的问题&#xff1a; 1、mif文件的格式不对&a…

会员中心微服务

文章目录 1.环境配置1.创建会员中心模块2.检查父子模块的pom.xml1.父模块注意&#xff1a;如果父模块中的依赖显示not found&#xff0c;原因是子模块并没有引用&#xff0c;不用在意 2.子模块 3.pom.xml 引入相关依赖&#xff08;别忘记刷新maven&#xff09;4.application.ym…