API网关:SpringCloud GateWay

news2024/11/14 19:50:11

一. 网关的作用及背景

1.API网关的作用
  • 请求路由

在我们的系统中由于同一个接口新老两套系统都在使用,我们需要根据请求上下文将请求路由到对应的接口。

  • 统一鉴权

对于鉴权操作不涉及到业务逻辑,那么可以在网关层进行处理,不用下层到业务逻辑。

  • 统一监控

由于网关是外部服务的入口,所以我们可以在这里监控我们想要的数据,比如入参出参,链路时间。

  • 流量控制,熔断降级

对于流量控制,熔断降级非业务逻辑可以统一放到网关层。

2.GateWay产生的背景
Cloud全家桶中有个很重要的组件就是网关,在1.x版本中都是采用的Zuul网关; 但在2.x版本中,zuul的升级一直跳票,SpringCloud最后自己研发了一个网关替代Zuul, 那就是SpringCloud Gateway一句话:gateway是原zuul1.x版的替代 。

SpringCloud Gateway 是 Spring Cloud 的一个全新项目,基于 Spring 5.0+Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。 为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。  zuul是基于Servlet的实现,属于阻塞式编程。而SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能 

二.GateWay配置介绍

在这里插入图片描述

1.GateWay三大概念
  • Route(路由):路由是构建网关的基本模块,它由 ID、目标 URI、一系列的断言和过滤器组成,如果断言为 true 则匹配该路由
  • Predicate(断言):参考的是 Java8 中的 java.util.function.Predicate。开发人员可以匹配 HTTP 请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由
  • Filter(过滤):指的是 Spring 框架中 GatewayFilter 的实例,使用过滤器,可以在请求被路由之前或之后对请求进行修改。
spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
      routes:
        - id: service-provider # 路由标示,必须唯一
          uri: lb://SERVICE-PROVIDER # 路由的目标地址;动态路由使用,lb://微服务名
          predicates:  # 路由断言,判断请求是否符合规则
            - Path=/provider/**  # 路径断言,判断路径是否是以/provider开头,如果是则符合
        - id: service-consumer
          uri: lb://SERVICE-CONSUMER
          predicates:
            - Path=/consumer/**
1.1 Route(路由)

gateway 中可以配置多个 Route。一个 Route 由路由 id,转发的 uri,多个 Predicates 以及多个 Filters 构成。处理请求时会按优先级排序,找到第一个满足所有 Predicates 的 Route

1.2 Predicate(断言)

Gateway中predicates配置除了Path断言工厂,还有十几个:

名称说明示例
After是某个时间点后的请求– After=2037-01-20T17:42:47.789-07:00[America/Denver]
Before是某个时间点之前的请求– Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]
Between是某两个时间点之前的请求– Between=2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver]
Cookie请求必须包含某些cookie– Cookie=chocolate, ch.p
Header请求必须包含某些header– Header=X-Request-Id, \d+
Host请求必须是访问某个host(域名)– Host=.somehost.org,.anotherhost.org
Method请求方式必须是指定方式– Method=GET,POST
Path请求路径必须符合指定规则– Path=/red/{segment},/blue/**
Query请求参数必须包含指定参数– Query=name, Jack或者- Query=name
RemoteAddr请求者的ip必须是指定范围– RemoteAddr=192.168.1.1/24
Weight权重处理
1.3 Filter(过滤)

gateway提供了31种不同的内置路由过滤器工厂。常用的如:

名称说明
AddRequestHeader给当前请求添加一个请求头
RemoveRequestHeader移除请求中的一个请求头
AddResponseHeader给响应结果中添加一个响应头
RemoveResponseHeader从响应结果中移除有一个响应头
RequestRateLimiter限制请求的流量

1.2.1 添加过滤器

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
      routes:
        - id: service-provider # 路由标示,必须唯一
          uri: lb://SERVICE-PROVIDER # 路由的目标地址;动态路由使用,lb://微服务名
          predicates:  # 路由断言,判断请求是否符合规则
            - Path=/provider/**  # 路径断言,判断路径是否是以/provider开头,如果是则符合
        - id: service-consumer
          uri: lb://SERVICE-CONSUMER
          predicates:
            - Path=/consumer/**
          filters: # 针对某个服务添加过滤器
            - AddRequestHeader=name,zhangsan 
      default-filters: # 全局过滤器给请求添加请求头信息
        - AddRequestHeader=name,zhangsan 
        - AddRequestHeader=age,10

1.2.2 自定义全局过滤器(鉴权)

1.2.3 gateway中过滤器的执行顺序

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

三.GateWay工作原理

1.GateWay架构原理

1.拉取注册中心的服务列表

2.获取请求地址,根据routes路由规则判断匹配所拉取的服务列表

3.路由规则匹配上了某个服务列表中的服务,负载均衡转发个对应的服务

在这里插入图片描述

2.GateWay的内部流程

在这里插入图片描述

1)服务启动时:

1.服务启动时,加载配置文件中的路由配置

2.将路由配置转化为RouteDefinition (封装gateway路由属性信息的bean,即Route的bean定义)

3.RouteLocator读取RouteDefinition并将RouteDefinition 转换成Route对象( Route对象中定义并实例化了路由断言、过滤器、路由地址及路由优先级等信息 ),并提供了获取Route对象的方法

2)客户端请求到达时:

1.Netty Server监听到客户端请求,通过所有路由的路由断言,看是否匹配上路由

2.匹配上路由,封装具体路由的Handler(将路由的一些信息封装到ServerWebExchange对象中),并将对应的过滤器链加入到Handler中

3.拿到具体路由的执行Handler后,执行过滤器链,并通过路由信息转发请求到对应的服务

RoutePredicateHandlerMapping的执行顺序

通过路由定位器获取全部路由(RouteLocator)
通过路由的谓语(Predicate)过滤掉不可用的路由信息
查找到路由信息后将路由信息设置当上下文环境中(GATEWAY_ROUTE_ATTR)
返回gatway自定的webhandler(FilteringWebHandler)

在这里插入图片描述

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

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

相关文章

嵌入式开发--STM32的GPIO输入和输出复用

嵌入式开发–STM32的GPIO输入和输出复用 MCU的引脚数量非常有限,做项目时,经常是为了成本而选择引脚尽量少的芯片,这也给布线和编程带来更大的挑战。 最近一个项目,需要在某些时候通过拨码开关预置参数,预置完成后&am…

QT自定义系统快捷键任务

关键代码 //自定义快捷键检测 connect(this->ui->hotkeySequenceEdit_1, &QKeySequenceEdit::keySequenceChanged,this, &HotTestWidget::setShortcut_1);// 托盘显示 trayIcon new QSystemTrayIcon(this); QPixmap pixmap("tray.png"); QIcon icon(…

[Android] [解决]Bottom Navigation Views Activity工程带来的fragment顶部空白间距问题

用Android Stuio创建一个Bottom Navigation Views Activity工程, 我们刻意设置一下fragment背景为黑色,会发现,这个fragment离顶部还有一段不小空白距离, 怎么解决呢? 在activity_main.xml里面,删掉这句&a…

2024年【中级消防设施操作员(考前冲刺)】找解析及中级消防设施操作员(考前冲刺)试题及解析

题库来源:安全生产模拟考试一点通公众号小程序 中级消防设施操作员(考前冲刺)找解析考前必练!安全生产模拟考试一点通每个月更新中级消防设施操作员(考前冲刺)试题及解析题目及答案!多做几遍&a…

SuccBI+低代码文档中心 — 可视化分析(仪表板)(下)

制作仪表板 引入数据模型 仪表板所需模型已经在数据模块中准备好,可以将对应模型表添加到数据模型中。提供了两种添加方式: 在数据栏中点击添加按钮,在弹出框中通过搜索或直接在其所在目录下选中该模型,点击确定。 点击数据按钮…

【安卓】调用摄像头和相册

文章目录 调用摄像头拍照从相册中选择照片 调用摄像头拍照 新建一个CameraAlbumTest项目,然后修改activity_main.xml中的代码。在布局文件中添加两个控件:一个Button和一个ImageView。Button是用于打开摄像头进行拍照的,而ImageView则是用于将…

如何使用 Puppeteer 和 Node.JS 进行 Web 抓取?

什么是 Headlesschrome? Headless?是的,这意味着这个浏览器没有图形用户界面 (GUI)。不用鼠标或触摸设备与视觉元素交互,你需要使用命令行界面 (CLI) 来执行自动化操作。 Headlesschrome 和 Puppeteer 很多网页抓取工具都可适用…

【千帆平台】零代码结合知识库或者插件开发一款AI应用,2024年奥运会运动员获奖信息(人工智能应用)

欢迎来到《小5讲堂》 这是《千帆》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 背景组件方式prompt新参数运动员信息组件奖牌排行榜组件 知识库方式…

【Python】函数入门(上)

本篇文章将讲解以下知识: (1)初识函数 (2)函数的参数 (3)函数的返回值 1、初识函数 什么是函数? 函数可以看成是一大堆功能代码的集合。 定义函数格式: def 函…

【ARM】Cortex-A72技术手册(1)

目录 1.介绍 1.1接口 1.2 实现选项 2.功能描述 2.1 processor内部的组件 2.2 接口 2.2.1 Memory接口 2.2.2 可选的Accelerator Coherency Port 2.2.3 可选的GIC CPU接口 2.2.4 Debug 接口 2.2.5 Trace 接口 2.2.6 PMU接口 2.2.7 通用的Timer接口 2.2.8 Cross tri…

html 关于table合并外边框以及自动滚动问题汇总

合并外边框 .tab_main{ width: 100%; height:100%; border: 1px solid #ccc; text-align: center; border-spacing: 0; border-collapse: collapse;//合并外边框 } 固定高度显示上下滑动 <div styleoverflow:scroll;height:100%> <di…

LeetCode 热题 HOT 100 (035/100)【宇宙最简单版】

【栈】No. 0394 字符串解码【中等】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&#xff…

Java面试八股之什么是消息队列

什么是消息队列 消息队列&#xff08;Message Queue&#xff09;是一种应用程序间通信&#xff08;IPC&#xff09;的形式&#xff0c;它允许进程将消息发送到另一个消息队列&#xff0c;接收端则可以在任何时刻从队列中取出这些消息进行处理。消息队列提供了一种异步处理、解…

R语言 | 发一篇 Science 需要学会多少个R包?

1. 一个一个举例子 1.1 实例1 该论文提供的代码涵盖的分析方向齐全&#xff0c;且代码风格和R语言编程细节都有值得学习的地方。代码有点多&#xff0c;包括R&#xff0c;rmd&#xff0c; py&#xff0c;jupyter notebook, shell等格式&#xff0c;压缩包见Q群文件: 187923577…

今年免费AI写作神器推荐,文案创作新宠儿

面对日益增长的创作需求与有限的个人精力&#xff0c;如何高效产出高质量的内容成为了许多创作者面临的共同挑战。幸运的是&#xff0c;现在有不少ai写作免费工具可以帮我们实现。 1.宙语AI写作 链接直达&#xff1a;https://ailjyk.com/pc 这款工具作为一款在线AI应用&#…

最佳 5 款 SD 卡照片恢复应用程序,用于从 SD 卡恢复已删除的照片

我们都知道照片承载着我们一生中最美好的回忆。但残酷的事实是&#xff0c;尽管你备份了所有的照片&#xff0c;但有些文件总会莫名其妙地丢失。无论是意外删除还是由于某种原因格式化设备&#xff0c;数据丢失都是不可避免的。因此&#xff0c;我们不会创建同一文件的数千份副…

恶补费马小定理和组合数

前言&#xff1a;我们平时遇到的组合数如果用杨辉三角型做的话&#xff0c;预处理的复杂度是 n 2 n^2 n2 &#xff0c;遇到大一点的数据就会爆炸 我们怎么去优化呢 C ( n , k ) n ! k ! ⋅ ( n − k ) ! m o d mod C(n, k) \frac{n!}{k! \cdot (n-k)!} \mod \text{mod} C(…

深入剖析大模型安全问题:Langchain框架的隐藏风险

随着大模型热度持续&#xff0c;基于大模型的各类应用层出不穷。Langchain 作为一个以 LLM 模型为核心的开发框架&#xff0c;可以帮助我们灵活地创建各类应用&#xff0c;同时也为大模型的应用引入新的安全隐患。从今年 4 月 Langchain 被爆出在野 0day 漏洞开始&#xff0c;各…

PHP项目任务系统小程序源码

&#x1f680;解锁高效新境界&#xff01;我的项目任务系统大揭秘&#x1f50d; &#x1f31f; 段落一&#xff1a;引言 - 为什么需要项目任务系统&#xff1f; Hey小伙伴们&#xff01;你是否曾为了杂乱的待办事项焦头烂额&#xff1f;&#x1f92f; 或是项目截止日逼近&…

LeetCode刷题笔记第191题:位1的个数

LeetCode刷题笔记第191题&#xff1a;位1的个数 题目&#xff1a; 想法&#xff1a; 通过位运算判断二级制形式中有多少个1&#xff0c;代码及解释如下&#xff1a; class Solution:def hammingWeight(self, n: int) -> int:return sum(1 for i in range(32) if n & …