SpringCloud Gateway网关梳理

news2024/11/24 14:05:40

前言

在中大型系统中,Gateway网关发挥着关键的作用,Gateway可以运用在许多应用场景,如接口限流、日志监控、授权认证等等。下面对过往的Gateway知识做一个归纳与总结。

一、路由

路由是Gateway网关中的基础组件,它由一个org.springframework.cloud.gateway.route.RouteDefinition来描述,在RouteDefinition中包含了几个属性,即构造Route所需的基本元素:

id: 路由唯一ID
uri:  转发地址
predicate:断言
filter:路由过滤器
metadata: 其他信息
order: 排序

其中,URI转发地址可以支持

http:http协议
ws: websocket协议
lb:配置注册中心的负载均衡
1. 路由配置方式

既可以通过application或者yml配置,也可以通过自定义Bean通过代码注入。最终都会被加载进入内存,构造为一个RouteDefinition对象。

yml或者application
spring:
   cloud:
	  gateway:
  		routes:
   		 - id: user
     	   uri: lb://user-center
      	   predicates:
        		- Path=/user/**

如果使用自定义Bean构造注册:

	@Bean
 	public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){
    	// 构建多个路由routes
    	RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
    	// 具体路由地址
    	routes.route("user-center",
            	r -> r.path("/msb/**").uri("http://localhost:9001/nacos-provider")).build();
   	 // 返回所有路由规则
    	return routes.build();
 	}
2. 断言

在org.springframework.cloud.gateway.route.RouteDefinition中描述了,一个路由可以包含多个断言和多个过滤器。
断言用于判断是否采用本路由来转发,起到判断作用。开发者可以使用系统断言,也可以使用自定义断言。

系统自带断言
在上述yml配置中:

spring:
   cloud:
	  gateway:
  		routes:
   		 - id: user
     	   uri: lb://user-center
      	   predicates:
        		- Path=/user/**

采用了Path断言器,其对应的断言类为
在这里插入图片描述
这是系统自带的断言器,从源码中可以看到,出了PathRoutePredicateFactory, 还有其他很多种断言,这些断言命名都遵从断言规范,以XXXRoutePredicateFactory来命名,并且继承断言抽象父类AbstractRoutePredicateFactory,实现apply()方法, 通过该方法返回结果判断断言是否满足。

自定义断言
除了使用系统自带的断言,也可以自定义断言。规范按照以XXXRoutePredicateFactory来命名,并且继承断言抽象父类AbstractRoutePredicateFactory,实现apply()方法。可以实现自己的业务逻辑。
创建好后,通过在yml或者自定义路由Bean中配置该断言即可。

3. 过滤器

过滤器有两种

1.路由过滤器,路由过滤器和断言一样,属于org.springframework.cloud.gateway.route.RouteDefinition的成员。
2.全局过滤器,全局过滤器影响所有的请求。

路由过滤器
路由过滤器位于路由转发之前,用于处理和过滤请求数据。和断言一样,系统自带了很多过滤器。
在这里插入图片描述
它的设计原理和断言一样,以XXXGatewayFilterFactory命名,并且继承父类抽象过滤工厂AbstractGatewayFilterFactory,实现apply方法,在该方法中处理过滤器逻辑。

自定义路由过滤器
依葫芦画瓢,自定义一个类,以XXXGatewayFilterFactory命名,并且继承父类抽象过滤工厂AbstractGatewayFilterFactory,实现apply方法,在该方法中处理自定义的过滤器逻辑。

全局过滤器 GlobalFilter
全局过滤器GlobalFilter是一个顶级接口,所有实现了GlobalFilter的实现类,都属于全局过滤器。如果存在多个全局过滤器,则按order优先级顺序来执行。

自定义全局过滤器
如果我们要处理全局的请求或者进行全局拦截,可以实现GlobalFilter接口,自定义全局过滤器。

public class AgeRoute implements GlobalFilter {


@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
	// 业务处理
    ServerHttpRequest request = exchange.getRequest();
    ServerHttpResponse response = exchange.getResponse();
    // 放行
    return chain.filter(exchange.mutate().build());
}

}

全局过滤器中,将会得到两个参数:ServerWebExchange exchange, GatewayFilterChain chain

ServerWebExchange是Webflux框架中的定义,可以获取Http请求和Http响应对象。类似Servlet框架中的HttpServeltRequest和HttpServletResponse对象一样。GatewayFilterChain是网关过滤链表。

Webflux是什么?与Spring MVC有什么关联?

五、Spring WebFlux与Spring MVC

Webflux是Spring Gateway的核心框架,一套非阻塞式异步IO框架。网关的核心作用是进行路由转发,大部分的时间消耗在网络IO上,因此对于IO密集型服务,通过非阻塞式异步架构可以有效利用CPU,并且处理高并发请求。
Gateway的底层依赖Netty服务组件,然后将相关的http协议请求封装为了一个ServerWebExchange对象。
Servlet是由Web容器封装的对象,如Tomcat容器,它将请求封装为了HttpServeltRequest和HttpServletResponse两个对象。
Spring MVC是一套同步阻塞IO框架,并发力度有限。

在Webflux框架中,与Spring MVC一样拥有前端控制器,名称叫做DispatcherHandler。
在这里插入图片描述

进入DispatcherHandler的handler方法后,先是通过RequestMapping,拿到HandlerMethod处理器;
在通过HandlerMethod寻找合适的HandlerAdapter;
拿到合适的适配器对象之后,根据不同规则的Handler执行不同的Handler,这里就包含Controller
在这里插入图片描述

Gateway不仅仅是网关

因为Gateway是Webflux框架,因此它也可以作为一个微服务处理业务逻辑。
可以写Controller、Service等等,访问数据库、缓存等等。
不过作为一个网关职责,不建议写太多的业务逻辑,可以处理一些简单的业务逻辑。具体的业务职责还是交给业务微服务。

六、应用

Gateway可以有很多应用,比如

日志监控
系统限流
权限认证
路由转发
负载均衡
等等

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

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

相关文章

C#开发的OpenRA游戏之金钱系统(2)

C#开发的OpenRA游戏之金钱系统(2) 在我们玩这个游戏时,就会发现每当创建一个新精炼工厂,就会带有一台采矿车,这是怎么样实现的呢? 这个就需要查看建筑物下面这个字段: FreeActor: Actor: HARV SpawnOffset: 1,2 Facing: 256 FreeActor就是标记为免费的物品,在这里

xdma axi-stream

xdma 回环 vivado 里有官方示例 fpga&#xff1a;pcie rx – axi-stream master – axi-stream slave – pcie tx 流程&#xff1a;电脑启动读取&#xff0c;然后电脑再在超时时间内写入。或者电脑启动写入&#xff0c;然后电脑再在超时时间内读出。只读取或只写入会报超时&am…

小程序开发平台源码系统+活动在线报名小程序功能 带完整的搭建教程

今天来给大家分享一下小程序开发平台源码系统的活动在线报名小程序功能。活动在线报名小程序是一种方便快捷的活动报名方式&#xff0c;可以通过小程序进行宣传和报名&#xff0c;让参与者可以方便快捷地进行报名和参加活动。小程序有完整的搭建教程&#xff0c;以下是部分功能…

【14】基础知识:React - redux

一、 redux理解 1、学习文档 英文文档&#xff1a;https://redux.js.org/ 中文文档&#xff1a;http://www.redux.org.cn/ Github: https://github.com/reactjs/redux 2、redux是什么 redux 是一个专门用于做状态管理的 JS 库(不是 react 插件库)。 它可以用在 react&am…

记一次MySQL5初始化被kill的问题排查 | 京东云技术团队

写在前面 由于测试环境JED申请比较繁琐&#xff0c;所以Eone提供了单机版Mysql供用户使用&#xff0c;近期Eone搭建Mysql5的时候发现莫名被kill了&#xff0c;容器规格是4C8G&#xff0c;磁盘30G 这不科学&#xff0c;之前都是可以的&#xff0c;镜像没变&#xff0c;配置没变…

分享大数据培训班班型

泰迪大数据培训班有VIP就业保障班&#xff0c;项目实战班&#xff0c;技能进阶班&#xff0c;技能提升班。不同班型对应不同学习服务。 一、VIP 就业保障班 二、大数据分析/开发项目实战班 三、技能进阶班 四、技能提升班

RabbitMQ 安装和使用Demo

同步是阻塞 MQ&#xff1a;消息队列&#xff0c;基础数据结构中"先进先出"的数据结构。用来解决应用解耦&#xff0c;异步消息&#xff0c;流量消峰等问题。 RabbitMQ、RocketMQ、Kafka RocketMQ 是阿里的 应用层开发使用RabbitMQ 大数据开发Kafka MQ是不是微服务都…

【MATLAB源码-第49期】基于蚁群算法(ACO)算法的栅格路径规划,输出最佳路径图和算法收敛曲线图。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 蚁群算法是一种模拟自然界蚂蚁觅食行为的启发式优化算法。在蚁群系统中&#xff0c;通过模拟蚂蚁之间通过信息素沟通的方式来寻找最短路径。 在栅格路径规划中&#xff0c;蚁群算法的基本步骤如下&#xff1a; 1. 初始化: …

【Redis】Redis持久化策略

目录 策略RDBbgsave执行流程RDB效果演示RDB优缺点 AOFAOF缓冲区刷新策略AOF的重写机制AOF重写机制的触发机制AOF重写流程 混合持久化同时存在aof和rdb快照&#xff0c;以谁为主&#xff1f;信号 策略 RDB > Redis DataBase 相当于定期的方式实现持久化AOF > Append Only…

Python网络编程改良版客户端

在《Python中套接字实现客户端和服务端3-3》中提到&#xff0c;客户端可以通过connect()方法连接服务端&#xff0c;而连接成功的前提是服务端在必须客户端连接之前就要等待连接。 1 当客户端连接时&#xff0c;服务端没有打开 如果客户端连接服务端时&#xff0c;服务端并没…

通过商品ID查询淘宝商品详情数据,可以拿到商品标题,商品价格,商品库存,商品销量,商品sku数据等,淘宝API接口

通过商品ID查询淘宝商品详情数据可以参考以下步骤&#xff1a; 进入淘宝网站&#xff0c;搜索需要查询的商品ID&#xff0c;例如&#xff1a;652874751412。复制该商品的ID号。点击获取请求key和secret地址&#xff0c;请求参数为num_iid商品ID&is_promotion1。发送请求&a…

企业立案信息API的优势与应用场景

引言 随着科技的不断进步&#xff0c;创业者和企业家们在创办新企业时愈发依赖数字化工具。其中&#xff0c;企业立案信息API成为了一项重要的资源&#xff0c;它提供了有关企业立案的关键信息&#xff0c;为企业家们提供了许多优势和丰富的应用场景。本文将探讨企业立案信息A…

【API篇】四、物理分区算子API

文章目录 1、 分区算子&#xff1a;随机分区2、分区算子&#xff1a;轮询分区3、分区算子&#xff1a;重缩放分区4、分区算子&#xff1a;广播5、分区算子&#xff1a;全局分区6、自定义分区 重分区&#xff0c;即数据"洗牌"&#xff0c;将数据分配到下游算子的并行子…

【日志与守护进程】

文章目录 1 :peach:日志:peach:1.1 :apple:对日志的基本理解:apple:1.2 :apple:对日志系统代码的基本编写:apple:1.2.1 :lemon:messageLog.hpp:lemon:1.2.2 :lemon:tcpServer:lemon: 1.3 :lemon:验证:lemon: 2 :peach:守护进程:peach:2.1 :apple:进程组与会话:apple:2.2 :apple…

Rabbitmq 的管理配置

1、Rabbitmq管理 1.1、多租户与权限 每一个RabbitMQ 服务器都能创建虚拟的消息服务器&#xff0c;我们称之为虚拟主机(virtual host) ,简称为vhost 。每一个vhost 本质上是一个独立的小型RabbitMQ 服务器&#xff0c;拥有自己独立的队列、交换器及绑定关系等&#xff0c;井且它…

用PHP爬取视频代码示例详细教程

以下是一个使用Symfony Panther和PHP进行爬虫的示例程序&#xff0c;用于爬虫企鹅上的视频。请注意&#xff0c;这个示例需要使用https://www.duoip.cn/get_proxy这段代码获取爬虫IP。 <?php // 引入所需的库 require vendor/autoload.php;use Symfony\Component\Panther\P…

多媒体应用设计师 第7章 多媒体数字压缩编码技术基础

1.多媒体数据压缩技术理论基础及压缩编码方法分类 必要性:大数据量的图像信息会给存储器的存储容量&#xff0c;通信线路的带宽&#xff0c;以及计算机的处理速度增加极大压力。如果没有多媒体编码压缩技术的发展&#xff0c;大容量图像&#xff0c;视频信息的存储和传输就难以…

林旅强 | AI+开源时代 - 开发者与治理者的机遇与挑战

点击以下链接收听本期 “大咖访谈” 播客&#xff0c;与大咖面对面&#xff1a; 大咖访谈链接&#xff1a;EP15&#xff1a;林旅强 | AI开源时代 - 开发者与治理者的机遇与挑战 刘天栋&#xff1a;访谈主持&#xff0c;开源雨林顾问&#xff0c;开源社联合创始人&#xff0c;Ap…

人工智能应该怎么学?

人工智能这个词炙手可热&#xff0c;为了跟上时代的步伐&#xff0c;有许多小伙伴就想学习人工智能&#xff0c;今天来介绍一下人工智能究竟是什么&#xff1f;应该怎么学&#xff1f;怎么入门&#xff1f; 首先来看一下什么是人工智能&#xff1f; 人工智能 人工智能 人工智能…

puppeteer学习笔记

目录 介绍启动方法功能一、爬虫优势如何实现爬虫小demo 功能二、执行脚本百度搜索脚本demo 功能三、获取cookie&#xff08;这个只能是模拟浏览器当前进入网页的cookie不是平时用的下载的的浏览器的cookie&#xff09;功能四、监控网页&#xff0c;进行性能分析 介绍 puppetee…