一、概述简介

官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/
1.是什么?

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

SpringCloud Gateway 是 Spring Cloud 的一个全新项目,基于 Spring 5.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 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。

2.网关在微服务中的位置

二、三大核心概念

1.Route(路由):路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由
2.Predicate(断言):参考的是Java8的java.util.function.Predicate
开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由
3.Filter(过滤):指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。
4.总体:

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

三、GateWay工作流程

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

Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。
过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。

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

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

四、入门配置

1.新建模块cloud-gateway9527
改pom

    <dependencies><!--gateway--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--eureka-client--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency></dependencies>

application.yml


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

9527网关如何做路由映射那???
cloud-client8001看看controller的访问地址(cloud-client8001、8002搭建以及Eureka7001的搭建请看https://blog.csdn.net/weixin_62661659/article/details/124271814?spm=1001.2014.3001.5501
看看cloud-client8001 controller的访问地址

为了安全,目前不想暴露8001端口,希望在8001外面套一层9527,所以以上就是新增网关配置。

主启动类

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

2.测试
启动Eureka7001,cloud-client8001,cloud-gateway9527
添加网关前:http://localhost:8001/client/get

添加网关后:http://localhost:9527/client/get

3.Gateway网关路由有两种配置方式:
第一种:在配置文件yml中配置,就是上面的方式。
第二种:代码中注入RouteLocator的Bean
官网案例:
新增配置类GateWayConfig

@Configuration
public class GateWayConfig {/*** 配置了一个id为route-name的路由规则,* 当访问地址 http://localhost:9527/guonei时会自动转发到地址:http://news.baidu.com/guonei*/@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder) {RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();routes.route("path_route_zhsh",r -> r.path("/guonei").uri("http://news.baidu.com/guonei")).build();return routes.build();}
}

启动cloud-gateway9527
访问:http://localhost:9527/guonei 自动跳转

五、通过微服务名实现动态路由

1.修改9527的application.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-client #匹配后提供服务的路由地址predicates:- Path=/client/get/**         # 断言,路径相匹配的进行路由- id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名#uri: http://localhost:8001          #匹配后提供服务的路由地址uri: lb://cloud-client #匹配后提供服务的路由地址predicates:- Path=/payment/lb/**         # 断言,路径相匹配的进行路由eureka:instance:hostname: cloud-gateway-serviceclient: #服务提供者provider注册进eureka服务列表内service-url:register-with-eureka: truefetch-registry: truedefaultZone: http://eureka7001.com:7001/eureka


需要注意的是uri的协议为lb,表示启用Gateway的负载均衡功能。

2.测试
启动Eureka7001,cloud-client8001,cloud-client8002,gateway9527
访问:http://localhost:9527/client/get
8001/8002两个端口切换

六、Predicate的使用

启动9527

1.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。
2.常用的Route Predicate
After Route Predicate

获得上图中的时间格式

public class A {//运行就可以了public static void main(String[] args) {ZonedDateTime zbj = ZonedDateTime.now(); // 默认时区System.out.println(zbj);}
}

所有断言:

spring:application:name: cloud-gatewaycloud:gateway:discovery:locator:enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由routes:- id: payment_routh #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名#uri: http://localhost:8001          #匹配后提供服务的路由地址uri: lb://cloud-client #匹配后提供服务的路由地址predicates:- Path=/client/get/**         # 断言,路径相匹配的进行路由#- After=2020-02-05T15:10:03.685+08:00[Asia/Shanghai]         # 断言,路径相匹配的进行路由- Before=2020-02-05T15:10:03.685+08:00[Asia/Shanghai]         # 断言,路径相匹配的进行路由#- Cookie=username,zhsh #并且Cookie是username=zhsh才能访问#- Header=X-Request-Id, \d+ #请求头中要有X-Request-Id属性并且值为整数的正则表达式#- Host=**.zhsh.com#- Method=GET#- Query=username, \d+ #要有参数名称并且是正整数才能路由

七、Filter的使用

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

2.Spring Cloud Gateway的Filter
生命周期:pre和post
种类:GatewayFilter 和GlobalFilter

3.常用的GatewayFilter

filters:- AddRequestParameter=X-Request-Id,1024 #过滤器工厂会在匹配的请求头加上一对请求头,名称为X-Request-Id值为1024


4.自定义过滤器
新建Myfilter类

@Component
public class MyFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("全局过滤器");String uname = exchange.getRequest().getQueryParams().getFirst("uname");if (uname == null) {System.out.println("用户名为null,非法用户");exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);return exchange.getResponse().setComplete();}return chain.filter(exchange);}@Overridepublic int getOrder() {return 0;}
}

启动Eureka7001,cloud-client8001,cloud-client8002,gateway9527
访问:http://localhost:9527/client/get?uname=z3
能够正常访问
访问:http://localhost:9527/client/get
显示网页无法正常运作

GateWay路由网关的概述与入门详解相关推荐

  1. Gateway 路由网关

    Gateway 路由网关 1-Gateway 概述 1.1-是什么 1.2-能干嘛 1.3-Why Gateway 2-Gateway 核心 2.1-核心概念 2.2-工作流程 3-Gateway 配 ...

  2. SpringCloud之 Gateway路由网关

    文章目录 Gateway 路由网关 一.部署网关

  3. FFmpeg入门详解之83:流媒体与直播技术

    流媒体 流媒体又叫流式媒体,它是指商家用一个视频传送服务器(比如:vlc)把节目(比如:ande10.mp4)当成数据包发出,传送到网络上.用户通过解压设备对这些数据进行解压后,节目就会像发送前那样显 ...

  4. 【GCN】图卷积网络(GCN)入门详解

    机器学习算法与自然语言处理出品 @公众号原创专栏作者 Don.hub 单位 | 京东算法工程师 学校 | 帝国理工大学 图卷积网络(GCN)入门详解 什么是GCN GCN 概述 模型定义 数学推导 G ...

  5. 【JSON】JSON入门详解(二)

    文章目录 JSON基础文章荐读 JavaScript创建JSON对象 JSON与XML的那些事 JSON与XML的相同之处 JSON与XML的不同之处 AJAX相关JSON与XML JSON与XML的 ...

  6. FFmpeg入门详解之117:视频监控的架构和流程

    几张架构图带您快速了解视频监控 图一 图二 图三 图四 视频监控系统的简介 视频监控 视频监控是安全防范系统的重要组成部分,英文Cameras and Surveillance.传统的监控系统包括前端 ...

  7. FFmpeg入门详解之121:颜色空间转换RGB和YUV的原理与实战

    5.颜色空间转换RGB和YUV的原理与实战 三种颜色空间模型:RGB.YUV.HSV 一.概述 颜色通常用三个独立的属性来描述,三个独立变量综合作用,自然就构成一个空间坐标,这就是颜色空间. 但被描述 ...

  8. Jetpack Compose入门详解(实时更新)

    Jetpack Compose入门详解 前排提醒 前言(Compose是什么) 1.实战准备 一.优势与缺点 二.前四课 三.标准布局组件 1.Column 2.Row 3.Box 四.xml和com ...

  9. FFmpeg入门详解--音视频原理及应用:梅会东:清华大学出版社

    大家好,我的第一本书正式出版了,可以在京东各大店铺抢购哦. <FFmpeg入门详解--音视频原理及应用:梅会东:清华大学出版社> 京东自营链接:https://item.jd.com/13 ...

最新文章

  1. 蓝桥杯 扑克序列(全排列)
  2. UWP开发入门(十九)——10分钟学会在VS2015中使用Git
  3. 暴雪停止与Kespa合作 星际联赛或被迫停赛
  4. MyBatis源码骨架分析
  5. 一个简单的jQuery例子,动态添加表格和删除
  6. C#中判断某软件是否已安装
  7. linux安装oracle 操作系统内核参数 aio,Oracle Study之案例--安装Oracle内核参数配置
  8. 超干货 | 一线从业者实践案例大分享:3个tips实现用户增长
  9. cxf整合spring错误为:cvc-complex-type.2.4.c
  10. 剑指offer之链表续
  11. [消息]C++ Connections 在拉斯维加斯召开年会
  12. strace动态调试 php,PHP实现通过strace定位故障原因的方法
  13. PostgreSQL学习总结(2)—— PostgreSQL 语法
  14. 用正则表达式输出rdf文档的三元组格式数据
  15. python怎么读取csv文件-python读写csv文件方法详细总结
  16. php提取bing背景,PHP代码获取bing每日背景
  17. minecraft pythonapl_Minecraft API
  18. python微信机器人之小i
  19. Python绘制韦恩图并通过集合找到交集并集数据
  20. 02尚硅谷书城案例-用户的注册

热门文章

  1. 各种气候数据的下载(以下载青岛地区40年间月平均气温数据的下载为例)【转】...
  2. 超大100M图片文件怎么压缩?
  3. 使用Spring boot搭建Wechat(企业微信)Demo -图文教程 -01 环境搭建
  4. 2022-2028全球与中国Online Poker Game市场现状及未来发展趋势
  5. js调用打印接口打印web页面之——使用lodop组件打印jsp web页面
  6. springboot和netty整合的聊天室--群聊
  7. Multispace多元空间基于Conflux树图生态,打造全国首个元宇宙硅谷
  8. 织梦编辑器加HTML视频显示很小,dede织梦编辑器中插入视频文件方法
  9. 线上渠道做APP好还是小程序好?
  10. Nessus 使用学习