【Springcloud篇】学习笔记五(十章):Gateway网关

第十章_Gateway新一代网关

1.Gateway简介

1.1官网

上一代zuul 1.X:https://github.com/Netflix/zuul/wiki

当前gateway:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/

1.2是什么

SpringCloud Gateway是SpringCloud的一个全新项目,基于Spring5.O+Springboot 2.0和ProjectReactor等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的API路由管理方式。

SpringCloudGateway作为SpringCloud生态系统中的网关,目标是替代Zuul,在SpringCloud2.0以上版本中,没有对新版本的zuul2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 1.x非Reactor模式的老版本。而为了提升网关的性能,

SpringCloud Gateway是基于WebFlux框架实现的,而webFlux框架底层则使用了高性能的Reactor模式通信框架Netty。

springCloudGateway的目标提供统一的路由方式且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。

1.3能干嘛

  • 反向代理
  • 鉴权
  • 流量控制
  • 熔断
  • 日志监控

微服务架构中网关在哪里?

image-20230922102734594

1.4Gateway出现的原因

neflix不太靠谱,zuul2.0一直跳票,迟迟不发布,一方面因为Zuul1.0已经进入了维护阶段,

而且Gateway是SpringCloud团队研发的,是亲儿子产品,值得信赖。而且很多功能Zuul都没有用起来也非常的简单便捷。

Gateway是基于==异步非阻塞模型==上进行开发的,性能方面不需要担心。虽然Netflix早就发布了最新的 Zuul 2.x,但 Spring Cloud 貌似没有整合计划。而且Netflix相关组件都宣布进入维护期;不知前景如何?多方面综合考虑Gateway是很理想的网关选择。

1.5Gateway特征

  • 基于Spring Framework 5, Project Reactor 和 Spring Boot 2.0 进行构建
  • 动态路由:能够匹配任何请求属性
  • 可以对路由指定 Predicate(断言)和 Filter(过滤器)
  • 集成Hystrix的断路器功能
  • 集成 Spring Cloud 服务发现功能
  • 易于编写的 Predicate(断言)和 Filter(过滤器)
  • 请求限流功能
  • 支持路径重写

1.6SpringCloud—Gateway与Zuul的区别?

  • 在SpringCloudFinchley正式版之前,SpringCloud推荐的网关是Netflix提供的Zuul:
  • Zuul 1.x是一个基于阻塞I/O的APIGateway
  • Zuul 1.x基于ServIet2.5使用阻塞架构,它不支持任何长连接(如WebSocket),Zuul的设计模式和Nginx较像,每次I/O操作都是从工作线程中选择一个执行,请求线程阻塞到工作线程完成,但是差别是Nginx用C++实现,Zuul用Java实现,而JVM本身会有第一次加载较慢的情况,使得Zuul的性能相对较差。
  • Zuul 2.x理念更先进想基于Netty非阻塞和支持长连接,但SpringCloud目前还没有整合。Zuul2.x的性能较Zuul1.x有较大提升。在性能方面,根据官方提供的基准测试,SpringCloudGateway的RPS(每秒请求数)是Zuul的1.6倍。
  • SpringCloudGateway建立在SpringFramework5、ProjectReactor和SpringB00t2.之上,使用非阻塞API
  • SpringCloudGateway还支持WebSocket,并且与Spring紧密集成拥有更好的开发体验

1.7Zuul1.x模型

springcloud中所集成的zuul版本,采用的是tomcat容器,使用的是传统的servlet IO处理模型。

Servlet的生命周期?servlet由servlet container进行生命周期管理。

  • container启动时构造servlet对象并调用servlet init()进行初始化,
  • container运行时接受请求,并为每个请求分配一个线程(一般从线程池中获取空闲线程)然后调用service()
  • container关闭时调用servlet destory()销毁servlet

img

上述模式的缺点
servlete—个简单的网络IO模型,当请求进入servlet container时,servlet container就会为其绑定一个线程在并发不高的场景下这种模型是适用的。但是一旦高并发(比如抽风用jemeter压),线程数量就会上涨,而线程资源代价是昂贵的(上线文切换,内存消耗大)严重影响请求的处理时间。

在一些简单业务场景下,不希望为每个request分配一个线程,只需要1个或几个线程就能应对极大并发的请求,这种业务场景下servlet模型没有优势。

所以==Zuul 1.x是基于servlet之上的一个阻塞式处理模型==,即spring实现了处理所有request请求的一个servlet(DispatcherServlet)并由该servlet阻塞式处理处理。所以springcloudzuul无法摆脱servlet模型的弊端。

1.8GateWay异步非阻塞模型

传统的Web框架比如说:struts2,springmvc等都是基于Servlet API与Servlet容器基础之上运行的。

但是,在Servlet3.1之后有了异步非阻塞的支持。而WebFlux是一个典型非阻塞异步的框架,它的==核心是基于Reactor的相关API==实现的。相对于传统的web框架来说,它可以运行在诸如Netty,Undertow及支持Servlet3.1的容器上。非阻塞式+函数式编程(Spring5必须让你使用java8)

SpringWebFlux是Spring5.0引入的新的响应式框架区别于SpringMVC,它不需要依赖ServletAPI,它是完全异步非阻塞的,并且基于Reactor来实现响应式流规范。

2.Gateway工作流程

一句话,路由转发+执行过滤器链

2.1三大核心概念

(1)Route_路由

路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由

(2)Predicate_断言

路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由

(3)Filter_过滤

指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改

image-20230922104139743

route转发:web请求通过一些匹配条件,定位到真正的服务节点。并在这个转发过程的前后,进行一些精细化控制。

predicate就是我们的匹配条件;

filter,就可以理解为一个无所不能的拦截器。有了这两个元素,再加上目标uri,就可以实现一个具体的路由了。

2.2Gateway工作流程

image-20230922104242455

客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。

Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。

过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。

Filter在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等有着非常重要的作用。

3.GateWay入门配置

3.1模块GateWay9527搭建

(1)pom
	<dependencies><!--gateway--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--eureka-client gateWay网关作为一种微服务,也要注册进服务中心。哪个注册中心都可以,如zk--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!-- gateway和spring web+actuator不能同时存在,即web相关jar包不能导入 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity --><groupId>springcloud</groupId><artifactId>cloud-api-commons</artifactId><version>${project.version}</version></dependency></dependencies>
(2)yml

image-20230922111322771

(3)主启动

image-20230922111344301

3.2GateWay实现路由映射

我们目前不想暴露8001端口,希望在8001外面套一层9527

(1)9727服务YML新增网关配置

image-20230922111833455

(2)测试
  • 启动7001
  • 启动8001:cloud-provider-hystrix-payment8001
  • 启动9527网关

访问说明:

  • 加入网关前:http://localhost:8001/payment/get/1
  • 加入网关后:http://localhost:9527/payment/get/1
  • 两者访问成功,返回相同结果

image-20230922112003182

(3)小结

image-20230922112326058

3.3GateWay配置路由的两种方式

Gateway网关路由有两种配置方式:

  • 在配置文件yml中配置(已经写过)
  • 代码中注入RouteLocator的Bean

自己写一个案例:通过9527网关访问到外网的百度新闻网址:http://news.baidu.com/guonei

添加配置类

当访问地址 http://localhost:9527/guonei时会自动转发到地址:http://news.baidu.com/guonei

image-20230922114051029

4.通过微服务名实现动态路由

4.19527服务添加yml文件

image-20230922115934970

4.2测试

  • 启动Eureka7001

  • 再启动服务8001/8002

  • 最后启动9527服务

  • 测试地址:localhost:9527/payment/lb

  • 测试效果:8001/8002两个端口切换

5.GateWay常用的Predicate

5.1Route Predicate Factories是什么

Spring Cloud Gateway将路由匹配作为Spring WebFlux HandlerMapping基础架构的一部分

Spring Cloud Gateway包括许多内置的Route Predicate工厂,所有这些Predicate都与HTTP请求的不同属性匹配,多个Route Predicate工厂可以进行组合。

Spring Cloud Gateway 创建 Route 对象时,使用 RoutePredicateFactory 创建 Predicate 对象,Predicate 对象可以赋值给 Route。 Spring Cloud Gateway 包含许多内置的Route Predicate Factories。

所有这些谓词都匹配HTTP请求的不同属性。多种谓词工厂可以组合,并通过逻辑and。

启动9527服务,观察日志打印结果:

image-20230922152222353

  • idea查看常见的Route Predicate

    首先 ctrl+shift+n,搜索接口RoutePredicateFactory

    第二,ctrl+h查看该类或接口的继承关系

image-20230922152707873

5.2几个RoutePredicateFactory

(1)After Route Predicate

在这个时间之后,这个路由才生效

spring:cloud:gateway:routes:- id: payment_routhuri: http://localhost:8001  predicates:- After=2024-01-03T19:53:19.185+08:00[Asia/Shanghai]

这个时间通过以下代码产生

image-20230922153234612

(2)Before Route Predicate

在这个时间之前这个路由才生效

spring:cloud:gateway:routes:- id: payment_routhuri: http://localhost:8001  predicates:- Before=2024-01-03T19:53:19.185+08:00[Asia/Shanghai]
(3)Between Route Predicate

在这个时间之间路由生效

spring:cloud:gateway:routes:- id: payment_routhuri: http://localhost:8001  predicates:- Between=2022-01-03T19:53:19.185+08:00[Asia/Shanghai],2022-01-03T19:53:19.185+08:00[Asia/Shanghai]
(4)Cookie Route Predicate

Cookie Route Predicate需要两个参数,一个是 Cookie name,一个是正则表达式。

路由规则会通过获取对应的 Cookie name 值和正则表达式去匹配,如果匹配上就会执行路由;如果没有匹配上则不执行

spring:cloud:gateway:routes:- id: payment_routhuri: http://localhost:8001  predicates:- Cookie=username,zzyy
  • 测试

image-20230922153540616

(5)Header Route Predicate

两个参数:一个是属性名称和一个正则表达式,这个属性值和正则表达式匹配则执行。

spring:cloud:gateway:routes:- id: payment_routhuri: http://localhost:8001  predicates:- Header=X-Request-Id, \d+

测试:

image-20230922153704108

(6)Host Route Predicate
spring:cloud:gateway:routes:- id: payment_routhuri: http://localhost:8001  predicates:- Host=**.atguigu.org,**.another.org
  • 测试

image-20230922153850450

(7)Method Route Predicate
spring:cloud:gateway:routes:- id: payment_routhuri: http://localhost:8001  predicates:- Method=GET
(8)Path Route Predicate
spring:cloud:gateway:routes:- id: payment_routhuri: http://localhost:8001  predicates:- Path=/payment/lb/**
(9)Query Route Predicate
spring:cloud:gateway:routes:- id: payment_routhuri: http://localhost:8001  predicates:- Query=username, \d+

测试:

image-20230922154053904

6.Filter的使用

6.1Filter是什么

路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用。Spring Cloud Gateway 内置了多种路由过滤器,他们都由GatewayFilter的工厂类来产生。

6.2Spring Cloud Gateway的Filter

(1)生命周期

在pre或post发送请求之前或者之后

(2)种类—开发不常用

具体看官方文档

  • GatewayFilter:有31种 Spring Cloud Gateway
  • GlobalFilter:有10种 Spring Cloud Gateway
(3)常用的GatewayFilter—开发不常用

使用AddRequestParameter:来添加Filter

spring:cloud:gateway:routes:- id: payment_routhuri: http://localhost:8001  filters:- AddRequestParameter=X-Request-Id,1024 #过滤器工厂会在匹配的请求头加上一对请求头,名称为X-Request-Id值为1024
(4)自定义过滤器

2个主要接口:**GlobalFilter,Ordered**

能干嘛?

  • 全局日志记录
  • 统一网关鉴权
  • 。。。。

自定义全局过滤器配置类:

image-20230922155052618

  • 测试

image-20230922155038930

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MacOS安装JDK+Maven+Idea插件+nvm等

Java安装环境(MacOS)JDKMavenIdea插件nvm等 背景&#xff1a;新机安装开发环境发现需要找很多文章&#xff0c;&#xff0c;&#xff0c;&#xff0c;这里一篇文章安装所有环境 文章目录 Java安装环境(MacOS)JDKMavenIdea插件nvm等一、安装JDK①&#xff1a;下载②&#xff1a;…

【Qt5小项目】接金币小游戏

代码量在250行左右&#xff0c; 需要源码的可以私信我。

ubuntu20.04安装sumo

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 有问题&#xff0c;请大家指出&#xff0c;争取使方法更完善。这只是ubuntu安装sumo的一种方法。一、注意事项1、首先明确你的ubuntu的用户名是什么 二、sumo安装1.…

数据库笔记

文章目录 数据库概述基本概念存储过程完整性约束范式FAQ 分布式锁RedisMySQLZooKeeper 非关系型数据库Redis数据结构限流内存淘汰机制LRU 最近最少使用LFU 最近经常使用 过期策略 关系型数据库Generic SQL数据类型索引负面影响原则类型结构FAQ 事务隔离级别并发导致的问题ACID特…

Java常用

文章目录 基础基础数据类型内部类Java IOIO多路复用重要概念 Channel **通道**重要概念 Buffer **数据缓存区**重要概念 Selector **选择器** 关键字final 元注解常用接口异常处理ErrorException JVM与虚拟机JVM内存模型本地方法栈虚拟机栈 Stack堆 Heap方法区 Method Area (JD…

【python】英语单词文本处理

文章目录 前言一、环境实验所需的库终端指令 二、实现过程Version 1 起源Version 2 listVersion 3 arrayVersion 4 结构化数组Version 5 区分单元且打乱顺序Version 6 可视化 三、txt文件 前言 缘起自懒得考小孩儿单词&#xff0c;最终效果如图&#xff1a; 本文记录了英语单词…

Loadbalancer如何优雅分担服务负荷

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Loadbalancer如何优雅分担服务负荷 前言Loadbalancer基础&#xff1a;数字世界的分配大师1. 分发请求&#xff1a;2. 健康检查&#xff1a;3. 会话保持&#xff1a;4. 可伸缩性&#xff1a;5. 负载均衡…

京东物流基于 StarRocks 的数据分析平台建设

作者&#xff1a;京东物流 数据专家 刘敬斌 小编导读&#xff1a; 京东集团 2007 年开始自建物流&#xff0c;2017 年 4 月正式成立京东物流集团&#xff0c;截至目前&#xff0c;京东物流已经构建了一套全面的智能物流系统&#xff0c;实现服务自动化、运营数字化及决策智能化…

如何写好论文——(14)写作时如何定义和描述研究目标

当我们有了一个具体的细化的研究目标之后&#xff0c;我们需要把它清晰准备描述给我们的读者&#xff0c;并用它来指导我们的研究活动。 一、有方向 我们所选择的具体的研究目标一定要有明确的目标指向&#xff0c;那就是我们的长远目标。 二、有边界 我们要明确自己的研究…

react 之 zustand

zustand可以说是redux的平替 官网地址&#xff1a;https://zustand-demo.pmnd.rs/ 1.安装 npm i zustand2.基础使用 // zustand import { create } from zustand// 1. 创建store // 语法容易出错 // 1. 函数参数必须返回一个对象 对象内部编写状态数据和方法 // 2. set是用来…

docker踩坑记录

踩坑记录 1.1 后台启动容器&#xff0c;实际没有启动 现象&#xff1a; 后台启动centos&#xff0c;结果执行docker ps命令&#xff0c;容器没启动。 原因&#xff1a; docker是以容器启动的&#xff0c;必须要有个前台进程&#xff0c;若是全部都是后台deamon守护进程&…

上位机图像处理和嵌入式模块部署(视频处理vs图像处理)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 从目前发展的情况来看&#xff0c;视频处理会慢慢变成一种主流趋势。这里面的原因很多&#xff0c;比如说现在嵌入式soc的算力越来越强、获取图像的…