gateway sentinel 熔断 不起作用_微服务Gateway新一代网关

cc1158a49e96cbdf9d1f451b0ed49715.png

上篇:

https://zhuanlan.zhihu.com/p/183930681​zhuanlan.zhihu.com

一、概述简介

1、官网

上一代zuul 1.x:Netflix/zuul

1a0bf17ec75e191da6c983256a4fa219.png

当前gateway:

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

e96db0faf855cd933d3cd807ef9fdcb0.png

官网趴下了的重点:

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

b2f22b49fc4fbdc71db8bed512a9b3dd.png
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/

fd4954afa94ef96abd221c57bcae7b35.png
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通讯框架

源码架构

ae8770ded5876a8059ab851753b8e17b.png

3、能干嘛

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

4、微服务架构中网关在哪里

1fd4dbaf3458fa3fe69a5cfc915fa2f7.png

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。

dae04704bb472ac0a60f27f8fd74aa18.png

上述模式的缺点:

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

708891a0149b720ae9cba90e5bb78026.png

ffc1f132e5869510ab66887c7e22e5b1.png

64e1ca4faefc1db80b2fe71426e849e2.png
说明

二、三大核心概念

1、Route(路由)

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

2、Predicate(断言)

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

3、Filter(过滤)

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

4、总结

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

四、Gateway工作流程

1、官网总结

7e599530d5fa129835c57dded2b64eef.png

01376e74c7ca8f41a089dc8c0bde192e.png

062a0904a5388703c9f3d400bb3e84cb.png

2、核心逻辑

路由转发+执行过滤器链

五、入门配置

1、Gateway9527搭建

(1)在父工程cloud2020下创建一个子模块名为“cloud-gateway-gateway9527”

16ceb6a1458da2e202d55d5dc2d0b916.png

(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:
  

c0ac1998095432c06f383cc326b93169.png

8d34f8e702e9eef6e6847988417111cb.png
说明

(2)启动微服务工程(先启动EurekaMain7001、后启动PaymentMain8001、最后启动GateWayMain9527

390ada7e6eb000db458034b13987d1c7.png

(3)测试

http://eureka7001.com:7001/

e4a65e2381f0305cff92d65abfd0142c.png

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

cc9c1127e284db484d5e99e1d8505099.png

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

d6cf82cb78eee6555ac4a8745a955943.png

2、Gateway配置路由的两种方式

若想找微服务的端口号,可以访问:http://localhost:9527/payment/lb

4ab91b8b276ba7a645a6ce0821032dab.png

YML配置说明(Gateway网关路由有两种配置方式)

需求案例:百度国内新闻网站,需要外网(百度新闻--海量中文资讯平台)

自己写一个:百度新闻、业务需求(通过9527网关访问到外网的百度新闻网址)

(1)编写路由构建器(业务类)

cloud2020cloud-gateway-gateway9527srcmainjavacomstudyspringcloudconfigGateWayConfig.java
package 

(2)启动微服务主程序GateWayMain9527

8320993bf93e9cda4fe1a1a58659298b.png

(3)测试访问外网(路由网关做映射)

http://localhost:9527/guonei

0756d1e2f1d983a5cce19bff43c46179.png

3、GateWay配置动态路由

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

(1)yml配置参数调整(以下为例)

cloud2020cloud-gateway-gateway9527srcmainresourcesapplication.yml
spring:
  

cc9cd777239061299f080908d62e7cce.png

(2)启动一个eureka7001+两个服务提供者8001/8002

d5fa326a8d6ee8e416a40d4d28666dda.png

(3)测试:http://localhost:9527/payment/lb (路由自动切换)

知乎视频​www.zhihu.com

4、GateWay常用的Predicate

(1)场景:比如项目上线了,出现点问题,我们采用路由时间设置,不到这个时间是无法访问,访问将会报错,如图所示:

bc716b00ef89248bfb5d4c24dc26739b.png

设置这个配置,我们只需要在yml文件配置即可

- 

63dd35e1d23b166555030fdc58d741cb.png

当时间到了就可以访问

http://localhost:9527/payment/lb

6d1c337a76d529748601286fab57a1f5.png

(2)场景二:采用cookies去访问(前提满足时间符合,其次必须带cookies访问)

也是自动切换,若不带cookie 访问将报404

C:

(3)场景三:正则表达式配置去访问(这正则表达式必须是整数,若出现负数将会出现404

设置这个配置,我们只需要在yml文件配置即可

- 

1d8b75c9ba1b22d64605ce3d84db2623.png

重启程序访问:自动切换

C:

输入负数,报错出现404

C:

5a141f5c971f1bcddefd7dfcb6d4a38a.png

c787ff1195d29d02411bc504c34515cb.png
总结配置

5、GateWay的Filter

(1)是什么?

d7c996ea54e5ee16fa4b4368d9c82c73.png

官网:

https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#gatewayfilter-factories

c12353125d7412202f3097b6aed6e95c.png

官网:Spring Cloud Gateway

5623e34b30123b8e1fe5240693d0e33d.png

(2)常用的GatewayFilter

820af0a49d1315ae2c40ba5551bacfc3.png

自定义过滤器(自定义全局GlobalFilter)

两个主要接口介绍:implments GlobalFilter,OrderId

能干嘛?

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

案例代码

(1)实现implments GlobalFilter,OrderId接口

cloud2020cloud-gateway-gateway9527srcmainjavacomstudyspringcloudfilterMyLogGateWayFilter.java
package 

(2)启动测试访问:http://localhost:9527/payment/lb?uname=z3

知乎视频​www.zhihu.com

控制台打印输出信息:

02be8aad40664b8bd11abda42ed40049.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值