谷粒商城实战笔记-26-分布式组件-SpringCloud-Gateway网关核心概念原理

news/2024/9/13 23:05:57/ 标签: 笔记, 分布式, spring cloud, 谷粒商城

微服务架构中,API网关扮演着至关重要的角色,它不仅作为微服务间的通信桥梁,还负责安全、监控、限流等职责。

一,网关的发展历程

SpringCloud的网关经历了两代的迭代和更替。

第一代网关是早期的Zuul,由 Netflix 开发并开源。

随着时间的推移和技术的发展,Zuul 面临了一些挑战,比如架构陈旧、性能差、扩展性差、可维护性差,导致其在某些场景下逐渐被其他更现代的技术所取代,如 Spring Cloud Gateway。

虽然Zuul与时俱进的开发2.0版本,但由于SpringCloud Gateway的发展,该版本并未集成都SpringCloud中。

下图是SpringCloud网关的简要发展历程。

在这里插入图片描述

二,SpringCloud Gateway

Spring Cloud Gateway作为Spring家族的一员,自诞生以来便以其现代化的设计理念和卓越的性能表现赢得了广大开发者的青睐。

Spring Cloud Gateway的官方文档地址。

1,核心概念

  • 路由(Route): 路由是Spring Cloud Gateway的基本单位,它定义了请求如何从客户端到达目标服务。每个路由包含一组断言(Predicates)和过滤器(Filters),断言用于匹配请求,过滤器则用于在请求/响应链中执行特定操作。

  • 断言(Predicate): 断言是一种条件语句,用于确定请求是否匹配路由。例如,可以通过路径断言Path来匹配特定的URL路径。

  • 过滤器(Filter): 过滤器用于修改进入或离开网关的请求或响应。它可以执行诸如日志记录、修改请求/响应体、添加响应头等操作。,

2,工作原理

Spring Cloud Gateway的核心是响应式编程模型。它基于Project Reactor框架,能够高效地处理大量并发请求,而不占用过多资源。

在这里插入图片描述

  • 客户端Gateway Client发送请求给网关,
  • 网关的HandlerMapping组件根据配置的断言(Predicate),判断是否请求满足某个路由,满足就发给网关的 WebHandler
  • WebHandler 将请求交给一个过滤器链,请求到达目标服务之前,会执行所有过滤器的 pre 方法
  • 请求到达目标服务处理之后再依次执行所有过滤器的 post 方法

3,一看就懂的案例

看下面真实的网关配置,其中包含了前缀匹配和Cookie匹配:

spring:cloud:gateway:routes:- id: secure-service-routeuri: lb://secure-servicepredicates:- Path=/api/secure/**- Cookie=auth-token,securetokenfilters:- AddRequestHeader=X-Forwarded-Prefix, /api/secure- AddRequestParameter=traceId, ${random.value}

上述的Spring Cloud Gateway配置定义了一条名为secure-service-route的路由规则,用于将特定类型的请求转发到一个称为secure-service的后端服务。

逐个解析配置内容:

  1. 路由ID (id: secure-service-route):这是路由的唯一标识符,便于在日志或配置中引用。

  2. 目标URI (uri: lb://secure-service):指定当请求匹配此路由时,应将请求转发到名为secure-service的服务。lb://前缀表示使用负载均衡机制从服务发现中选择一个实例。

  3. 断言 (predicates):

    • Path=/api/secure/**:这表示只有当请求路径以/api/secure/开头时,才会匹配此路由规则。
    • Cookie=auth-token,securetoken:这表示请求必须包含一个名为auth-token的Cookie,且其值必须为securetoken。这是基本的安全检查,确保请求已被认证。
  4. 过滤器 (filters):

    • AddRequestHeader=X-Forwarded-Prefix, /api/secure:在请求被转发之前,向请求头中添加一个名为X-Forwarded-Prefix的头,其值为/api/secure。这有助于后端服务理解请求的原始路径。
    • AddRequestParameter=traceId, ${random.value}:在请求中添加一个名为traceId的查询参数,其值为一个随机生成的字符串。这用于分布式追踪,以便在整个微服务链路中跟踪请求。

3.1,具体请求示例

假设一个客户端发起如下请求:

GET /api/secure/userinfo HTTP/1.1
Host: yourapp.example.com
Cookie: auth-token=securetoken

下面是Spring Cloud Gateway处理这个请求的流程:

  1. 接收请求:网关接收到客户端的请求。

  2. 匹配路由:网关检查其配置的路由规则,寻找匹配的规则。在本例中,请求的路径以/api/secure/开头,并且包含正确的auth-token Cookie,因此它匹配secure-service-route路由规则。

  3. 应用过滤器:在转发请求之前,网关会应用配置的过滤器。首先,它会向请求头中添加X-Forwarded-Prefix头,然后在请求中添加一个随机生成的traceId参数。

  4. 转发请求:修改后的请求被转发到secure-service服务。请求可能看起来像这样(简化版):

    GET /userinfo?traceId=random123456 HTTP/1.1
    Host: secure-service.example.com
    X-Forwarded-Prefix: /api/secure
    Cookie: auth-token=securetoken
    
  5. 处理响应secure-service处理请求并返回响应。

  6. 返回响应:网关接收到响应后,可以再次应用过滤器对响应进行修改,然后将响应返回给原始客户端。

通过这种方式,Spring Cloud Gateway不仅能够智能地将请求路由到正确的服务,而且还能够添加额外的请求头和参数,以增强安全性、追踪能力和上下文信息。


http://www.ppmy.cn/news/1475655.html

相关文章

Sentieon Arm版本:进一步降低基因组计算成本

前不久,Arm在其社区的HPC blog上发布了一篇Sentieon在低通量全基因组(LP-WGS)的应用案例。 图1 伴随着大规模基因组学的需求持续增长,基因测序成本的降低使得研究和分析更加广泛。而在基因组学的每一个应用背后,都有一系列计算密…

Vue和Element UI 路由跳转,侧边导航的路由跳转,侧边栏拖拽

首先看布局&#xff0c;因为我的用于页面显示的 <router-view> 是通过重定向定位到登陆页的&#xff0c;然后通过登陆页跳转到主页。项目中用到了点击侧边栏的跳转&#xff0c;所以记录下来&#xff0c;方便有需要的人用到~ 阐述 &#xff08;1&#xff09;.content{ di…

Python 爬虫与 Java 爬虫:相似之处、不同之处和选项

在信息时代&#xff0c;网络上可用的数据量巨大且不断增长。为了从这些数据中提取有用的信息&#xff0c;爬虫已成为一种重要的技术。Python 和 Java 都是流行的编程语言&#xff0c;都具有强大的爬虫功能。本文将深入探讨 Python 爬虫和 Java 爬虫之间的差异&#xff0c;以帮助…

IP 协议的特性

IP 协议&#xff08;Internet Protocol&#xff09;作为互联网的核心协议之一&#xff0c;具有诸多关键特性&#xff0c;为网络通信的实现和发展奠定了坚实基础。 一、无连接性 IP 协议是一种无连接的协议。这意味着在发送数据之前&#xff0c;源节点和目的节点之间不需要建立…

Python爬虫教程第4篇-使用BeautifulSoup解析html

文章目录 Beautiful Soup简介安装Beautiful Soup快速开始如何使用Beautiful Soup中的对象TagNameAttributes多值属性 NavigableStringBeautifulSoupComment 遍历文档树子节点tag名字.contents 和 .children.descendants.strings 和 stripped_strings 父节点.parent.parents 兄弟…

充气膜游泳馆安全吗—轻空间

充气膜游泳馆&#xff0c;作为一种新型的游泳场馆&#xff0c;以其独特的结构和众多优点&#xff0c;逐渐受到各地体育设施建设者的青睐。然而&#xff0c;关于充气膜游泳馆的安全性&#xff0c;一些人仍然心存疑虑。那么&#xff0c;充气膜游泳馆到底安全吗&#xff1f;轻空间…

Qt Quick qml自定义控件:qml实现电池控件

qml入门进阶专栏地址:https://blog.csdn.net/yao_hou/category_9951228.html?spm=1001.2014.3001.5482 本篇博客介绍如何使用qml来实现电池控件,效果图如下: 下面给出实现代码 Battery.qml /*电池组件*/import QtQuick 2.15 import QtQuick.Controls 2.15Rectangle {id: b…

Linux 扩展硬盘容量

根分区的硬盘容量不够了需要添加容量 扩展硬盘容量前提是需要虚拟机关机才能进行以下操作 在虚拟中找到虚拟机设置 >> 点击硬盘 >> 选择扩展 >> 输入自已要扩展的大小 >> 确定 这些设置好之后&#xff0c;启动虚拟机 fdisk /dev/sda n p 三个回车…

基于前馈神经网络 FNN 实现股票单变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记…

188家国产大模型:挑战与机遇,未来杀手级AI应用究竟该长什么样子?

未来的杀手级AI应用究竟该长什么样子&#xff1f;这篇文章里&#xff0c;作者梳理了国内外LLMs基础大模型的特征&#xff0c;并于最后发表了自己关于杀手级AI应用的看法和见解&#xff0c;一起来看一下。 摘要&#xff1a; 本文详细列表展示国外18家&#xff0c;国内188家大模…

【计算机毕业设计】021基于weixin小程序微信点餐

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Vue3单文件jsx输出多组件示例遇到的坑

感谢博主减肥吧Evan提供的SFC实现多组件的思路和实现&#xff0c;小卷在大佬的基础上再完善下实现。 我们从tsx的API使用上得到启发&#xff0c;可以在vue的单文件组件&#xff08;sfc&#xff09;中使用defineComponent来定义和导出多个独立的小组件。此时sfc中的<templat…

解决vscode项目中无法识别宏定义的问题

在c_cpp_properties.json中的"defines":[]中定义的宏无法被识别。 从而导致代码中的宏开关无法生效&#xff0c;造成代码的阅读不便利。 排查路线是&#xff1a; 关闭所有插件&#xff0c;删除当前工程目录下的.vscode文件夹。 经过一系列排查发现是C/C插件与clangd插…

sdwan是硬件还是网络协议?

SD-WAN&#xff08;Software-Defined Wide Area Network&#xff0c;软件定义广域网&#xff09;并不是一个硬件产品或单一的网络协议&#xff0c;而是结合了软件、硬件和网络技术的一种解决方案。SD-WAN的核心在于其软件定义的特性&#xff0c;它通过软件来控制和管理广域网的…

一起振动分析案例

1.原始数据 数据出处&#xff1a;https://www.zhihu.com/question/317898467 其他信息&#xff1a;6203轴承&#xff0c;运行时转速6.4转/秒&#xff0c;底座产生大量倍频信号&#xff0c;是轴承存在问题吗&#xff1f;还是装配或者其它原因。 1.第一轮拆解&#xff1a;是否…

Flutter EasyRefresh:介绍与使用指南

什么是 Flutter EasyRefresh&#xff1f; Flutter EasyRefresh 是一个强大的下拉刷新和上拉加载组件&#xff0c;用于构建流畅且高效的 Flutter 应用程序。它提供了多种自定义配置和动画效果&#xff0c;使开发者可以轻松实现列表的刷新和加载功能。 主要功能 支持下拉刷新和…

构建图像金字塔遍历不同的大小

1、首先、构建金字塔&#xff0c;其中包括从原始图像到多层缩小后的图像。 import cv2# 读取原始图像 image cv2.imread(path_to_image)# 构建高斯金字塔 gaussian_pyramid [image] for i in range(6): # 这里假设构建6层image cv2.pyrDown(image) # 下采样gaussian_p…

Golang | Leetcode Golang题解之第227题基本计算器II

题目&#xff1a; 题解&#xff1a; func calculate(s string) (ans int) {stack : []int{}preSign : num : 0for i, ch : range s {isDigit : 0 < ch && ch < 9if isDigit {num num*10 int(ch-0)}if !isDigit && ch ! || i len(s)-1 {switch preS…

uni-app 蓝牙传输

https://www.cnblogs.com/ckfuture/p/16450418.html https://www.cnblogs.com/yangxiaobai123/p/16021058.html 字符串转base64&#xff1a;https://www.cnblogs.com/sunny3158/p/17312158.html 将 ArrayBuffer 对象转成 Base64 字符串&#xff1a;基础 - uni.arrayBufferT…

【css】image 使用 transform:scale 放大后显示不全的问题

css 可以用 transform: scale(1.2) 实现图片放大 1.2 倍显示的功能&#xff0c;在此基础上可以修改 transform-origin 为用户点击的坐标值优化体验。问题在于 origin 位于图片下方时&#xff0c;图片放大后出现滚动条&#xff0c;而滚动条的高度会忽略放大显示的图片的上半部分…