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.mzph.cn/news/673621.shtml

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

相关文章

如何保持mac苹果电脑系统在最佳状态?不卡顿

苹果电脑一直以其卓越的性能和用户友好的操作系统而备受欢迎。然而电脑上的文件、应用程序和缓存可能会逐渐积累&#xff0c;导致性能下降。为了确保你的苹果电脑保持最佳状态&#xff0c;高效清理是至关重要的一步。在本文中&#xff0c;我们将分享一些如何清理苹果电脑更高效…

npm 上传一个自己的应用(1) 搭建一个项目环境

上文 在npm官网中注册一个账号并登录 带着大家创建了一个npm账号 我们先登录官网 然后 我们在自己电脑中创建一个文件夹 这个文件夹叫什么没有太大所谓 我这里直接叫 grnpmtext 然后 我们在这个文件夹中初始化一个项目 终端输入 npm initpackage name 要我们输入项目的名称 …

Java项目使用jasypt加密和解密配置文件中关键信息

一、使用背景 项目中application.yml 配置文件中&#xff0c;如数据库、redis、加密算法的私钥等各种配置的username&#xff0c;password的值都是明文的&#xff0c;其实存在一定的安全隐患&#xff0c;如果被人拿到这些配置文件&#xff0c;将直接对系统安全构成极大威胁&…

imgaug数据增强神器:增强器一览

官网&#xff1a;imgaug — imgaug 0.4.0 documentationhttps://imgaug.readthedocs.io/en/latest/ github:GitHub - aleju/imgaug: Image augmentation for machine learning experiments. imgaug数据增强神器&#xff1a;增强器一览_iaa 图像增强改变颜色-CSDN博客文章浏览阅…

Python环境下基于最大离散重叠小波变换和支持向量回归的金融时间序列预测

金融时间序列具有非线性、高频性、随机性等特点&#xff0c;其波动情况不仅与当前股票市场、房地产市场、贸易市场等有强联动性&#xff0c;而且大幅度起伏对于其他市场有较大的影响和冲击。由于金融市场受多种因素影响且各影响因素间也存在一定复杂动态交互关系&#xff0c;导…

开源项目的三年,我的项目经历了哪些变化?

0.前言 自己一个项目写了三年&#xff0c;到底写了什么东西了&#xff0c;这个项目经历了哪些变化呢&#xff1f;其中的心路历程如何&#xff1f; 兄弟们&#xff0c;要是感觉我的项目有价值&#xff0c;去b站给俺点点关注呐。我更新的更快。点击下面的了解就可以跳转去b站。…

我的docker随笔43:问答平台answer部署

本文介绍开源问答社区平台Answer的容器化部署。 起因 笔者一直想搭建一个类似stack overflower这样的平台&#xff0c;自使用了Typora&#xff0c;就正式全面用MarkdownTyporagit来积累自己的个人知识库&#xff0c;但没有做到web化&#xff0c;现在也还在探索更好的方法。 无…

Spring + Tomcat项目中nacos配置中文乱码问题解决

实际工作的时候碰到了nacos中文乱码的问题&#xff0c;一顿排查最终还是调源码解决了。下面为具体的源码流程&#xff0c;有碰到的可以参考下。 对于nacos配置来说&#xff0c;初始主要源码就在NacosConfigService类中。里面有初始化获取配置content以及设置对应监听器的操作。…

配备Apple T2 安全芯片的 Mac 机型及T2芯片mac电脑U盘装系统教程

T2 芯片为 Mac 提供了一系列功能&#xff0c;例如加密储存和安全启动功能、增强的图像信号处理功能&#xff0c;以及适用于触控 ID 数据的安全保护功能。哪些电脑配备了 T2 安全芯片呢&#xff0c;T2芯片mac电脑又如何重装系统呢&#xff1f;跟随小编一起来看看吧&#xff01; …

集群及LVS简介、LVSNAT模式原理、LVSNAT模式配置、LVSDR模式原理、LVSDR模式配置、LVS错误排查

集群 将很多机器组织到一起&#xff0c;作为一个整体对外提供服务 集群在扩展性、性能方面都可以做到很灵活 集群分类&#xff1a; 负载均衡集群&#xff1a;Load Balance高可用集群&#xff1a;High Availability高性能计算&#xff1a;High Performance Computing LVS LVS…

6-3、T型加减速单片机程序【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;根据前两节内容&#xff0c;已完成所有计算工作&#xff0c;本节内容介绍具体单片机程序流程及代码 一、程序流程图 根据前两节文章内容可知&#xff0c;T型加减速的关键内容是运动类型的判断以及定时…

CPP项目:Boost搜索引擎

1.项目背景 对于Boost库来说&#xff0c;它是没有搜索功能的&#xff0c;所以我们可以实现一个Boost搜索引擎来实现一个简单的搜索功能&#xff0c;可以更快速的实现Boost库的查找&#xff0c;在这里&#xff0c;我们实现的是站内搜索&#xff0c;而不是全网搜索。 2.对于搜索…

qt/c++实现表情选择框

&#x1f482; 个人主页:pp不会算法^ v ^ &#x1f91f; 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 实现功能 。编解码的设计 。映射关系设计 。匹配机制设计 演示效…

Lustre文件系统fid介绍

fid介绍 fid是lustre文件系统中文件的唯一标识&#xff0c;总共128位&#xff0c;fid序列、fid序列内编号、fid版本号&#xff08;目前未使用默认为0&#xff09; /*** File IDentifier.** FID is a cluster-wide unique identifier of a file or an object (stripe).* FIDs …

HarmonyOS SDK 助力新浪新闻打造精致易用的新闻应用

原生智能是HarmonyOS NEXT的核心亮点之一&#xff0c;依托HarmonyOS SDK丰富全面的开放能力&#xff0c;开发者只需通过几行代码&#xff0c;即可快速实现AI功能。新浪新闻作为鸿蒙原生应用开发的先行者之一&#xff0c;从有声资讯入手&#xff0c;基于Speech Kit朗读控件上线听…

【C#】.net core 6.0 设置根目录下某个文件夹可访问,访问创建的图片等资源

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握。…

记录 | python list extend()

extend() 函数用于在列表末尾一次性追加另一个序列中的多个值&#xff08;用新列表扩展原来的列表&#xff09;。 以下实例展示了 extend()函数的使用方法&#xff1a; #!/usr/bin/pythonaList [123, xyz, zara, abc, 123]; bList [2009, manni]; aList.extend(bList)print …

应用层DoS

应用层&#xff08;application layer&#xff09;是七层OSI模型的第七层。应用层直接和应用程序 对接并提供常见的网络应用服务&#xff0c;能够在实现多个系统应用进程相互通信的同 时&#xff0c;完成一系列业务处理所需的服务。位于应用层的协议有很多&#xff0c;常见的包…

SpringBoot实现统一异常处理

文章目录 前言实现步骤定义统一响应对象类定义业务异常枚举接口和实现定义业务异常基类定义全局异常处理切面测试和验证 总结 前言 近日心血来潮想做一个开源项目&#xff0c;目标是做一款可以适配多端、功能完备的模板工程&#xff0c;包含后台管理系统和前台系统&#xff0c…

Android CMakeLists.txt语法详解

一.CMake简介 你或许听过好几种 Make 工具&#xff0c;例如 GNU Make &#xff0c;QT 的 qmake &#xff0c;微软的 MSnmake&#xff0c;BSD Make&#xff08;pmake&#xff09;&#xff0c;Makepp&#xff0c;等等。这些 Make 工具遵循着不同的规范和标准&#xff0c;所执行的…