【Cloudgetway网关】 GetWay网关入门使用

news2024/11/26 19:51:29

一、概述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ow0KO8iV-1686286922163)(null)]

GateWay是zuul的替代品,由于Zuul2.0迟迟没有出来,SpringCloud社区推出了gateWay网关来替代zuul1.x版本。提供了以下功能: 底层使用netty通讯

  • 反向代理

  • 鉴权

  • 安全

  • 监控、指标

  • 限流

    GateWay具有以下特征: 基于Spring,PR,SpringBoot构建

  • 动态路由

  • 集成hystrix断路器功能

  • 路径重写

  • 请求限流等功能

  • 断言和过滤器

1. 非阻塞异步模型

​ Getway是基于异步非阻塞模型上进行开发,性能更优秀。

  • 阻塞处理模型就是: 当请求进入ServletContainer,它就会为之绑定一个线程,这种模型只适合用于并发不高的情况。Zuul1.x就是基于这么一个阻塞式处理模型。

    Servlet3.1之后有异步非阻塞的支持,webFlux就是基于这么个框架,他的核心就是基于Reactor相关的实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wm6RKKXq-1686286919028)(C:\Users\JaneOnly\AppData\Roaming\Typora\typora-user-images\image-20221128170458657.png)]

2. 三大概念

路由Route

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

浅浅可以与Vue的路由概念相理解

断言Predicate

断言就是Java8中Java.utils.function.Predicate,匹配Http请求中的内容,如果请求与断言相互匹配,则进行路由转发到微服务。

过滤Filter

GatewayFilter的实例,使用过滤器,在请求被路由转发之前或者之后对请求进行修改

like ServletFilter: beforeFilter doAction afterFilter

  1. 客户端向GateWay请求,先通过网关中断言
  2. 在进行n层过滤器
  3. 最后根据目标uri访问对应的微服务

image-20230527151751512

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hx3i9eBP-1686286922136)(null)]

总结gateway的作用就是路由转发+执行过滤链

二、入门配置

1. 基础配置

1.1 Yaml方式

使用gatway网关,来访问8001的微服务

  1. 建立Pom
<!--gateway-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--eureka-client-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
  1. 修改YAML

由于网关也是一种微服务,因此也需要注册进入服务注册中心;

server:
  port: 9527

spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      routes:
        - id: payment_routh #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8001          #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/circuitBreak/**         # 断言,路径相匹配的进行路由

        - id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8001          #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/ok/**         # 断言,路径相匹配的进行路由

eureka:
  instance:
    hostname: cloud-gateway-service
  client: #服务提供者provider注册进eureka服务列表内
    service-url:
      register-with-eureka: true
      fetch-registry: true
      defaultZone: http://eureka7001.com:7001/eureka
  1. 启动网关和8001微服务,使用9527端口进行访问;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o8wVKlev-1686286922174)(null)]


1.2 硬编码方式配置路由

image-20230529101903517

2. 通过微服务实现动态路由

通过上面的案例中,出现了两个问题

  • 路由地址是硬编码方式
  • 微服务中可能有多台机器,没有实现负载均衡

我们可以通过修改Yaml,实现动态路由来解决以上两个问题。

  1. 开启动态路由
  2. 将 uri 改成 lb: //{微服务名称}
  cloud:
    gateway:
      routes:
        - id: payment_routh #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
         # uri: http://localhost:8001          #匹配后提供服务的路由地址
          uri: lb://CLOUD-HYSTRIX-PAYMENT/
          predicates:
            - Path=/payment/circuitBreak/**         # 断言,路径相匹配的进行路由

        - id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
          #uri: http://localhost:8001          #匹配后提供服务的路由地址
          uri: lb://CLOUD-HYSTRIX-PAYMENT/
          predicates:
            - Path=/payment/ok/**         # 断言,路径相匹配的进行路由
      discovery:
        locator:
          enabled: true #开启识别动态路由

3. Predicate使用

​ 在官方自带的断言有11种

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VlMwvJvV-1686286922187)(null)]

以上各种RoutePredicateFactory都代表了HTTP请求中不同属性值,之间都可以进行组合,并且通过逻辑AND进行断言匹配。

3.1 After

匹配时间: ZonedDateTime

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6EuUVhQu-1686286919029)(C:\Users\JaneOnly\AppData\Roaming\Typora\typora-user-images\image-20221128211153223.png)]

3.2 cookie

  • 匹配是否有Cookie,若有,匹配成功,否则拒绝访问。
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jOOQ3DKM-1686286919029)(C:\Users\JaneOnly\AppData\Roaming\Typora\typora-user-images\image-20221128213100527.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eNvO7sFW-1686286919030)(C:\Users\JaneOnly\AppData\Roaming\Typora\typora-user-images\image-20221128213157753.png)]

3.2 Header

  • 匹配中检测是否有请求头,若有匹配成功,否则拒绝访问。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JON9M7x9-1686286919030)(C:\Users\JaneOnly\AppData\Roaming\Typora\typora-user-images\image-20221128213331414.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NpDwlLJb-1686286919030)(C:\Users\JaneOnly\AppData\Roaming\Typora\typora-user-images\image-20221128213426307.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-69ll88c0-1686286919030)(C:\Users\JaneOnly\AppData\Roaming\Typora\typora-user-images\image-20221128213459763.png)]

3.3 Method

  • 匹配请求方式GETPost等等。

predicate就是为了实现一组匹配规则,让请求过来找到对应的route进行处理。

4. Filter

使用过滤器,可以在路由转发请求前,或者请求后,对请求进行一定的修改,也就是可以修改进入的HTTP请求和返回的HTTP相应,路由过滤器只能指定路由进行使用。

  • 生命周期-pre|post
  • 种类-GetwayFilter|GlobalFilter

根据官网文档,添加配置:

简单实例:

yaml

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FgQUxGVh-1686286922201)(null)]

自定义过滤器**

可以进行全局日志记录,同一网关鉴权等…

  1. 实现两个接口 GlobalFilter,Ordered
@Component
public class MyLoagGatewayFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String uname = exchange.getRequest().getQueryParams().getFirst("uname");
        if(uname == null){
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }

    /**
     * 优先级
     * @return
     */
    @Override
    public int getOrder() {
        return 0;
    }
}

测试:

不带uname访问:

image-20230529103844592

带着uname访问成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wiEmVJhl-1686286922148)(null)]

  1. 重写两个方法

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

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

相关文章

使用 LabVIEW调用LeNet快速搭建手写数字识别系统(内含源码)

‍‍&#x1f3e1;博客主页&#xff1a; virobotics的CSDN博客&#xff1a;LabVIEW深度学习、人工智能博主 &#x1f384;所属专栏&#xff1a;『LabVIEW深度学习实战』 &#x1f37b;上期文章&#xff1a; 【图像分类】基于OpenVINO实现PyTorch ResNet50图像分类 &#x1f4f0…

PyCaret解决二分类任务教程示例

PyCaret是一个Python中的开源、低代码机器学习库&#xff0c;可以自动化机器学习工作流。它是一个端到端的机器学习和模型管理工具&#xff0c;可以成倍地加快实验周期&#xff0c;提高工作效率。 与其他开源机器学习库相比&#xff0c;PyCaret是一个替代的低代码库&#xff0c…

多分类问题与卷积模型的优化

文章目录 1. 创建自定义Dataset类2. 基础卷积模型3. Dropout抑制过拟合4. 批标准化5. 学习速率衰减6. 最终优化整合代码 首先导入用到的库: import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim import numpy as np import matp…

文章写作的诀窍:10个技巧让你的文章升华

首先要找到自己的写作声音和确定文章的中心思想&#xff0c;其次要使用简单明了和描述性的语言&#xff0c;增加细节并结构化文章&#xff1a; 找到你的写作声音&#xff1a;找到适合自己的写作风格和声音&#xff0c;这有助于让读者更容易地理解和记住你的文章。确定文章的中心…

QxRibbon 知:搭建 CMake 构建环境

文章目录 前言安装 cmake问题处理qtcreator 检测 CMake 异常 参考资料 前言 高版本的 QtCreator 已经集成了 cmake 工具&#xff0c;并支持以 CMakelists.txt 文件作为工程开发项目。 https://www.qt.io/blog/2019/07/30/update-on-cmake-project-support-in-qt-creator 安装…

NodeLocal DNS介绍及部署应用

目录 一、NodeLocal DNS是什么&#xff1f; 二、为什么使用NodeLocal DNS&#xff1f; 三、工作原理 四、安装NodeLocal DNS 五、在应用中使用NodeLocal DNSCache 六、验证 一、NodeLocal DNS是什么&#xff1f; NodeLocal DNSCache 通过在集群节点上运行一个 DaemonSet …

qrcodejs2生成二维码,通过canvas绘制带边框+中间logo的二维码图片,下载二维码

文章目录 一、通过qrcodejs2生成一个二维码二、点击【下载配置服务器二维码】来下载二维码1、通过canvas去绘制 边框二维码logo&#xff08;1&#xff09;为canvas增加绘制圆角矩形的方法&#xff08;canvas本身不提供&#xff09;&#xff08;2&#xff09;通过canvas绘制 圆角…

饮酒过多和腌制食品是导致中风的最大导火索

中风是一种常见的疾病&#xff0c;它的发生和饮食习惯有很大关系。近年来&#xff0c;我国中风病患人数和病发率都呈现出了不同程度的上升趋势&#xff0c;这给我们的健康带来了很大的威胁。下面我们可以通过数据可视化大屏来了解一下饮食健康与预防中风有哪些影响&#xff0c;…

ESP32-S3 边缘人工智能|使用加速度计数据和 ESP-DL 识别人体活动

边缘计算是一种分布式计算范例&#xff0c;指在更靠近设备的地方进行数据存储和计算。边缘人工智能&#xff08;边缘 AI&#xff09;是边缘计算中一项振奋人心的成果&#xff0c;可以令传统技术更高效地运行&#xff0c;在降低功耗的同时又有更好的性能。训练好的神经网络可以在…

通信算法之167: (低空无人机)机载视频通信传输系统基带算法设计

一.物理层基带仿真 通信系统的链路级仿真主要可以分成5个部分。 1.系统参数 2.发送机算法 3.信道模型 4.接收机算法 5.统计性能 其中主要组成部分很明显是中间三部分&#xff0c;即发送&#xff0c;信道&#xff0c;接收。但系统参数和统计性能这两部分的适当设计会大大…

linux基础命令系列之10 分钟掌握 ln 命令:创建链接,软链接,硬链接,递归链接,打印详细输出

文章目录 前言一. ln命令介绍二. 语法格式及常用选项三. 参考案例3.1 ln命令创建硬链接3.1.1 创建硬链接3.1.2 源文件被删除&#xff0c;不影响链接文件的正常使用3.1.3 硬链接不能跨分区创建 3.2 为什么目录刚刚创建的时候&#xff0c;链接数为23.3 ln -s 软链接的创建3.3.1 l…

【漏洞修复】node-exporter被检测出来pprof调试信息泄露漏洞

node-exporter被检测出来pprof调试信息泄露漏洞 说在前面解决方法结语 说在前面 惯例开篇吐槽&#xff0c;有些二五仔习惯搞点自研的安全扫描工具&#xff0c;然后加点DIY元素&#xff0c;他也不管扫的准不准&#xff0c;就要给你报个高中危的漏洞&#xff0c;然后就要去修复&…

C++元模板技术与traits解析:根据类型的特性来调整代码的行为,解决没有重载运算符的情况

C元模板技术与traits解析 第一章、C元模板技术简介 (C Meta-template Introduction)1.1 元模板的定义与概念 (Definition and Concepts)1.2 元模板技术的发展历程 (Evolution of Meta-templates)1.3 元模板应用场景举例 (Examples of Meta-template Applications) 第二章、 tra…

[数据结构初阶]顺序表

目录 静态顺序表 动态顺序表 初始化 销毁 尾插 ​编辑 尾删 头插 头删 Insert erase find查找 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储。在数组上完成数据的增删查改。 静态顺序表 定义结构体&#xff1…

Talk | 北卡罗来纳州立大学唐圣坤浙江大学张磊: 数据为中心的高效视觉语言学习—动态退出与数据蒸馏

本期为TechBeat人工智能社区第504期线上Talk&#xff01; 北京时间6月8日(周四)20:00&#xff0c;北卡罗来纳州立大学在读博士生—唐圣坤与浙江大学硕士生—张磊的Talk将准时在TechBeat人工智能社区开播&#xff01; 他们与大家分享的主题是: “数据为中心的高效视觉语言学习…

基于jsp+mysql+mybatis的SpringBoot美容院后台管理系统

运行环境: 最好是java jdk 1.8&#xff0c;我在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以&#xff0c;如果编译器的版本太低&#xff0c;需要升级下编译器&#xff0c;不要弄太低的版本 tomcat服务器环…

【嵌入式环境下linux内核及驱动学习笔记-(15)linux总线、设备、驱动模型之I2C总线】

目录 1、 I2C总线机制1.1 导入1.2 时序1.3 地址格式 2、华清fs4412上I2C的实现2.1 寄存器2.2 寄存器位具体含义2.3 fs4412上针对具本设备的I2C工作逻辑2.3.1 主机读写工作流程**2.3.1.1 主机发送时序及操作流程2.3.1.2 主机接收的时序及流程 2.3.2 从机读写工作流程 3、LINUX内…

Redis-认识NoSQl和Redis常见的通用命令

1. 认识NoSQL 非关系型数据库 NoSQL是指一类非关系型数据库&#xff0c;它们采用的数据模型不同于传统的关系模型&#xff0c;它通常使用键值对、文档、图形等非传统的数据结构进行数据存储&#xff0c;不遵循预定义的模式和模型。NoSQL数据库通常分布式、高可扩展性&#xff0…

【项目一】GCC(gcc,g++)、静态库、动态库、MakeFile、GDB调试

GCC、静态库 1.2 GCC(1&#xff09;gcc&#xff08;1&#xff09;常用命令&#xff08;2&#xff09; C程序编译过程&#xff08;3&#xff09;GCC工作流程 1.3 GCC(2&#xff09;g1.3静态库的制作1.5静态库的使用1.6动态库的制作1.7动态库加载失败的原因1.8解决动态库加载失败…

秋招必看,Java后端高频面试题1000题、拒绝简单背诵,深入浅出近30个技术栈

Java 面试随着时间的改变而改变。在过去的日子里&#xff0c;当你知道 String 和 StringBuilder 的区别就能让你直接进入第二轮面试&#xff0c;但是现在问题变得越来越高级&#xff0c;面试官问的问题也更深入。 在我初入职场的时候&#xff0c;类似于 Vector 与 Array 的区别…