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