一、概述简介
1、官网
上一代zuul 1.x:Netflix/zuul
当前gateway:
官网 :https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/
官网趴下了的重点:
(1)Spring Cloud Gateway是基于Spring Boot 2.x,Spring WebFlux和Project Reactor 构建的。结果,当您使用Spring Cloud Gateway时,许多您熟悉的同步库(例如,Spring Data和Spring Security)和模式可能不适用。如果您对这些项目不熟悉,建议您在使用Spring Cloud Gateway之前先阅读它们的文档以熟悉一些新概念。Spring Boot 2.xSpring Cloud Gateway是基于Spring Boot 2.x,Spring WebFlux和Project Reactor 构建的。结果,当您使用Spring Cloud Gateway时,许多您熟悉的同步库(例如,Spring Data和Spring Security)和模式可能不适用。如果您对这些项目不熟悉,建议您在使用Spring Cloud Gateway之前先阅读它们的文档以熟悉一些新概念。Spring WebFluxSpring Cloud Gateway是基于Spring Boot 2.x,Spring WebFlux和Project Reactor 构建的。结果,当您使用Spring Cloud Gateway时,许多您熟悉的同步库(例如,Spring Data和Spring Security)和模式可能不适用。如果您对这些项目不熟悉,建议您在使用Spring Cloud Gateway之前先阅读它们的文档以熟悉一些新概念。Project Reactor 构建的Spring Cloud Gateway是基于Spring Boot 2.x,Spring WebFlux和Project Reactor 构建的。结果,当您使用Spring Cloud Gateway时,许多您熟悉的同步库(例如,Spring Data和Spring Security)和模式可能不适用。如果您对这些项目不熟悉,建议您在使用Spring Cloud Gateway之前先阅读它们的文档以熟悉一些新概念。 (2)Spring Cloud Gateway需要Spring Boot和Spring Webflux提供的Netty运行时。它不能在传统的Servlet容器中或作为WAR构建时使用。
2、是什么?
(1)概述
那就是Spring Cloud Gateway,一句话: gateway是原zuul1.版的替代
Gateway是在spring生态系统之上构建的Api网关服务,基于Spring5,SpringBoot2.和Project Reactor等技术。 Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能,例如:熔断、限流、重试等
网站:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/
Spring Cloud Gateway是Spring Cloud的一个全新项目,基于Spring5.0+SpringBoot2.x和Project Reactor等技术开发的网关,它旨在为微服务框架提供一种简单有效的统一的API路由管理方式。 Spring Cloud Gateway作为Spring Cloud生态系统中的网关,目标是替代Zuul,在Spring Cloud以上2.x以上的版本中,没有对新版本的Zuul2.x以上最新高性能版本进行集成,仍然还是使用的Zuul.x非Reactor模式的老版本。而是为了提升网关性能,Spring Cloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层使用了高性能的Reactor模式通框架Netty。 Spring Cloud Gateway目前提供统一的路由方式且基于Filter链的方式提供了网关基本的功能,例如:安全、监控/指标、和限流等
一句话:
SpringCloud Gateway使用的是Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架
源码架构
3、能干嘛
- 反向代理
- 鉴权
- 流量控制
- 熔断
- 日志监控
4、微服务架构中网关在哪里
5、有Zuull了怎么又出来gateway(_GateWay非阻塞异步模型)
我们为什么选择Gateway?
(1)netflix不太靠谱,zuul2.0一直跳票,迟迟不发布
一方面zuul1.0已经进入了维护阶段,而且Gateway是SpringCloud团队研发的,是亲儿子产品,值得信赖 Gateway是基于异步非阻塞模型上进行开发的,性能方面不需要担心,虽然Netfilx早在发布了最新的zuul2.x,但是SpringCloud貌似没有整合计划。而且Netfilx相关的组件进入维护期;不知前景如何? 多方面综合考虑Gateway是很理想的网关选择
(2)SpringCloud Gateway具有如下特性
基于Spring Framework5,Project Reactor和SpringBoot2.x进行构建 动态路由:能够匹配任何请求属性; 可以对路由指定Project (断言)和Filter(过滤器) 集成Hystrix的断路器功能; 集成Spring Cloud服务发现功能; 易于编写Project (断言)和Filter(过滤器) 请求限流功能; 支持路径重写
(3)SpringCloud Gateway与Zuul的区别?
在Spring Cloud Fincheley正式版之前,Spring Cloud推荐的网关是Netfile提供了Zuul; 1、Zuul1.x,是一个基于阻塞I/O的API Gateway 2、Zuul1.x 基于Servlet2.5使用阻塞架构,它不支持任何长连接(如:WebSocket)Zuul的设计和Nginx较像,每次I/O操作都是从工作线程中选择一个执行,请求线程被阻塞到工作线程完成,但是差别Nginx是用C++实现,Zuul用java实现,而JVM本身会有第一次加载较慢的情况,使得Zuul的性能相对较差。 3、Zuul2.x理念更先进,想基于Netty非阻塞和支持长连接,但SpringCloud目前还没有整合。Zuul2.x的性能较Zuul1.x较大的提升。 在性能方面,根据官方提供基准测试,Spring Cloud Gateway的RPS(每秒请求数)是Zuul的1.6倍 4、Spring Cloud Gateway建立在Spring Framework5、Project Reactor和SpringBoot2.x之上,使用非阻塞API。 5、Spring Cloud Gateway还支持WebSocket,并且与Spring紧密集成拥有更好的开发体验。
Zuul1.x模型
Spring Cloud 中所集成的Zuul版本,采用Tomcat容器,使用的是传统是Servlet IO处理模型。 由于Servlet生命周期:是由Servlet container进行生命周期管理。 container启动时构造servlet对象并调用servlet init() 进行初始化; container运行时接受请求,并为每个请求分配一个线程(一般从线程池中获取空闲线程 ),然后调用servlet()。 container关闭时调用servlet destory() 销毁servlet。
上述模式的缺点:
servlet是一个简单的网络IO模型,当请求进入Servlet container时,Servlet container就会为其绑定一个线程,在并发不高的场景下,这种模型是适用的。但是一旦高并发(比如抽风用jemeter压),线程数量就会上涨,而线程线程资源代价是昂贵的(上线文切换,内存消耗)严重影响请求的处理时间。 一些简单的业务场景下,不希望为每个request分配一个线程,只需要1个或几个线程就能对极大并发的请求,这种业务场景下,servlet模型没有任何优势。 所以,Zuul1.x是基于servlet之上的一个阻塞式处理模型,即Spring实现处理所有request请求一个servlet(DispatcherServlet)并由该Servlet阻塞式处理。 所以,Spring Cloud Zuul无法摆脱servlet模型的弊端。
Gateway模型
WebFlux是什么?
官网:Web on Reactive Stack
说明
二、三大核心概念
1、Route(路由)
路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如断言为true则匹配该路由
2、Predicate(断言)
参考的是Java8的java.util.function.Predicate 开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由
3、Filter(过滤)
指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改.
4、总结
web请求,通过一些匹配条件,定位到服务真正的节点。并在这个转发过程的前后,进行一些精细化控制。 predicat就是我们匹配的条件;而filter,就可以理解为一个无所不能的拦截器,有了这两个元素,再加上目标url,就可以实现一个具体的路由了
四、Gateway工作流程
1、官网总结
2、核心逻辑
路由转发+执行过滤器链
五、入门配置
1、Gateway9527搭建
(1)在父工程cloud2020下创建一个子模块名为“cloud-gateway-gateway9527”
(2)添加子模块cloud-gateway-gateway9527的pom文件
cloud2020cloud-gateway-gateway9527pom.xml
<?
(3)写YML
cloud2020cloud-gateway-gateway9527srcmainresourcesapplication.yml
server:
(4)主启动类
cloud2020cloud-gateway-gateway9527srcmainjavacomstudyspringcloudGateWayMain9527.java
package
9527网关如何做路由映射呢?
(1)在cloud-gateway-gateway9527微服务工程下的的yml全局配置文件配置:
cloud2020cloud-gateway-gateway9527srcmainresourcesapplication.yml
spring:
说明
(2)启动微服务工程(先启动EurekaMain7001、后启动PaymentMain8001、最后启动GateWayMain9527)
(3)测试
http://:7001/
添加网关前:http://localhost:8001/payment/get/31
添加网关后:http://localhost:9527/payment/get/31
2、Gateway配置路由的两种方式
若想找微服务的端口号,可以访问:http://localhost:9527/payment/lb
YML配置说明(Gateway网关路由有两种配置方式)
需求案例:百度国内新闻网站,需要外网(百度新闻--海量中文资讯平台)
自己写一个:百度新闻、业务需求(通过9527网关访问到外网的百度新闻网址)
(1)编写路由构建器(业务类)
cloud2020cloud-gateway-gateway9527srcmainjavacomstudyspringcloudconfigGateWayConfig.java
package
(2)启动微服务主程序GateWayMain9527
(3)测试访问外网(路由网关做映射)
http://localhost:9527/guonei
3、GateWay配置动态路由
默认情况下Gatway会根据注册中心注册的服务列表, 以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能
(1)yml配置参数调整(以下为例)
cloud2020cloud-gateway-gateway9527srcmainresourcesapplication.yml
spring:
(2)启动一个eureka7001+两个服务提供者8001/8002
(3)测试:http://localhost:9527/payment/lb (路由自动切换)
知乎视频www.zhihu.com
4、GateWay常用的Predicate
(1)场景:比如项目上线了,出现点问题,我们采用路由时间设置,不到这个时间是无法访问,访问将会报错,如图所示:
设置这个配置,我们只需要在yml文件配置即可
-
当时间到了就可以访问
http://localhost:9527/payment/lb
(2)场景二:采用cookies去访问(前提满足时间符合,其次必须带cookies访问)
也是自动切换,若不带cookie 访问将报404
C:
(3)场景三:正则表达式配置去访问(这正则表达式必须是整数,若出现负数将会出现404)
设置这个配置,我们只需要在yml文件配置即可
-
重启程序访问:自动切换
C:
输入负数,报错出现404
C:
总结配置
5、GateWay的Filter
(1)是什么?
官网:
https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#gatewayfilter-factories
官网:Spring Cloud Gateway
(2)常用的GatewayFilter
自定义过滤器(自定义全局GlobalFilter)
两个主要接口介绍:implments GlobalFilter,OrderId
能干嘛?
全局日志记录 统一网关鉴权
案例代码
(1)实现implments GlobalFilter,OrderId接口
cloud2020cloud-gateway-gateway9527srcmainjavacomstudyspringcloudfilterMyLogGateWayFilter.java
package
(2)启动测试访问:http://localhost:9527/payment/lb?uname=z3
知乎视频www.zhihu.com
控制台打印输出信息: