概述简介

官网: https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/

Cloud全家桶中有个很重要的组件就是网关,在1.x版本中都是采用的Zuul网关;
但在2.x版本中,zuul的升级一直跳票,SpringCloud最后自己研发了一个网关替代Zuul,那就是SpringCloud Gateway一句话:gateway是原zuul1.x版的替代。

Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和 Project Reactor等技术。
Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能, 例如:熔断、限流、重试等。

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

SpringCloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zuul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 1.x非Reactor模式的老版本。而为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。

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

源码架构

GateWay的作用:

1.反向代理
2.鉴权
3.流量控制
4.熔断
5.日志监控…

微服务架构中网关的位置

三大核心概念

Route(路由):

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

Predicate(断言):

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

Filter(过滤):

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

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

GateWay工作流程

客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。
Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。
过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。
Filter在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等有着非常重要的作用。

核心逻辑: 路由转发+执行过滤器链

入门配置

新建cloud-gateway-gateway9527模块
改pom:

<!--gateway-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

写yml:

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

主启动:

@SpringBootApplication
@EnableEurekaClient
public class GateWayMain9527 {public static void main(String[] args) {SpringApplication.run(GateWayMain9527.class, args);}
}

测试:

添加网关前访问:http://localhost:8001/payment/get/31

添加网关后访问:http://localhost:9527/payment/get/31

GateWay网关路由的第二种配置方式
@Configuration
public class GateWayConfig {@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) {RouteLocatorBuilder.Builder routes = builder.routes();routes.route("path_route_atguigu", r -> r.path("/guonei").uri("http://news.baidu.com/guonei")).build();return routes.build();}@Beanpublic RouteLocator customRouteLocator2(RouteLocatorBuilder builder) {RouteLocatorBuilder.Builder routes = builder.routes();routes.route("path_route_atguigu2", r -> r.path("/guoji").uri("http://news.baidu.com/guoji")).build();return routes.build();}
}

测试:

Predicate的使用

启动gateway9527控制台打印如下:

Route 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。

server:port: 9527spring:application:name: cloud-gatewaycloud:gateway:discovery:locator:enabled: true   #开启从注册中心动态创建路由的功能,利用微服务名进行路由routes:- id: payment_routh #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名#uri: http://localhost:8001          #匹配后提供服务的路由地址uri: lb://cloud-payment-servicepredicates:- Path=/payment/get/**         # 断言,路径相匹配的进行路由- id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名#uri: http://localhost:8001          #匹配后提供服务的路由地址uri: lb://cloud-payment-servicepredicates:- Path=/payment/lb/**         # 断言,路径相匹配的进行路由- After=2022-05-26T00:01:26.099+08:00[Asia/Shanghai]    # 断言,路径相匹配的进行路由 在这个时间之后才能访问- Before=2022-05-28T00:01:26.099+08:00[Asia/Shanghai]   # 在这个时间之前才能访问- Between=2020-02-02T17:45:06.206+08:00[Asia/Shanghai],2020-03-25T18:59:06.206+08:00[Asia/Shanghai]   # 在这个时间之间才能访问- Cookie=username,zzyy    #带上username=“zzyy”cookie才能访问- Header=X-Request-Id, \d+  # 请求头要有X-Request-Id属性并且值为整数的正则表达式- Host=**.atguigu.com  #Host Route Predicate 接收一组参数,一组匹配的域名列表,这个模板是一个 ant 分隔的模板,用.号作为分隔符。它通过参数中的主机地址作为匹配规则。- Method=GET  #get请求方式才能访问- Query=username, \d+  # 要有参数名username并且值还要是整数才能路由。支持传入两个参数,一个是属性名,一个为属性值,属性值可以是正则表达式。
eureka:instance:hostname: cloud-gateway-serviceclient: #服务提供者provider注册进eureka服务列表内service-url:register-with-eureka: truefetch-registry: truedefaultZone: http://eureka7001.com:7001/eureka

说白了,Predicate就是为了实现一组匹配规则,让请求过来找到对应的Route进行处理。

Filter的使用(常用的GateWayFilter)

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

server:port: 9527spring:application:name: cloud-gatewaycloud:gateway:discovery:locator:enabled: true   #开启从注册中心动态创建路由的功能,利用微服务名进行路由routes:- id: payment_routh #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名#uri: http://localhost:8001          #匹配后提供服务的路由地址uri: lb://cloud-payment-servicepredicates:- Path=/payment/get/**         # 断言,路径相匹配的进行路由- id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名#uri: http://localhost:8001          #匹配后提供服务的路由地址uri: lb://cloud-payment-servicepredicates:- Path=/payment/lb/**         # 断言,路径相匹配的进行路由- After=2022-05-26T00:01:26.099+08:00[Asia/Shanghai]    # 断言,路径相匹配的进行路由 在这个时间之后才能访问- Before=2022-06-28T00:01:26.099+08:00[Asia/Shanghai]   # 在这个时间之前才能访问- Between=2020-02-02T17:45:06.206+08:00[Asia/Shanghai],2023-03-25T18:59:06.206+08:00[Asia/Shanghai]filters:- AddRequestParameter=X-Request-Red, blue   #过滤器工厂会在匹配的请求头加上一对请求头,名称为X-Request-Red值为blue
eureka:instance:hostname: cloud-gateway-serviceclient: #服务提供者provider注册进eureka服务列表内service-url:register-with-eureka: truefetch-registry: truedefaultZone: http://eureka7001.com:7001/eureka
自定义全局GlobalFilter

主要实现两个接口:implements GlobalFilter,Ordered

能干嘛

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

@Component
@Slf4j
public class MyLogGateWayFilter implements GlobalFilter, Ordered {/**** @param exchange 相当于HttpServletRequest* @param chain 过滤器链* @return*/@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("*********come in MyLogGateWayFilter: " + new Date());String username = exchange.getRequest().getQueryParams().getFirst("username");//请求必须带着username参数if (StringUtils.isEmpty(username)) {log.info("*********用户名为空,非法用户");exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);return exchange.getResponse().setComplete();}//放行,进入下个过滤器链return chain.filter(exchange);}/*** 加载过滤器的顺序,数字越小优先级越高* @return*/@Overridepublic int getOrder() {return 0;}
}


SpringCloud GateWay网关相关推荐

  1. SpringCloud系列教程(五)之SpringCloud Gateway 网关聚合开发文档 swagger knife4j 和登录权限统一验证【Hoxton版】

    阅读提醒: 本文面向的是有一定springboot基础者 本次教程使用的Spring Cloud Hoxton RELEASE版本 由于knife4j比swagger更加友好,所以本文集成knife4 ...

  2. 实测SpringCloud Gateway网关性能(Wrk和Jmeter)

    SpringCloud 的Gateway网关性能到底如何,网上各种传言太多.我用Wrk和Jmeter两种测试工具,在相同环境和代码下进行压测.这里分享一下Wrk压测过程的数据和结果,希望对你的技术选型 ...

  3. SpringCloud Gateway网关统一聚合Swagger接口文档(knife4j),实现通过网关统一文档地址查看所有子服务的接口文档

    前言: 在微服务系统中,通常每个服务都会暴露其接口文档,在前端人员或测试人员查看的时候,并不是那么方便,我们需要告诉相关人员每个服务的文档地址,由于swagger/knif4j(knif4j为更易用的 ...

  4. springcloud gateway网关直接给前端返回json数据

    项目场景: 最近项目的网关会做鉴权操作,鉴权失败想直接给前端请求返回json数据,但是response对象中好像没有直接操作response的方法,借鉴各位大佬的经验,发现想要给response加上j ...

  5. 六、SpringSecurity OAuth2 + SpringCloud Gateway实现统一鉴权管理

    代码 代码仓库:地址 代码分支:lesson6 博客:地址 简介 在先前文章中,我们使用SpringSecurity OAuth2搭建了一套基于OAuth2协议的授权系统,并扩展了手机验证码授权模式. ...

  6. SpringCloud + Consul服务注册中心 + gateway网关

    1  启动Consul 2  创建springcloud-consul项目及三个子模块 2.1 数据模块consul-producer 2.2 数据消费模块consul-consumer 2.3 ga ...

  7. 使用springcloud gateway搭建网关(分流,限流,熔断)

    Spring Cloud Gateway Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 ...

  8. SpringCloud微服务架构之,Hystrix 熔断器,Gateway 网关

    Hystrix 概述 Hystix 是 Netflix 开源的一个延迟和容错库,用于隔离访问远程服务.第三方库,防止出现级联失败(雪崩). pom依耐 <!-- hystrix -->&l ...

  9. SpringCloud Greenwich(四)注册中心之eureka、Zuul和 gateway网关配置

    本项目是搭建基于eureka注册中心的springcloud,使用zuul网关和gateway网关 一.框架搭建 (1)项目结构 eureka-server  eureka注册中心 micro-ser ...

  10. SpringCloud Greenwich(三)注册中心之zookeeper、Zuul和 gateway网关配置

    本项目是搭建基于zookeeper注册中心的springcloud,使用zuul网关和gateway网关 一.框架搭建 (1)项目结构 micro-service  服务提供者 zuul-gatewa ...

最新文章

  1. android网络请求框架_2020,最新APP重构:网络请求框架
  2. ASP.NET MVC3细嚼慢咽---(2)模板页
  3. java中子类对父类中的私有变量和私有方法有拥有权无使用权
  4. python读取excel表格-python读取excel表格中的数据
  5. Intel Realsense D435 pyrealsense set_option() rs.option 可配置参数翻译
  6. 企业信息化投入中咨询服务_全过程工程咨询服务核心价值是什么
  7. Docker PHP 扩展配置
  8. tensorflow2实现unet, 完成眼底血管分割任务
  9. oracle11g服务配置,oracle11g dg broker配置服务的高可用
  10. .net中使用TripleDESCryptoServiceProvider进行3DES加密遇到弱密钥的问题
  11. 一个量化交易策略师的自白_不安全设计师的自白
  12. 今日简报 每日精选12条新闻简报 每天一分钟 知晓天下事 4月13日
  13. 【MySql】MySQL排序分页查询数据顺序错乱的原因和解决办法
  14. 计算机系统(八):网络层(上篇)
  15. 基于java的城市公交查询管理系统
  16. 【纪中受难记】——Day2.感觉冤的慌
  17. 记录一下,转换树结构数据
  18. 清零实验,拆字实验,8255并行口实验(硬件),继电器控制实验(硬件)
  19. 在ArcGIS中勾绘全流域方法
  20. NLP深入学习——什么是词向量和句向量(Word Embedding and Sentence Embedding)

热门文章

  1. 华硕主板如何用u盘启动计算机,华硕主板怎么设置u盘启动
  2. 3DMax制作下雨场景
  3. mysql全量备份命令_linux下进行定时mysql数据库全量备份
  4. 你可以对计算机进行设置 这样用户,win10登陆界面设置 win10登陆界面壁纸
  5. Eplan绘图软件:西门子S7-1500部件
  6. android多开器工作原理,[原创]app隐藏大师绕过密码与多开分析
  7. 一文读懂!最新Transformer预训练模型综述!
  8. 神经网络(单层感知器)
  9. C# 打开CMD窗口并执行CMD 指令
  10. Qt+ECharts开发笔记(三):ECharts的柱状图介绍、基础使用和Qt封装Demo