初识Spring Cloud Gateway

文章目录

  • 一、网关简介
    • 1.1 网关提出的背景
    • 1.2 网关在微服务中的位置
    • 1.3 网关的技术选型
    • 1.4 补充
  • 二、Spring Cloud Gateway的简介
    • 2.1 核心概念:路由(Route)
    • 2.2 核心概念:断言(Predicate)
    • 2.3 核心概念:过滤器(Filter)
    • 2.4 功能特性
  • 三、自定义断言和过滤器
    • 3.1 自定义路由断言工厂
    • 3.2 自定义过滤器工厂
    • 3.3 自定义全局过滤器
  • 参考链接

一、网关简介

1.1 网关提出的背景

在微服务架构中,一个系统会被拆分为多个微服务,这样就带来了一些问题:

  • 前端需要维护大量微服务的地址。随着项目的迭代,后端可能需要重新划分微服务,此时前端需要进行相应的调整。
  • 每个微服务都需要进行一些重复的工作,如认证、鉴权、处理跨域问题。

为了解决上述问题,微服务引入了网关的概念。网关作为客户端的统一入口,负责将请求路由到具体的微服务。网关还可以实现一些业务无关的公用逻辑,如认证、鉴权、处理跨域、路由转发、安全策略(SQL注入,Web攻击,黑白名单)、流量控制、日志监控,证书/加密解密等处理等。

1.2 网关在微服务中的位置

请求链:客户端->负载均衡->网关->微服务。
在这里插入图片描述

1.3 网关的技术选型

在这里插入图片描述

1.4 补充

对于一般的系统,只涉及一个微服务应用,此时网关和微服务应用在一起。

对于复杂的系统,会涉及多个微服务应用,此时在每个微服务应用中都使用一个单独的网关是不合理的,正确的做法是单独使用一个应用作为这些微服务应用的共同网关。

二、Spring Cloud Gateway的简介

2.1 核心概念:路由(Route)

使用了网关后,所有客户端的请求都会先达到网关,再由网关将请求转发到特定的微服务。Spring Cloud Gateway中定义了路由的概念,使用路由来配置请求的转发逻辑,每个路由包含如下几个关键元素:

  • ID:路由的唯一标识符。
  • URI:目标服务的地址。
  • Order:路由优先级,数字越小,优先级越高。
  • Predicates:一系列判断条件,用于决定请求是否应该由当前路由处理。
  • Filters:请求在被转发前后可执行的一系列操作,用以修改请求或响应。

路由本质是一种配置,每种路由对应一条配置,可以通过配置文件或代码来配置。其中使用的Predicate和Filter可以是内置的,也可以是自定义的。

2.2 核心概念:断言(Predicate)

断言用于判断收到的请求是否应该由当前路由处理。断言基于请求的各种属性(如请求头、路径、方法等)进行匹配。Spring Cloud Gateway 提供了多种内置的断言工厂,如基于路径(Path)、请求方法(Method)、主机名(Host)、查询参数(Query)等的断言,同时也支持自定义断言。断言之间可以进行逻辑组合(AND、OR等),以实现复杂的匹配逻辑。

内置断言见官方文档中的5. Route Predicate Factories

2.3 核心概念:过滤器(Filter)

过滤器用于对请求和响应进行处理。过滤器可以修改请求、响应或执行路由逻辑。过滤器可以用来实现诸如身份验证、日志记录、请求改写、响应处理等多种功能。Spring Cloud Gateway同样提供了丰富的内置过滤器工厂,并且支持自定义过滤器。

从作用范围看,过滤器分为两种类型,网关路由器(Gateway Filters)应用于特定路由,全局路由器(Global Filters)应用于所有路由。

内置过滤器见官方文档中的6. GatewayFilter Factories7. Global Filters

2.4 功能特性

  • 基于Spring 5,Project Reactor,SprngBoot 2 构建。
  • 动态路由:能匹配任何请求属性。
  • 支持路径重写。
  • 集成 Spring Cloud 服务发现功能(Nacos,Eruka)。
  • 可集成流控降级功能(Sentinel,Hystrix)。
  • 可以对路由指定易于编写的 Predicates 和 Filters。

三、自定义断言和过滤器

3.1 自定义路由断言工厂

自定义路由断言工厂的要点(可以模仿内置路由断言工厂来写):

  • 必须是Spring的组件(使用@Component标记)。
  • 类名必须以"RoutePredicateFactory"为后缀(底层用到反射,约定了类名规范)。
  • 必须继承AbstractRoutePredicateFactory
  • 必须在内部定义一个静态内部类Config,用于接收配置信息,写法固定,定义需要的属性和对应的get方法即可。
  • 需要结合shortcutFieldOrder()进行绑定(配置信息绑定到静态内部类属性)。
  • apply()中定义断言逻辑。

3.2 自定义过滤器工厂

自定义过滤器工厂的要点(类似于自定义路由断言工厂的要点):

  • 必须是Spring的组件(使用@Component标记)。
  • 类名必须以"GatewayFilterFactory"为后缀。
  • 必须继承AbstractGatewayFilterFactory
  • 必须在内部定义一个静态内部类Config,用于接收配置信息,写法固定,定义需要的属性和对应的get/set方法即可。
  • 需要结合shortcutFieldOrder()进行绑定。
  • apply()中定义过滤逻辑。

3.3 自定义全局过滤器

写一个类实现GlobalFilter,然后将该类交给Spring管理即可,不需要单独配置。

参考链接

Spring Cloud Gateway 服务网关的部署与使用详细介绍
SpringCloud GateWay 万字详解
SpringCloud gateway (史上最全)
b站视频:图灵Java面试教程->SpringCloud Gateway微服务网关全套
官方文档:Spring Cloud Gateway

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

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

相关文章

手机文件管理软件哪个好?巧用文件命名分类工具,文件清晰醒目!

随着智能手机功能的日益强大,我们日常使用手机存储的文件也越来越多,如何高效地管理这些文件成为了许多人的需求。因此,手机文件管理软件应运而生,它们能够帮助我们更好地组织、查找和编辑手机中的文件。在众多手机文件管理软件中…

结构体(C保姆级讲解)

前言: 为什么会有结构体,结构体可以用来面熟一个复杂对象,我们知道C语言中有哪些数据类型,有整型,有浮点型,有字符型,但是在生活中,我们需要描述一些比较复杂的东西,比如…

Vitalik:Layer2 是以太坊社区文化的延伸

原文标题:《Layer 2s as cultural extensions of Ethereum》 撰文:Vitalik Buterin,以太坊联合创始人 编译:Chris,Techub News 在我最近关于 L1 和 L2 扩容差异的文章中,我最终得出的结论是, …

java——网络编程套接字

T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 今天你敲代码了吗 目录 2.网络编程套接字2.1 socket api2.2 TCP和UDP之间的区别有连接 vs 无连接可靠传输 vs 不可靠传输面向字节流vs面向数据报全双工 vs 半双工 2.3UDP数据报套接字编程UDP 回显服务器UDP客户端…

Mariadb操作命令指南

MariaDB简介 ​ 以下内容仅是站长或网友个人学习笔记、总结和研究收藏。不保证正确性,因使用而带来的风险与本站无关! 数据库应用程序与主应用程序分开存在,并存储数据集合。 每个数据库都使用一个或多个API来创建,访问&#xf…

ch4网络层---计算机网络期末复习(持续更新中)

网络层概述 将分组从发送方主机传送到接收方主机 发送方将运输层数据段封装成分组 接收方将分组解封装后将数据段递交给运输层网络层协议存在于每台主机和路由器上 路由器检查所有经过它的IP分组的分组头 注意路由器只有3层(网络层、链路层、物理层) 网络层提供的服务 一…

ArcGIS教程(02):创建多模式网络数据集

启动“新建网络数据集”向导 命名网络并选择源要素类 输入网络数据集名称【ParisMultimodal_ND】,点击【下一页】 点击【全选】网络数据集中的要素类 点击【下一页】 设置连通性和高程策略 点击【连通性】 Metro_Entrances 的每个要素与街道要素类的折点重…

企业文件加密:保障知识产权与客户隐私

在数字化时代,企业文件的安全成为了保护知识产权和客户隐私的关键。随着网络攻击和数据泄露事件的日益增多,企业必须采取强有力的措施来确保其敏感信息的安全。文件加密技术作为一项重要的数据保护手段,对于维护企业的竞争力和客户信任至关重…

第八十三节 Java面向对象设计 - Java方法重载

Java面向对象设计 - Java方法重载 在同一类中具有多个具有相同名称的方法称为方法重载。 类中具有相同名称的方法可以是声明的方法,继承的方法或两者的组合。 重载方法必须具有不同数量的参数,不同类型的参数或两者。 方法的返回类型,访问…

数字孪生技术为何备受各行业青睐?

数字孪生技术近年来在各行业中受到越来越多的重视,这是因为它具备了显著的优势和广泛的应用前景。数字孪生是指利用数字化技术,在虚拟空间中创建一个与现实世界对应的虚拟模型,通过数据的实时交互和反馈,实现对物理实体的模拟和监…

3d模型移动中心点偏移太远怎么解决?---模大狮模型网

在3D建模和动画制作中,移动模型时确保中心点的准确性至关重要。然而,有时候在移动模型时,中心点可能会偏移得太远,导致操作不便甚至影响到后续的工作流程。本文将介绍在3D模型移动中心点偏移太远时的常见原因,并提供解…

Linux系统编程——动静态库

目录 一,关于动静态库 1.1 什么是库? 1.2 认识动静态库 1.3 动静态库特征 二,静态库 2.1 制作静态库 2.2 使用静态库 三,动态库 3.1 制作动态库 3.2 使用动态库一些问题 3.3 正确使用动态库三种方法 3.3.1 方法一&…

sprintboot中拦截器的使用

文章目录 1. 为什么要使用拦截器2.拦截器的注册3.创建一个登录拦截器 1. 为什么要使用拦截器 1.权限检查:进入程序判断是否登录,没有登录,直接返回跳转到登录界面 2.性能监控:通过拦截器在进入处理程序之前记录开始时间&#xff…

java家政上门系统源码,一套同城预约、上门服务的家政系统源码

一款同城预约、上门服务的家政系统源码,用户端、服务端、管理端各端相互依赖又相互独立,支持选择项目、选择服务人员的下单方式,支持多城市并且设置每个城市专属服务项目。 技术架构:java1.8springboot mysql htmlThymeleaf uni…

【AI+知识库问答】沉浸式体验了解 AI知识库问答fastGPT

之前写过一篇文章 【AI本地知识库】个人整理的几种常见本地知识库技术方案 , 由于当时主要是针对AI本地知识库, 所以没列fastGPT。 最近经常刷到fastGPT,这里单独水一篇。 FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,…

UML静态图-对象图

概述 静态图包含类图、对象图和包图的主要目的是在系统详细设计阶段,帮助系统设计人员以一种可视化的方式来理解系统的内部结构和代码结构,包括类的细节、类的属性和操作、类的依赖关系和调用关系、类的包和包的依赖关系。 对象图与类图之间的关系&…

centos7 openssh9.7p 制作rpm包

centos7 openssh9.7p 制作rpm包 下载源码包:通过git开源打包源码准备编译打包环境编译打包上传rpm包到需要更新的服务器,并更新 下载源码包: 一般只用ssh源码就可以了 cd /root wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.7p…

UI线程和工作线程

引用:windows程序员面试指南 工作线程 只处理逻辑的线程,例如:启动一个线程,用来做一个复杂的计算,计算完成之后,此线程就自动退出,这种线程称为工作线程 UI线程 Windows应用程序一般由窗口…

ST - 如何利用SCR轻松驱动AC/DC转换器启动?

过去十年,新装服务器的市场需求增长迅猛,2015到2022年复合年均增长率达到了11%。拉动市场增长的动力主要来自以下几个方面:首先,个人文件无纸化和企业办公数字化进程加快;其次,健康危机期间的居家办公&…

【LeetCode算法】第100题:相同的树

目录 一、题目描述 二、初次解答 三、官方解法 四、总结 一、题目描述 二、初次解答 1. 思路:二叉树的先序遍历。采用递归的先序遍历方法,首先访问根节点若不同则返回false,其次访问左子树和右子树。在访问左右子树时,需要注意…