SpringCloud - Gateway网关路由

news2025/8/3 2:21:31

目录

网关初步介绍

搭建网关服务

路由断言工厂Route Predicate Factory

路由过滤器 GatewayFilter

全局过滤器 GlobalFilter

过滤器执行顺序

网关的cors跨域配置


  • 网关初步介绍

  • 不是所有的请求,都能访问服务,所以需要网关对来访问的请求进行提前判断
  • 网关的功能:
    • 身份认证和权限校验
      • 网关作为微服务入口,需要校验用户是否有请求资格,如果没有则进行拦截
    • 服务路由、负载均衡
      • 一切请求都必须先经过网关,但网关不处理业务,而是根据某种规则,把请求转发到某个微服务,这个过程叫做路由
      • 当路由的目标服务有多个时,还需要做负载均衡
    • 请求限流
      • 当请求流量过高时,在网关中按照下流的微服务能够接受的速度来放行请求,避免服务压力过大
  • 在SpringCloud中网关的实现包括两种:
  • zuul
    • Zuul是基于Servlet的实现,属于阻塞式编程
  • gateway
    • 而SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能
  • 搭建网关服务

  • 1.创建新的module引入SpringCloudGateway的依赖和nacos的服务发现依赖

  • 2.编写路由配置及nacos地址

  • 路由配置包括:
    • 1.路由id:路由的唯一标示
    • 2.路由目标(uri):路由的目标地址,http代表固定地址,lb代表根据服务名负载均衡
    • 3.路由断言(predicates):判断路由的规则
    • 4.路由过滤器(filters):对请求或响应做处理
  • 网关访问流程:

  • 3.启动网关服务进行测试

  • 路由断言工厂Route Predicate Factory

  • 网关路由可以配置的内容包括:
    • 路由id:路由唯一标示
    • uri:路由目的地,支持lb和http两种
    • predicates:路由断言,判断请求是否符合要求,符合则转发到路由目的地
    • filters:路由过滤器,处理请求或响应
  • 在配置文件中写的断言规则只是字符串,这些字符串会被断言工厂(Predicate Factory)读取并处理,转变为路由判断的条件
  • 例如Path=/user/**是按照路径匹配,这个规则是由org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来处理
  • 像这样的断言工厂在SpringCloudGateway还有十几个
  • Spring提供了11种基本的Predicate工厂:

  • 路由过滤器 GatewayFilter

  • GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理:

  • Spring提供了31种不同的路由过滤器工厂;例如:

  • 案例:给所有进入userservice的请求添加一个请求头
  • 请求头为:Truth,Apache
  • 实现方式:
    • 在gateway中修改application.yml文件,给userservice的路由添加过滤器:
    • 局部:

    • 全局:

    • 访问代码:

  • 测试成功

  • 全局过滤器 GlobalFilter

  • 全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样
  • 区别在于GatewayFilter通过配置定义,处理逻辑是固定的
  • 而GlobalFilter的逻辑需要自己写代码实现;定义方式是实现GlobalFilter接口

  • 案例:定义全局过滤器,拦截并判断用户身份
  • 需求:定义全局过滤器,拦截请求,判断请求的参数是否满足下面条件:
    • 参数中是否有authorization,
    • authorization参数值是否为admin
  • 如果同时满足则放行,否则拦截
  • 自定义类,实现GlobalFilter接口,添加@Order注解:

  • 测试成功

  • 过滤器执行顺序

  • 请求进入网关会碰到三类过滤器:
    • 当前路由的过滤器
    • DefaultFilter
    • GlobalFilter
  • 请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器:

  • 路由过滤器和DefaultFilter底层都由AddRequestHeaderGatewayFilterFactory实现,返回GatewayFilter
  • GlobalFilter由GatewayFilterAdapter转为GatewayFilter
  • 排序的规则
    • 每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前
    • GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,自己指定
    • 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增
    • 当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行
  • 网关的cors跨域配置

  • 跨域:域名不一致就是跨域,主要包括:
    • 域名不同: www.taobao.com 和 www.taobao.org 和 www.jd.com 和 miaosha.jd.com
    • 域名相同,端口不同:localhost:8080和localhost8081
  • 跨域问题:浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题
  • 解决方案:CORS
  • 网关处理跨域采用的同样是CORS方案,并且只需要简单配置即可实现:

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

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

相关文章

归并排序及其应用

归并排序算法基于分而治之的概念,具体来说就是遍历一棵树,归并的过程是一个后序执行的动作。 由于我们知道每个子部分在合并后都是有序的,我们可以利用这个特性来解决一些问题。 上图可视化了merge sort algorithm的过程,我们很容…

2023年:我成了半个外包

边线业务与主线角色被困外包; 012022年,最后一个工作日,裁员的小刀再次挥下; 商务区楼下又多了几个落寞的身影,办公室内又多了几头暴躁的灵魂; 随着裁员的结束,部门的人员结构简化到了极致&am…

Fiddler在ios内的app中抓取https的解决方法

1、安装&设置Fiddler 查看链接---->Fiddler对PC浏览器&安卓App抓包的使用和配置 2、配置完后重启fiddler 3、ios安装证书 3.1、在fiddler右上角这里悬浮鼠标,查看自己电脑IP 或者通过: window键R,输入cmd,在命令行…

java Spring JdbcTemplate 准备工作

查看本文之前 您需要先看我 java Spring的IOC和AOP操作作为基础 如果并不掌握 可以找一下我之前的文章 都有讲到过 接下来的 我们将通过 JdbcTemplate 来做一些数据库操作 那我们就需要对 JdbcTemplate 有个基本的概念 首先 JdbcTemplate 是 Spring对 JDBC的一个很好的封装 通…

哪款蓝牙耳机延迟最低?打游戏零延迟的蓝牙耳机

我知道很多朋友会很在意声音延迟问题,虽然现如今蓝牙5.2甚至5.3已经可以几乎做到零延迟,但毕竟无线传输到现在依然存在或多或少延迟的情况出现,尤其是在这种蓝牙设备密集的地方,信号的干扰是不可避免的,由于技术的迭代…

【数据结构】空间复杂度

🚀write in front🚀 📜所属专栏:初阶数据结构 🛰️博客主页:睿睿的博客主页 🛰️代码仓库:🎉VS2022_C语言仓库 🎡您的点赞、关注、收藏、评论,是对…

免去打包烦恼,自动构建你的GitHub Pages|玩转GitHub Pages三部曲(二)

本文讲述了如何利用 GitHub Actions 来自动构建 GitHub Pages 项目,免去繁琐的手动构建再提交过程,让你专注于写作。大家的点赞和互动是我更文的动力 /(ㄒoㄒ)/ 所以我决定发起一项活动,到三月三十一日统计,留言次数和赞赏次数最多…

CSDN新星计划/原力计划来喽,对此你有何期待

文章目录🌟 写在前面🌟 新星计划🌟 独自开🌟 原力计划🌟 横穿全年的计划🌟 写在最后🌟 写在前面 哈喽,大家好,我是几何心凉,这是一份全新的专栏,…

辛普森悖论

感谢原作者!原文传送门 以下是摘录: 1、什么是辛普森悖论? 辛普森悖论是 1951 年由 E.H. 辛普森提出的,简单来讲就是在分组比较中都占优势的一方,有的时候在总评中反而是失势的一方。指局部的结论和整体的结论完全相…

HashMap~

HashMap: HashMap是面试中经常被问到的一个内容,以下两个经常被问到的问题, Question1:底层数据结构,1.7和1.8有何不同? 答:1.7数组+链表,1.8数组+(链表|红…

k8s使用外部ca证书

PKI证书和要求Kubernetes 需要 PKI 证书才能进行基于 TLS 的身份验证。如果你是使用 kubeadm 安装的 Kubernetes, 则会自动生成集群所需的证书。你还可以生成自己的证书。 例如,不将私钥存储在 API 服务器上,可以让私钥更加安全。此页面说明了…

C++ 模板

1. 泛型编程实现一个通用的交换函数,使用函数重载虽然可以实现,但是有以 下几个不好的地方:1. 重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数2. 代码的可维…

深度剖析数据在内存中的存储(下)(适合初学者)

上篇讲解了整形在内存中的存储方式,这篇文章就来继续讲解浮点数在内存中的存储方式。 上篇地址: (5条消息) 深度剖析数据在内存中的存储(上)_陈大大陈的博客-CSDN博客 目录: 3.浮点型在内存中的存储 3.1.浮点数的…

【Windows Server 2019】发布服务器 | 远程桌面服务的安装与配置 Ⅱ——配置RemoteAPP和访问

目录4. 配置RemoteAPP4.2 设置要发布的APP4.1 如何找到访问链接5. 访问发布的RemoteAPP关联博文4. 配置RemoteAPP 4.2 设置要发布的APP (1)返回【Server Manager】,在左侧的菜单栏中找到【Remote Desktop Services】。 (2&#…

jupyter notebook小技巧

1、.ipynb 文件转word文档 将 jupyter notebook(.ipynb 文件)转换为 word 文件(.docx)的最简单方法是使用 pandoc。 首先安装pip install pandoc, 安装后,在将 Jupyter notebook文件目录cmd 然后输入打开…

ChatGPT 的盈利潜力:我使用语言模型赚取第一笔钱的个人旅程

使用 Fiverr、Python ChatGPT 和数据科学赚钱的指南。众所周知,ChatGPT 是 12 月发生的互联网突破性事件,几乎每个人都跳过了使用 AI 赚钱的潮流。在本文中,我将分享我是如何使用 ChatGPT 赚到第一笔钱的。本文包括以下主题:回到基…

深入理解Golang 中的Context包

context.Context是Go语言中独特的设计,在其他编程语言中我们很少见到类似的概念。context.Context深度支持Golang的高并发。 1.Goroutine 和channel。 在理解context包之前,应该首先熟悉Goroutine和Channel,能加深对context的理解。 1.1 Goro…

苹果设计可变色Apple Watch表带,智能穿戴玩法多

苹果最新技术专利显示,苹果正在为 Apple Watch 设计一款可变色的表带,可以根据佩戴者所穿着的服装、所在的环境等自动改变颜色。据介绍,这款表带里的灯丝具有电致变色功能,可以通过施加不同的电压,来实现显示多种颜色或…

C++之类与对象(上)

目录 一、类的定义 二.类的访问限定及封装 1.访问限定 2.封装 三.类的作用域和实例化 2.类的实例化 四.类的对象大小的计算 1.类成员存储方式 2.结构体内存对齐规则 五.类成员函数的this指针 1.this指针的引出 2.this指针的特性 3.C语言和C实现Stack的对比 一、类的定义 class …

Linux的kdump分析

文章目录一 系统环境二 下载和安装kerner-debuginfo三 启动crash四 crash常用命令一 系统环境 进行kdump分析的主机是CentOS-7.9系统。 [rootcanway ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [rootcanway ~]# uname -r 3.10.0-1160.el7.x86_64检查…