gateway sentinel 熔断 不起作用_微服务Gateway新一代网关
上篇:
https://zhuanlan.zhihu.com/p/183930681?zhuanlan.zhihu.com一、概述簡(jiǎn)介
1、官網(wǎng)
上一代zuul 1.x:Netflix/zuul
當(dāng)前gateway:
官網(wǎng) :https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/
官網(wǎng)趴下了的重點(diǎn):
(1)Spring Cloud Gateway是基于Spring Boot 2.x,Spring WebFlux和Project Reactor 構(gòu)建的。結(jié)果,當(dāng)您使用Spring Cloud Gateway時(shí),許多您熟悉的同步庫(kù)(例如,Spring Data和Spring Security)和模式可能不適用。如果您對(duì)這些項(xiàng)目不熟悉,建議您在使用Spring Cloud Gateway之前先閱讀它們的文檔以熟悉一些新概念。Spring Boot 2.xSpring Cloud Gateway是基于Spring Boot 2.x,Spring WebFlux和Project Reactor 構(gòu)建的。結(jié)果,當(dāng)您使用Spring Cloud Gateway時(shí),許多您熟悉的同步庫(kù)(例如,Spring Data和Spring Security)和模式可能不適用。如果您對(duì)這些項(xiàng)目不熟悉,建議您在使用Spring Cloud Gateway之前先閱讀它們的文檔以熟悉一些新概念。Spring WebFluxSpring Cloud Gateway是基于Spring Boot 2.x,Spring WebFlux和Project Reactor 構(gòu)建的。結(jié)果,當(dāng)您使用Spring Cloud Gateway時(shí),許多您熟悉的同步庫(kù)(例如,Spring Data和Spring Security)和模式可能不適用。如果您對(duì)這些項(xiàng)目不熟悉,建議您在使用Spring Cloud Gateway之前先閱讀它們的文檔以熟悉一些新概念。Project Reactor 構(gòu)建的Spring Cloud Gateway是基于Spring Boot 2.x,Spring WebFlux和Project Reactor 構(gòu)建的。結(jié)果,當(dāng)您使用Spring Cloud Gateway時(shí),許多您熟悉的同步庫(kù)(例如,Spring Data和Spring Security)和模式可能不適用。如果您對(duì)這些項(xiàng)目不熟悉,建議您在使用Spring Cloud Gateway之前先閱讀它們的文檔以熟悉一些新概念。(2)Spring Cloud Gateway需要Spring Boot和Spring Webflux提供的Netty運(yùn)行時(shí)。它不能在傳統(tǒng)的Servlet容器中或作為WAR構(gòu)建時(shí)使用。
2、是什么?
(1)概述
Spring Cloud 全家桶中有個(gè)很重要的組件就是網(wǎng)關(guān),在1.x版本中都是采用的Zuul網(wǎng)關(guān);但是在2.x版本中,zuul的升級(jí)一直跳票,Spring Cloud最后自己研發(fā)一個(gè)網(wǎng)關(guān)替代了Zuul,那就是Spring Cloud Gateway,一句話:gateway是原zuul1.版的替代Gateway是在spring生態(tài)系統(tǒng)之上構(gòu)建的Api網(wǎng)關(guān)服務(wù),基于Spring5,SpringBoot2.和Project Reactor等技術(shù)。Gateway旨在提供一種簡(jiǎn)單而有效的方式來(lái)對(duì)API進(jìn)行路由,以及提供一些強(qiáng)大的過(guò)濾器功能,例如:熔斷、限流、重試等
網(wǎng)站:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/
Spring Cloud Gateway是Spring Cloud的一個(gè)全新項(xiàng)目,基于Spring5.0+SpringBoot2.x和Project Reactor等技術(shù)開(kāi)發(fā)的網(wǎng)關(guān),它旨在為微服務(wù)框架提供一種簡(jiǎn)單有效的統(tǒng)一的API路由管理方式。Spring Cloud Gateway作為Spring Cloud生態(tài)系統(tǒng)中的網(wǎng)關(guān),目標(biāo)是替代Zuul,在Spring Cloud以上2.x以上的版本中,沒(méi)有對(duì)新版本的Zuul2.x以上最新高性能版本進(jìn)行集成,仍然還是使用的Zuul.x非Reactor模式的老版本。而是為了提升網(wǎng)關(guān)性能,Spring Cloud Gateway是基于WebFlux框架實(shí)現(xiàn)的,而WebFlux框架底層使用了高性能的Reactor模式通框架Netty。
Spring Cloud Gateway目前提供統(tǒng)一的路由方式且基于Filter鏈的方式提供了網(wǎng)關(guān)基本的功能,例如:安全、監(jiān)控/指標(biāo)、和限流等
一句話:
SpringCloud Gateway使用的是Webflux中的reactor-netty響應(yīng)式編程組件,底層使用了Netty通訊框架源碼架構(gòu)
3、能干嘛
- 反向代理
- 鑒權(quán)
- 流量控制
- 熔斷
- 日志監(jiān)控
4、微服務(wù)架構(gòu)中網(wǎng)關(guān)在哪里
5、有Zuull了怎么又出來(lái)gateway(_GateWay非阻塞異步模型)
我們?yōu)槭裁催x擇Gateway?
(1)netflix不太靠譜,zuul2.0一直跳票,遲遲不發(fā)布
一方面zuul1.0已經(jīng)進(jìn)入了維護(hù)階段,而且Gateway是SpringCloud團(tuán)隊(duì)研發(fā)的,是親兒子產(chǎn)品,值得信賴Gateway是基于異步非阻塞模型上進(jìn)行開(kāi)發(fā)的,性能方面不需要擔(dān)心,雖然Netfilx早在發(fā)布了最新的zuul2.x,但是SpringCloud貌似沒(méi)有整合計(jì)劃。而且Netfilx相關(guān)的組件進(jìn)入維護(hù)期;不知前景如何?
多方面綜合考慮Gateway是很理想的網(wǎng)關(guān)選擇
(2)SpringCloud Gateway具有如下特性
基于Spring Framework5,Project Reactor和SpringBoot2.x進(jìn)行構(gòu)建動(dòng)態(tài)路由:能夠匹配任何請(qǐng)求屬性;
可以對(duì)路由指定Project (斷言)和Filter(過(guò)濾器)
集成Hystrix的斷路器功能;
集成Spring Cloud服務(wù)發(fā)現(xiàn)功能;
易于編寫(xiě)Project (斷言)和Filter(過(guò)濾器)
請(qǐng)求限流功能;
支持路徑重寫(xiě)
(3)SpringCloud Gateway與Zuul的區(qū)別?
在Spring Cloud Fincheley正式版之前,Spring Cloud推薦的網(wǎng)關(guān)是Netfile提供了Zuul;1、Zuul1.x,是一個(gè)基于阻塞I/O的API Gateway
2、Zuul1.x基于Servlet2.5使用阻塞架構(gòu),它不支持任何長(zhǎng)連接(如:WebSocket)Zuul的設(shè)計(jì)和Nginx較像,每次I/O操作都是從工作線程中選擇一個(gè)執(zhí)行,請(qǐng)求線程被阻塞到工作線程完成,但是差別Nginx是用C++實(shí)現(xiàn),Zuul用java實(shí)現(xiàn),而JVM本身會(huì)有第一次加載較慢的情況,使得Zuul的性能相對(duì)較差。
3、Zuul2.x理念更先進(jìn),想基于Netty非阻塞和支持長(zhǎng)連接,但SpringCloud目前還沒(méi)有整合。Zuul2.x的性能較Zuul1.x較大的提升。 在性能方面,根據(jù)官方提供基準(zhǔn)測(cè)試,Spring Cloud Gateway的RPS(每秒請(qǐng)求數(shù))是Zuul的1.6倍
4、Spring Cloud Gateway建立在Spring Framework5、Project Reactor和SpringBoot2.x之上,使用非阻塞API。
5、Spring Cloud Gateway還支持WebSocket,并且與Spring緊密集成擁有更好的開(kāi)發(fā)體驗(yàn)。
Zuul1.x模型
Spring Cloud 中所集成的Zuul版本,采用Tomcat容器,使用的是傳統(tǒng)是Servlet IO處理模型。由于Servlet生命周期:是由Servlet container進(jìn)行生命周期管理。
container啟動(dòng)時(shí)構(gòu)造servlet對(duì)象并調(diào)用servlet init() 進(jìn)行初始化;
container運(yùn)行時(shí)接受請(qǐng)求,并為每個(gè)請(qǐng)求分配一個(gè)線程(一般從線程池中獲取空閑線程 ),然后調(diào)用servlet()。
container關(guān)閉時(shí)調(diào)用servlet destory() 銷毀servlet。
上述模式的缺點(diǎn):
servlet是一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)IO模型,當(dāng)請(qǐng)求進(jìn)入Servlet container時(shí),Servlet container就會(huì)為其綁定一個(gè)線程,在并發(fā)不高的場(chǎng)景下,這種模型是適用的。但是一旦高并發(fā)(比如抽風(fēng)用jemeter壓),線程數(shù)量就會(huì)上漲,而線程線程資源代價(jià)是昂貴的(上線文切換,內(nèi)存消耗)嚴(yán)重影響請(qǐng)求的處理時(shí)間。 一些簡(jiǎn)單的業(yè)務(wù)場(chǎng)景下,不希望為每個(gè)request分配一個(gè)線程,只需要1個(gè)或幾個(gè)線程就能對(duì)極大并發(fā)的請(qǐng)求,這種業(yè)務(wù)場(chǎng)景下,servlet模型沒(méi)有任何優(yōu)勢(shì)。所以,Zuul1.x是基于servlet之上的一個(gè)阻塞式處理模型,即Spring實(shí)現(xiàn)處理所有request請(qǐng)求一個(gè)servlet(DispatcherServlet)并由該Servlet阻塞式處理。
所以,Spring Cloud Zuul無(wú)法擺脫servlet模型的弊端。
Gateway模型
WebFlux是什么?
官網(wǎng):Web on Reactive Stack
說(shuō)明二、三大核心概念
1、Route(路由)
路由是構(gòu)建網(wǎng)關(guān)的基本模塊,它由ID,目標(biāo)URI,一系列的斷言和過(guò)濾器組成,如斷言為true則匹配該路由2、Predicate(斷言)
參考的是Java8的java.util.function.Predicate開(kāi)發(fā)人員可以匹配HTTP請(qǐng)求中的所有內(nèi)容(例如請(qǐng)求頭或請(qǐng)求參數(shù)),如果請(qǐng)求與斷言相匹配則進(jìn)行路由
3、Filter(過(guò)濾)
指的是Spring框架中GatewayFilter的實(shí)例,使用過(guò)濾器,可以在請(qǐng)求被路由前或者之后對(duì)請(qǐng)求進(jìn)行修改.4、總結(jié)
web請(qǐng)求,通過(guò)一些匹配條件,定位到服務(wù)真正的節(jié)點(diǎn)。并在這個(gè)轉(zhuǎn)發(fā)過(guò)程的前后,進(jìn)行一些精細(xì)化控制。predicat就是我們匹配的條件;而filter,就可以理解為一個(gè)無(wú)所不能的攔截器,有了這兩個(gè)元素,再加上目標(biāo)url,就可以實(shí)現(xiàn)一個(gè)具體的路由了
四、Gateway工作流程
1、官網(wǎng)總結(jié)
2、核心邏輯
路由轉(zhuǎn)發(fā)+執(zhí)行過(guò)濾器鏈五、入門配置
1、Gateway9527搭建
(1)在父工程cloud2020下創(chuàng)建一個(gè)子模塊名為“cloud-gateway-gateway9527”
(2)添加子模塊cloud-gateway-gateway9527的pom文件
cloud2020cloud-gateway-gateway9527pom.xml<?(3)寫(xiě)YML
cloud2020cloud-gateway-gateway9527srcmainresourcesapplication.ymlserver:(4)主啟動(dòng)類
cloud2020cloud-gateway-gateway9527srcmainjavacomstudyspringcloudGateWayMain9527.javapackage9527網(wǎng)關(guān)如何做路由映射呢?
(1)在cloud-gateway-gateway9527微服務(wù)工程下的的yml全局配置文件配置:
cloud2020cloud-gateway-gateway9527srcmainresourcesapplication.ymlspring:說(shuō)明(2)啟動(dòng)微服務(wù)工程(先啟動(dòng)EurekaMain7001、后啟動(dòng)PaymentMain8001、最后啟動(dòng)GateWayMain9527)
(3)測(cè)試
http://eureka7001.com:7001/
添加網(wǎng)關(guān)前:http://localhost:8001/payment/get/31
添加網(wǎng)關(guān)后:http://localhost:9527/payment/get/31
2、Gateway配置路由的兩種方式
若想找微服務(wù)的端口號(hào),可以訪問(wèn):http://localhost:9527/payment/lb
YML配置說(shuō)明(Gateway網(wǎng)關(guān)路由有兩種配置方式)
需求案例:百度國(guó)內(nèi)新聞網(wǎng)站,需要外網(wǎng)(百度新聞--海量中文資訊平臺(tái))
自己寫(xiě)一個(gè):百度新聞、業(yè)務(wù)需求(通過(guò)9527網(wǎng)關(guān)訪問(wèn)到外網(wǎng)的百度新聞網(wǎng)址)
(1)編寫(xiě)路由構(gòu)建器(業(yè)務(wù)類)
cloud2020cloud-gateway-gateway9527srcmainjavacomstudyspringcloudconfigGateWayConfig.javapackage(2)啟動(dòng)微服務(wù)主程序GateWayMain9527
(3)測(cè)試訪問(wèn)外網(wǎng)(路由網(wǎng)關(guān)做映射)
http://localhost:9527/guonei
3、GateWay配置動(dòng)態(tài)路由
默認(rèn)情況下Gatway會(huì)根據(jù)注冊(cè)中心注冊(cè)的服務(wù)列表, 以注冊(cè)中心上微服務(wù)名為路徑創(chuàng)建動(dòng)態(tài)路由進(jìn)行轉(zhuǎn)發(fā),從而實(shí)現(xiàn)動(dòng)態(tài)路由的功能(1)yml配置參數(shù)調(diào)整(以下為例)
cloud2020cloud-gateway-gateway9527srcmainresourcesapplication.ymlspring:(2)啟動(dòng)一個(gè)eureka7001+兩個(gè)服務(wù)提供者8001/8002
(3)測(cè)試:http://localhost:9527/payment/lb (路由自動(dòng)切換)
知乎視頻?www.zhihu.com4、GateWay常用的Predicate
(1)場(chǎng)景:比如項(xiàng)目上線了,出現(xiàn)點(diǎn)問(wèn)題,我們采用路由時(shí)間設(shè)置,不到這個(gè)時(shí)間是無(wú)法訪問(wèn),訪問(wèn)將會(huì)報(bào)錯(cuò),如圖所示:
設(shè)置這個(gè)配置,我們只需要在yml文件配置即可
-當(dāng)時(shí)間到了就可以訪問(wèn)
http://localhost:9527/payment/lb
(2)場(chǎng)景二:采用cookies去訪問(wèn)(前提滿足時(shí)間符合,其次必須帶cookies訪問(wèn))
也是自動(dòng)切換,若不帶cookie 訪問(wèn)將報(bào)404
C:(3)場(chǎng)景三:正則表達(dá)式配置去訪問(wèn)(這正則表達(dá)式必須是整數(shù),若出現(xiàn)負(fù)數(shù)將會(huì)出現(xiàn)404)
設(shè)置這個(gè)配置,我們只需要在yml文件配置即可
-重啟程序訪問(wèn):自動(dòng)切換
C:輸入負(fù)數(shù),報(bào)錯(cuò)出現(xiàn)404
C:總結(jié)配置5、GateWay的Filter
(1)是什么?
官網(wǎng):
https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#gatewayfilter-factories
官網(wǎng):Spring Cloud Gateway
(2)常用的GatewayFilter
自定義過(guò)濾器(自定義全局GlobalFilter)
兩個(gè)主要接口介紹:implments GlobalFilter,OrderId
能干嘛?
全局日志記錄統(tǒng)一網(wǎng)關(guān)鑒權(quán)
案例代碼
(1)實(shí)現(xiàn)implments GlobalFilter,OrderId接口
cloud2020cloud-gateway-gateway9527srcmainjavacomstudyspringcloudfilterMyLogGateWayFilter.javapackage(2)啟動(dòng)測(cè)試訪問(wèn):http://localhost:9527/payment/lb?uname=z3
知乎視頻?www.zhihu.com控制臺(tái)打印輸出信息:
總結(jié)
以上是生活随笔為你收集整理的gateway sentinel 熔断 不起作用_微服务Gateway新一代网关的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使用sprc097的DSP281x_us
- 下一篇: JDK的动态代理深入解析(Proxy,I