Spring GateWay

概述简介

能干什么

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

Spring Cloud Gateway 与Zuul的区别

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

image.png

上述模式的缺点:
servlet是一个简单的网络IO模型,当请求进入servlet container时,servlet container就会为其绑定一个线程,在并发不高的场景下这种模型是适用的。但是一旦高并发(此比如抽风用jemeter压),线程数量就会上涨,而线程资源代价是昂贵的(上线文切换,内存消耗大)严重影响请求的处理时间。在一些简单业务场景下,不希望为每个request分配一个线程,只需要1个或几个线程就能应对极大并发的请求,这种业务场景下servlet模型没有优势
所以Zul 1.X是基于servlet之上的一个阻塞式处理模型,即spring实现了处理所有request请求的一个servlet (DispatcherServlet)并由该servlet阻塞式处理.所以SpringCloud zuul无法摆脱servlet模型的弊端

传统的Web框架,比如说: struts2,springmvc等都是基于Servlet APl与Servlet容器基础之上运行的。
但是
在Servlet3.1之后有了异步非阻塞的支持。而WebFlux是一个典型非阻塞异步的框架,它的核心是基于Reactor的相关API实现的。相对于传统的web框架来说,它可以运行在诸如Netty,Undertow及支持Servlet3.1的容器上。非阻塞式+函数式编程(Spring5必须让你使用java8)
Spring WebFlux是Spring 5.0 引入的新的响应式框架,区别于Spring MVC,它不需要依赖Servlet API,它是完全异步非阻塞的,并且基于Reactor来实现响应式流规范。

二,三大核心概念

Router(路由)

路由是构建网关的基本模块,它由id,目标url,一系列断言和过滤器组成,如果断言为TRUE则匹配该路由
image.png

predicate(断言)

参考的是java8的java.util.function.Predicate
开发人员可以匹配Http请求中的所有内容(例如请求头或者参数),如果请求头与断言相匹配则进行路由

filter(过滤)

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

总体

image.png

web请求,通过一些匹配条件,定位到真正的服务节点。并在这个转发过程的前后,进行一些精细化控制。
predicate就是我们的匹配条件;而fiter,就可以理解为一个无所不能的拦截器。有了这两个元素,再加上目标uri,就可以实现一个具体的路由了

三,工作流程

image.png
客户端向Spring Cloud Gateway发出请求。然后在Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到Gatewa)Web Handler。
Handler再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。
过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。

核心逻辑

路由转发+执行过滤链

四,入门配置

<dependency>  <groupId>org.springframework.cloud</groupId>  <artifactId>spring-cloud-starter-gateway</artifactId>  
</dependency>
server:  port: 9527  
spring:  application:  name: cloud-gateway  
eureka:  instance:  hostname: cloud-gateway-service  client:  service-url:  register-with-eureka: true  fetch-register: true  defaultZone: http://eureka7001.com:7001/eureka
package com.atguigu.springcloud;  import org.springframework.boot.SpringApplication;  
import org.springframework.boot.autoconfigure.SpringBootApplication;  
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;  @SpringBootApplication  
@EnableEurekaClient  
public class GateWayMain9527 {  public static void main(String[] args) {  SpringApplication.run(GateWayMain9527.class,args);  }  
}

9527网关如何做路由映射

image.png

yml新增网关配置

server:port: 9527spring:application:name: cloud-gatewaycloud:gateway:routes:- id: payment_route # 路由的id,没有规定规则但要求唯一,建议配合服务名#匹配后提供服务的路由地址uri: http://localhost:8001predicates:- Path=/payment/get/** # 断言,路径相匹配的进行路由- id: payment_route2uri: http://localhost:8001predicates:- Path=/payment/lb/** #断言,路径相匹配的进行路由eureka:instance:hostname: cloud-gateway-serviceclient:fetch-registry: trueregister-with-eureka: trueservice-url:defaultZone: http://eureka7001.com:7001/eureka/

这两个要删掉

<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-web</artifactId>  
</dependency>  <dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-actuator</artifactId>  
</dependency>

成功
image.png
image.png

网关配置两种方式

image.png

  1. 在配置文件中配置
    在配置文件yml中配置

  2. 在配置类中配置
    代码中注入RouteLocator的Bean 在这里插入图片描述
    在这里插入图片描述

@Configuration
public class GatewayConfig {@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();routes.route("path_route_angenin",  //idr -> r.path("/guonei")  //访问 http://localhost:9527/guonei.uri("http://news.baidu.com/guonei"));  //就会转发到 http://news.baidu.com/guoneiroutes.route("path_route_angenin2",  //idr -> r.path("/guoji")  //访问 http://localhost:9527/guoji.uri("http://news.baidu.com/guoji"));  //就会转发到 http://news.baidu.com/guonjireturn routes.build();}//    @Bean
//    public RouteLocator customRouteLocator2(RouteLocatorBuilder routeLocatorBuilder){
//        RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
//
//        routes.route("path_route_angenin2",  //id
//                r -> r.path("/guoji")  //访问 http://localhost:9527/guoji
//                        .uri("http://news.baidu.com/guoji"));  //就会转发到 http://news.baidu.com/guonji
//
//        return routes.build();
//    }}

出现的问题

  1. 地址写死
  2. 8001这种服务提供者不可能只有一台机器

五,根据服务名实现负载均衡

默认情况下,gateway会根据注册中心注册的服务列表.以注册中心上微服务名为路径创建动态路由转发,从而实现动态路由的功能

image.png

server:  port: 9527  spring:  application:  name: cloud-gateway  cloud:  gateway:  discovery:  locator:  enabled: true  # 开清从注册中心动态创建路由的功能,利用微服务名进行路由routes:  - id: payment_route # 路由的id,没有规定规则但要求唯一,建议配合服务名  #匹配后提供服务的路由地址  
#          uri: http://localhost:8001  uri: lb://cloud-payment-service #匹配后提供服务的路由地址  predicates:  - Path=/payment/get/** # 断言,路径相匹配的进行路由  - id: payment_route2  
#          uri: http://localhost:8001  uri: lb://cloud-payment-service #匹配后提供服务的路由地址  predicates:  - Path=/payment/lb/** #断言,路径相匹配的进行路由  eureka:  instance:  hostname: cloud-gateway-service  client:  fetch-registry: true  register-with-eureka: true  service-url:  defaultZone: http://eureka7001.com:7001/eureka/

Spring Cloud Netflix Ribbon会在定义lb前缀的目标URI上实现负载平衡(官方文档翻译)

六, Predicate的使用

image.png

Spring Cloud Gateway将路由匹配作为Spring WebFlux HandlerMapping基础架构的一部分。
Spring Cloud Gateway包括许多内置的Route Predicate工厂。所有这些Predicate都与HTTP请求的不同属性匹配。多个RoutePredicate工厂可以进行组合
Spring Cloud Gateway创建Route对象时,使用RoutePredicateFactory创建Predicate对象
Predicate 对象可以赋值给
Route。Spring Cloud Gateway包含许多内置的Route Predicate Factories。
所有这些谓词都匹配HTTP请求的不同属性。多种谓词工厂可以组合,并通过逻辑and。

image.png

After Route Predicate

  • 获取当前时区的时间
    ZoneDateTime.now()
predicates:
- Path=/payment/1b/**
#断言,路径相匹配的进行路由
- After=2020-02-21T15:51:37.485+08:0o[Asia/shanghai]

Cookie Route Predicate

  • 不带cookie访问
  • 带cookie访问
    image.png

image.png

Cookie Route Predicate需要两个参数,一个是Cookie name ,一个是正则表达式。
路由规则会通过获取对应的Cookie name值和正则表达式去匹配,如果匹配上就会执行路由,如果没有匹配上则不执行

Header Route Predicate Factory


spring:cloud :gateway :routes:- id: header_routeuri: https : //example.orgpredicates:- HeaderX-Request-Id,ld+

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

路径匹配

例如
Path=/*/product/**断言

  • 作用: 这个断言基于请求的路径来决定是否将请求路由到对应的服务。只有当请求的路径匹配指定的模式(在这个例子中是/*/product/**),请求才会被路由到配置中指定的服务。这种模式允许在请求的路径中有很大的灵活性,能够匹配包含/product/的任何路径。
  • 适用场景: 当你想要根据请求的URL路径将不同的请求分发到不同的后端服务时,这种方式非常有用。比如,所有关于产品信息的请求都可以路由到处理产品信息的微服务。

host匹配

Host=item.gmall.com断言

  • 作用: 这个断言基于请求的主机名(即域名)来决定是否将请求路由到对应的服务。只有当请求的主机名完全匹配item.gmall.com时,请求才会被路由到配置中指定的服务。这种方式侧重于基于请求的“来源”或者说是“访问的域名”来进行路由。
  • 适用场景: 当你的网关服务多个域名,并且你希望根据不同的域名将请求分发到不同的服务时,这种方式非常有用。比如,所有来自item.gmall.com的请求都被路由到处理特定商品信息的服务。

七,filter

image.png
web请求,通过一些匹配条件,定位到真正的服务节点。并在这个转发过程的前后,进行一些精细化控制。predicate就是我们的匹配条件;
而filter,就可以理解为一个无所不能的拦截器。有了这两个元素,再加上目标uri,就可以实现一个具体的路由了

概述

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

image.png

  • 生命周期,only Two
    • pre
    • post
  • 种类,Only Two
    • GateWayFilter
    • GlobalFilter

常用的GateWayFilter

GatewayFilter(31种)
Global Filter(10种)

这里以AddRequestParameter为代表。
image.png

自定义过滤器

两个主要接口介绍

implements GlobalFilter,Ordered

能干啥

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

配置

@Slf4j
public class MyLogGateWayFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("**************come in MyLogGateWayFilter:" + new Date());//获取request中的uname参数String uname = exchange.getRequest().getQueryParams().getFirst("uname");if(uname == null){log.info("*******用户名为null,非法用户!!");//设置响应,不被接受exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);return exchange.getResponse().setComplete();}//返回chain.filter(exchange),放行return chain.filter(exchange);}@Overridepublic int getOrder() {//返回值是过滤器的优先级,越小优先级越高(最小-2147483648,最大2147483648)return 0;}
}

启动7001,8001,8002,9527
http://localhost:9527/payment/lb?uname=111
在这里插入图片描述
http://localhost:9527/payment/lb?xxx=111
在这里插入图片描述

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

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

相关文章

第一个 Angular 项目 - 静态页面

第一个 Angular 项目 - 静态页面 之前的笔记&#xff1a; [Angular 基础] - Angular 渲染过程 & 组件的创建 [Angular 基础] - 数据绑定(databinding) [Angular 基础] - 指令(directives) 这是在学完了上面这三个内容后能够完成的项目&#xff0c;目前因为还没有学到数…

正点原子--STM32基本定时器学习笔记(2)

目录 1. 相关寄存器介绍 1.1 控制寄存器 1(TIMx_CR1)​编辑 1.2 DMA/中断使能寄存器(TIMx_DIER) 1.3 状态寄存器(TIMx_SR) 1.4 计数器(TIMx_CNT) 1.5 预分频器(TIMx_PSC) 1.6 自动重装载寄存器(TIMx_ARR) 2. 工程建立 3. 导入tim.c文件 4. 相关HAL库函数介绍 4.1 H…

【Linux】进程学习(二):进程状态

目录 1.进程状态1.1 阻塞1.2 挂起 2. 进程状态2.1 运行状态-R进一步理解运行状态 2.2 睡眠状态-S2.3 休眠状态-D2.4 暂停状态-T2.5 僵尸状态-Z僵尸进程的危害 2.6 死亡状态-X2.7 孤儿进程 1.进程状态 1.1 阻塞 阻塞&#xff1a;进程因为等待某种条件就绪&#xff0c;而导致的…

蓝桥杯备赛Day9——链表进阶

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]示例 2: 输入:head = [1], n = 1 输出:[]示例 3: 输入:head = [1,2], n = 1 输出:[1]提示: 链表中结点的数目为 sz1 <= sz <= 300 &l…

Vulnhub靶机:hacksudo-Thor

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;hacksudo-Thor&#xff08;10.0.2.49&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://download.vulnhub.com/…

幻兽帕鲁客户端存档文件 - 云上备份和恢复教程

本文将详细介绍如何将幻兽帕鲁游戏客户端的存档文件备份至云端&#xff0c;以及如何从云端恢复存档数据至本地。 一、游戏存档备份场景 幻兽帕鲁的游戏进度存储在电脑本地磁盘上&#xff0c;游戏中创建的每个世界都对应一个本地存档文件夹。在玩游戏过程中&#xff0c;客户端…

停车场|基于Springboot的停车场管理系统设计与实现(源码+数据库+文档)

停车场管理系统目录 目录 基于Springboot的停车场管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员功能实现 &#xff08;1&#xff09;车位管理 &#xff08;2&#xff09;车位预订管理 &#xff08;3&#xff09;公告管理 &#xff08;4&#…

【工具】Android|Android Studio 长颈鹿版本安装下载使用详解

版本&#xff1a;2022.3.1.22&#xff0c; https://redirector.gvt1.com/edgedl/android/studio/install/2022.3.1.22/android-studio-2022.3.1.22-windows.exe 前言 笔者曾多次安装并卸载Android Studio&#xff0c;反复被安卓模拟器劝退。现在差不多是第三次安装&#xff0c…

江科大STM32 终

目录 SPI协议10.1 SPI简介W25Q64简介10.3 SPI软件读写W25Q6410.4 SPI硬件外设读写W25Q64 BKP备份寄存器、PER电源控制器、RTC实时时钟11.0 Unix时间戳代码示例&#xff1a;读写备份寄存器BKP11.2 RTC实时时钟 十二、PWR电源控制12.1 PWR简介代码示例&#xff1a;修改主频12.3 串…

选择冒泡排序

有一浮点型数组A,用C语言写一函数实现对浮点数组A进行降序排序,并输出结果要求要以数组A作为函数的入口&#xff0c;请用冒泡和选择各写一遍 #include <stdio.h> void maopao() {int arr[5] {10,11,15,13,20};int i0,j0,temp;int len sizeof(arr)/sizeof(arr[0]);for(…

牛客网SQL进阶137:第二快/慢用时之差大于试卷时长一半的试卷

官网链接&#xff1a; 第二快慢用时之差大于试卷时长一半的试卷_牛客题霸_牛客网现有试卷信息表examination_info&#xff08;exam_id试卷ID, tag试卷类别,。题目来自【牛客题霸】https://www.nowcoder.com/practice/b1e2864271c14b63b0df9fc08b559166?tpId240 0 问题描述 试…

【Flink状态管理(二)各状态初始化入口】状态初始化流程详解与源码剖析

文章目录 1. 状态初始化总流程梳理2.创建StreamOperatorStateContext3. StateInitializationContext的接口设计。4. 状态初始化举例&#xff1a;UDF状态初始化 在TaskManager中启动Task线程后&#xff0c;会调用StreamTask.invoke()方法触发当前Task中算子的执行&#xff0c;在…

Transformer实战-系列教程13:DETR 算法解读

&#x1f6a9;&#x1f6a9;&#x1f6a9;Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 1、物体检测 说到目标检测你能想到什么 faster-rcnn系列&#xff0c;开山之作&…

Conda历史版本下载地址和python对应关系

一、前言 因为Conda安装版本问题&#xff0c;带来了很多问题&#xff0c;虽然不能直接确定二者之间的关系&#xff0c;但是安装指定版本的conda,确实是一个比较好的方法。特此记忆。 二、下载地址 下载最新版本&#xff1a;Free Download | Anaconda 下载历史版本&#xff…

Springboot集成flowable工作流

文章目录 概要包依赖问题小结 概要 Spirng boot 集成flowable <spring-boot.version>3.1.5</spring-boot.version>包依赖 <dependency><groupId>org.flowable</groupId><artifactId>flowable-spring-boot-starter</artifactId>&l…

vuecli3 执行 npm run build 打包命令报错:TypeError: file.split is not a function

问题 今天有个项目在打包的时候遇到了一个问题&#xff0c;就是执行 npm run build 命令的时候报错了&#xff0c;如下&#xff1a; 解决 我排查了一下&#xff0c;模拟代码如下&#xff1a;在打包的时候用了 MinChunkSizePlugin const webpack require("webpack"…

c++设计模式之装饰器模式

作用 为现有类增加功能 案例说明 class Car { public:virtual void show()0; };class Bmw:public Car { public:void show(){cout<<"宝马汽车>>"<<endl;} };class Audi:public Car { public:void show(){cout<<"奥迪汽车>>&q…

5G NR 信道号计算

一、5G NR的频段 增加带宽是增加容量和传输速率最直接的方法&#xff0c;目前5G最大带宽将会达到400MHz&#xff0c;考虑到目前频率占用情况&#xff0c;5G将不得不使用高频进行通信。 3GPP协议定义了从Sub6G(FR1)到毫米波(FR2)的5G目标频谱。 其中FR1是5G的核心频段&#xff0…

戴上HUAWEI WATCH GT 4,解锁龙年新玩法

春节将至&#xff0c;华为WATCH GT 4作为一款颜值和实力并存的手表&#xff0c;能为节日增添了不少趣味和便利。无论你是钟情于龙年表盘或定制属于自己的表盘&#xff0c;还是过年用来抢红包或远程操控手机拍全家福等等&#xff0c;它都能成为你的“玩伴”。接下来&#xff0c;…

STM32单片机基本原理与应用(四)

直流电机驱动控制原理 1、电机正反转控制 在STM32中&#xff0c;直流电机的正反转控制主要通过改变电机输入电源的极性来实现。当电机的电压极性发生变化时&#xff0c;电机的旋转方向也会相应改变。在硬件电路中&#xff0c;可以通过继电器或晶体管等电子开关来切换电机的电源…