03_初识Spring Cloud Gateway

news2024/11/27 5:41:23

文章目录

  • 一、网关简介
    • 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.coloradmin.cn/o/1796800.html

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

相关文章

Python怎么发邮件不会被拦?如何设置信息?

Python发邮件的注意事项?Python发邮件需要哪些库? 使用Python发送电子邮件是一个常见的需求。然而,有时候邮件可能会被拦截,要确保发送的邮件不被拦截,需要一些技巧和注意事项。AokSend将介绍如何使用Python发送邮件&…

stm32中如何实现EXTI线 0 ~ 15与对应IO口的配置呢?

STM32的EXTI控制器支持19 个外部中断/ 事件请求。每个中断设有状态位,每个中断/ 事件都有独立的触发和屏蔽设置。 STM32的19个外部中断对应着19路中断线,分别是EXTI_Line0-EXTI_Line18: 线0~15:对应外部 IO口的输入中断。 线16&…

十年数据分析经验分享

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

小熊家务帮day10-day12 门户管理(缓存,主页,定时任务)

门户管理 1 门户介绍1.1 介绍1.2 常用技术方案 2 缓存技术方案2.1 需求分析2.1.1 C端用户界面原型2.1.2 缓存需求2.1.3 使用的工具 2.2 项目基础使用2.2.1 项目集成SpringCache2.2.2 测试Cacheable需求Service测试 2.1.3 缓存管理器(设置过期时间)2.1.4 …

我的python管理

目前环境 Anaconda:python3.9 python2.7 IDA:python3.8 pycharm:?? 以后应该会补吧… 因为某些文件似乎用的python2决定整个python2 安装python2.7 打开anaconda命令行输入 conda create --name python27 python2…

RuoYi 使用达梦数据库 MySQL迁移达梦数据库

达梦数据库使用 达梦数据库安装路径:/home/aite/dmdbms 达梦数据库版本 RuoYi-Vue V3.8.7版本达梦数据库目录说明 cd /home/aite/dmdbms ls -l总用量 80 drwxr-xr-x 10 aite aite 12288 5月 31 14:41 bin drwxr-xr-x 2 aite aite 4096 5月 31 14:37 bin2 drwx…

计算机网络-OSI七层参考模型与数据封装

目录 一、网络 1、网络的定义 2、网络的分类 3、网络的作用 4、网络的数据传输方式 5、网络的数据通讯方式 二、OSI七层参考模型 1、网络参考模型定义 2、分层的意义 3、分层与功能 4、TCP\IP五层模型 三、参考模型的协议 1、物理层 2、数据链路层 3、网络层 4…

【Endnote】如何在word界面加载Endnote

如何在word界面加载Endnote 方法1:方法2:从word入手方法3:从CWYW入手参考 已下载EndNote,但Word中没有显示EndNote,应如何加载显示呢? 方法1: 使用EndNote的Configure EndNote.exe 。 具体步骤为&#x…

使用MFC DLL

本文仅供学习交流,严禁用于商业用途,如本文涉及侵权请及时联系本人将于及时删除 应用程序与DLL链接后,DLL才能通过应用程序调用运行。应用程序与DLL链接的方式主要有如下两种:隐式链接和显式链接。 隐式链接又称为静态加载&…

pw备份问题

1、手动build,dn gs_ctl build -D /database/panweidb/data 或 gs_ctl build -D /database/panweidb/data -b full 2、拉起2节点cm cm_ctl start -n 2 3、启动cm_server服务 cm_ctl start 4、 netstat -anop|grep 17700 5、

代码随想录——删除二叉搜索树中的节点(Leetcode450)

题目链接 递归 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

在k8s中部署Logstash多节点示例(超详细讲解)

🐇明明跟你说过:个人主页 🏅个人专栏:《洞察之眼:ELK监控与可视化》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、Logstash简介 2、在K8s中部署Logstash多节点实例…

每日题库:Huawe数通HCIA——13

所有资料均来源自网络,但个人亲测有效,特来分享,希望各位能拿到好成绩! PS:别忘了一件三连哈! 今日题库: 186. 下列协议中属于动态IGP路由协议的是?-单选 A.stA.tiC. B.OSPF c…

GraphQL(3):参数类型与参数传递

1 基本参数类型 (1)基本类型:String,Int,Float,Boolean和ID。可以在shema声明的时候直接使用。 (2)[类型]代表数组,例如:[int]代表整型数组 2 参数传递 (1)和js传递参数一样,小括…

Sentinel1.8.6更改配置同步到nacos(项目是Gateway)

本次修改的源码在:https://gitee.com/stonic-open-source/sentinel-parent 一 下载源码 地址:https://github.com/alibaba/Sentinel/releases/tag/1.8.6 二 导入idea,等待maven下载好各种依赖 三 打开sentile-dashboard这个模块&#xf…

Linux 服务查询命令(包括 服务器、cpu、数据库、中间件)

Linux 服务查询命令(包括 服务器、cpu、数据库、中间件) Linux获取当前服务器ipLinux使用的是麒麟版本还是cenos版本Linux获取系统信息Linux获取CPU 的详细信息Linux查询nignx版本(非容器) Linux获取当前服务器ip hostname -ILinux使用的是麒麟版本还是…

SFML 小demo

文章目录 项目搭建代码实现main.cppobject.hsnake.hcommon.h 使用 demo 做到最后的话其实就只是验证了以前自己的一个想法,但是没有做成一个真正的游戏,可以算是一个 demo 而已吧,没做游戏的界面和关卡,不过完成了核心显式机制和功…

Day32 实现登录注册接口服务

​ 本章节,实现登录和注册接口服务 一.完善登录注册接口 完善登录和注册接口,对登录明文密码获取到MD5 字符串后,进行对比校验或注册明文密码进行MD5 加密后再插入到数据库。在MyToDo.Shared 项目中创建一个Extensions 文件夹,并创建一个 StringExtensions 静态扩展类,其中…

Redis学习(十二)Redis的三种删除策略

目录 一、背景二、Redis 的三种删除策略2.1 定时删除(用CPU换内存空间)2.2 定期删除2.3 惰性删除(用内存换CPU性能) 三、总结 一、背景 我们都知道 Redis 是一种内存数据,所有的数据均存储在内存中,可以通…

用于精准治疗和预防细菌感染的生物功能脂质纳米颗粒

引用信息 文 章:Biofunctional lipid nanoparticles for precision treatment and prophylaxis of bacterial infections. 期 刊:Science Advances(影响因子:13.6) 发表时间:2024年4月5日 作 者&a…