湖北平臺(tái)網(wǎng)站建設(shè)制作南京seo排名收費(fèi)
為什么需要網(wǎng)關(guān)
網(wǎng)關(guān)功能:
1.身份認(rèn)證和權(quán)限校驗(yàn)
2.服務(wù)路由、負(fù)載均衡
3.請求限流
網(wǎng)關(guān)的技術(shù)實(shí)現(xiàn)
在SpringCloud中網(wǎng)關(guān)的實(shí)現(xiàn)包括兩種:gateway、zuul
Zuul是基于Servlet的實(shí)現(xiàn),屬于阻塞式編程。而SprinaCloudGateway則是基于Spring5中提供的WebFlux,屬于響應(yīng)式編程的實(shí)現(xiàn),具備更好的性能。
搭建網(wǎng)關(guān)服務(wù)
搭建網(wǎng)關(guān)服務(wù)的步驟:
1.創(chuàng)建新的module,引入SpringCloudGateway的依賴和nacos的服務(wù)發(fā)現(xiàn)依賴
2.編寫路由配置及nacos地址
3.訪問相關(guān)接口,端口為網(wǎng)關(guān)設(shè)置端口,發(fā)現(xiàn)都可以調(diào)用,網(wǎng)關(guān)設(shè)置成功
路由斷言工廠Route Predicate Factory
我們在配置文件中寫的斷言規(guī)則只是字符串,這些字符串會(huì)被Predicate Factory讀取并處理,轉(zhuǎn)變?yōu)槁酚膳袛嗟臈l件
例如Path=/user/**是按照路徑匹配,這個(gè)規(guī)則是由org.springframework.cloud.gateway.handlerpredicate.PathRoutePredicateFactory類來處理的
像這樣的斷言工廠在SpringCloudGateway還有十幾個(gè)
Spring提供了11種基本的Predicate工廠:
使用After,訪問orderservice微服務(wù)的請求,2031年后的請求才可以通過
調(diào)用orderservice微服務(wù)的接口,發(fā)現(xiàn)訪問不了了已經(jīng)
改成Before,也就是2031年以前的請求就可以通過
成功訪問
PredicateFactory的作用是什么?
讀取用戶定義的斷言條件,對請求做出判斷
Path=/user/**是什么含義?
路徑是以/user開頭的就認(rèn)為是符合的
路由過濾器 GatewayFilter
GatewayFilter是網(wǎng)關(guān)中提供的一種過濾器,可以對進(jìn)入網(wǎng)關(guān)的請求和微服務(wù)返回的響應(yīng)做處理
過濾器工廠 GatewayFilterFactory
Spring提供了31種不同的路由過濾器工廠。例如:
案例:給所有進(jìn)入userservice的請求添加一個(gè)請求頭
給所有進(jìn)入userservice的請求添加一個(gè)請求頭: Truth=itcastis freaking awesome!
實(shí)現(xiàn)方式:在gateway中修改application.yml文件,給userservice的路由添加過濾器
在userservice的一個(gè)方法中加入獲取到請求頭的一個(gè)參數(shù),并將該參數(shù)打印
調(diào)用該接口,發(fā)現(xiàn)在控制臺(tái)中成功打印出參數(shù),說明請求頭中確實(shí)加入了我們設(shè)置的信息
默認(rèn)過濾器
如果要對所有的路由都生效,則可以將過濾器工廠寫到default下。格式如下
過濾器的作用是什么?
對路由的請求或響應(yīng)做加工處理,比如添加請求頭
配置在路由下的過濾器只對當(dāng)前路由的請求生效
defaultFilters的作用是什么?
對所有路由都生效的過濾器
全局過濾器 GlobalFilter
全局過濾器的作用也是處理一切進(jìn)入網(wǎng)關(guān)的請求和微服務(wù)響應(yīng),與GatewayFilter的作用一樣區(qū)別在于GatewayFilter通過配置定義,處理邏輯是固定的。而GlobalFilter的邏輯需要自己寫代碼實(shí)現(xiàn)。定義方式是實(shí)現(xiàn)GlobalFilter接口。
案例:定義全局過濾器,攔截并判斷用戶身份
需求:定義全局過濾器,攔截請求,判斷請求的參數(shù)是否滿足下面條件:
?參數(shù)中是否有authorization
authorization參數(shù)值是否為admin
如果同時(shí)滿足則放行,否則攔截
調(diào)用該接口并攜帶響應(yīng)參數(shù),發(fā)現(xiàn)可以調(diào)用
參數(shù)攜帶錯(cuò)誤,發(fā)現(xiàn)調(diào)用不了
全局過濾器的作用是什么?
對所有路由都生效的過濾器,并且可以自定義處理邏輯
實(shí)現(xiàn)全局過濾器的步驟?
實(shí)現(xiàn)GlobalFilter接口
添加@Order注解或?qū)崿F(xiàn)Ordered接口
編寫處理邏輯
過濾器執(zhí)行順序
請求進(jìn)入網(wǎng)關(guān)會(huì)碰到三類過濾器: 當(dāng)前路由的過濾器、DefaultFilter、GlobalFilter
請求路由后,會(huì)將當(dāng)前路由過濾器和DefaultFilter、GlobalFilter,合并到一個(gè)過濾器鏈(集合)中,排序后依次執(zhí)行每個(gè)過濾器
每一個(gè)過濾器都必須指定一個(gè)int類型的order值,order值越小,優(yōu)先級(jí)越高,執(zhí)行順序越靠前
GlobalFilter通過實(shí)現(xiàn)Ordered接口,或者添加@Order注解來指定order值,由我們自己指定
路由過濾器和defaultFilter的order由Spring指定,默認(rèn)是按照聲明順序從1遞增
當(dāng)過濾器的order值一樣時(shí),會(huì)按照 defaultFilter >路由過濾器>GlobalFilter的順序執(zhí)行
路由過濾器、defaultFilter、全局過濾器的執(zhí)行順序?
?order值越小,優(yōu)先級(jí)越高
當(dāng)order值一樣時(shí),順序是defaultFilter最先,然后是局部的路由過濾器,最后是全局過濾器