SpringCloud之微服務(wù)網(wǎng)關(guān)的入門(mén)與進(jìn)階(請(qǐng)求過(guò)濾、網(wǎng)關(guān)限流)_第1頁(yè)
SpringCloud之微服務(wù)網(wǎng)關(guān)的入門(mén)與進(jìn)階(請(qǐng)求過(guò)濾、網(wǎng)關(guān)限流)_第2頁(yè)
SpringCloud之微服務(wù)網(wǎng)關(guān)的入門(mén)與進(jìn)階(請(qǐng)求過(guò)濾、網(wǎng)關(guān)限流)_第3頁(yè)
SpringCloud之微服務(wù)網(wǎng)關(guān)的入門(mén)與進(jìn)階(請(qǐng)求過(guò)濾、網(wǎng)關(guān)限流)_第4頁(yè)
SpringCloud之微服務(wù)網(wǎng)關(guān)的入門(mén)與進(jìn)階(請(qǐng)求過(guò)濾、網(wǎng)關(guān)限流)_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

SpringCloud之微服務(wù)?關(guān)的?門(mén)與進(jìn)階(請(qǐng)求過(guò)濾、?關(guān)限流)(?)什么是微服務(wù)?關(guān)后端寫(xiě)完所有的微服務(wù)之后,最終是要交給前端去調(diào)?。我們都知道每個(gè)微服務(wù)都有各?的端?號(hào),如果前端直接通過(guò)IP加端?的?式去調(diào)?微服務(wù)會(huì)很?煩。如果想對(duì)請(qǐng)求增加限制也會(huì)變得?分困難。這個(gè)時(shí)候微服務(wù)?關(guān)就出現(xiàn)了。微服務(wù)?關(guān)?成為API?關(guān),它是系統(tǒng)對(duì)外的唯???。APl?關(guān)封裝了系統(tǒng)內(nèi)部架構(gòu),為每個(gè)客戶端提供?個(gè)定制的APl。API?關(guān)?式的核?要點(diǎn)是,所有的客戶端和消費(fèi)端都通過(guò)統(tǒng)?的?關(guān)接?微服務(wù),在?關(guān)層處理所有的?業(yè)務(wù)功能。通常,?關(guān)也是提供REST/HTTP的訪問(wèn)API。服務(wù)端通過(guò)API-GW注冊(cè)和管理服務(wù)。聽(tīng)起來(lái)有些抽象,?就做?張圖給?家展??下:前端的請(qǐng)求統(tǒng)?由微服務(wù)?關(guān)進(jìn)?管理,微服務(wù)?關(guān)可以調(diào)?各個(gè)微服務(wù),同時(shí)??還有多種功能。API?關(guān)的職責(zé)有?份驗(yàn)證、監(jiān)控、負(fù)載均衡、緩存、請(qǐng)求分?與管理、靜態(tài)響應(yīng)處理,最重要的功能是和外界聯(lián)系。常見(jiàn)的API?關(guān)實(shí)現(xiàn)?式有Zuul,traefix,SpringCloudGateway等等。?前主流的微服務(wù)?關(guān)是SpringCloudGateway。(?)SpringCloudGateway?關(guān)SpringCloudGateway是Spring官?基于Spring5.0,SpringBoot2.0和ProjectReactor等技術(shù)開(kāi)發(fā)的?關(guān),旨在為微服務(wù)架構(gòu)提供?種簡(jiǎn)單?有效的統(tǒng)?的API路由管理?式,統(tǒng)?訪問(wèn)接?。SpringCloudGateway作為SpringCloud?態(tài)系中的?關(guān),?標(biāo)是替代NetflixZUUL,其不僅提供統(tǒng)?的路由?式,并且基于Filter鏈的?式提供了?關(guān)基本的功能,例如:安全,監(jiān)控/埋點(diǎn),和限流等。它是基于Nttey的響應(yīng)式開(kāi)發(fā)模式。2.1核?概念:路由(route):路由是?關(guān)最基礎(chǔ)的部分,路由信息由?個(gè)ID,?個(gè)?的URL,?組斷???和?組Filter組成。斷?(predicates):java8中的斷?函數(shù),SpringCloudGateway中的斷?函數(shù)允許開(kāi)發(fā)者去定義匹配來(lái)?HttpRequest中的任何信息。當(dāng)斷?為真時(shí),則匹配路由。過(guò)濾器(filter):對(duì)請(qǐng)求和響應(yīng)進(jìn)?過(guò)濾?通過(guò)實(shí)踐來(lái)操作微服務(wù)?關(guān)。2.2搭建環(huán)境:所使?的項(xiàng)?依舊基于之前博客所寫(xiě)的項(xiàng)?,源碼放在?末。為了?便理解,所?的模塊只有三個(gè):創(chuàng)建?程導(dǎo)?依賴創(chuàng)建api_gateway_server?程,在?程中的pom.xml中導(dǎo)?依賴<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--eureka,之后會(huì)?到--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>配置啟動(dòng)類創(chuàng)建GatewayApplication類@SpringBootApplicationpublicclassGatewayApplication{publicstaticvoidmain(String[]args){SpringApplication.run(GatewayApplication.class);}}編寫(xiě)配置?件#設(shè)置端?為9090server:port:9090#eureka配置eureka:client:service-url:defaultZone:http://localhost:9000/eureka/instance:prefer-ip-address:truespring:application:name:api-gateway-server#配置SpringCloudGateway的路由cloud:gateway:routes:-id:user-service#id是?定義的標(biāo)識(shí)uri::9001#當(dāng)訪問(wèn)9090端?時(shí),?動(dòng)把ip和端?替換為此uripredicates:-Path=/user/**#?動(dòng)匹配/user/**的路徑?個(gè)?錯(cuò)誤:springcloudgateway的內(nèi)部是通過(guò)netty+webflux實(shí)現(xiàn),webflux實(shí)現(xiàn)和springmvc存在沖突,因此修改整個(gè)項(xiàng)?的?類依賴將springmvc的依賴放到需要的module上,將依賴從?依賴中刪除2.3路由配置詳解路由斷?中有許多匹配規(guī)則,之前只介紹了Path,其實(shí)還有許多匹配規(guī)則predicates:-After=XXX#路由斷?之后匹配-Before=XXX#路由斷?之前匹配-Between=XXX,XXX#路由斷?之間-Cookie=XXX#路由斷?Cookie匹配,匹配給定名稱(如master)和正則表達(dá)式(如ma.r)-Header=XXX#根據(jù)請(qǐng)求頭信息匹配-Host=**.#根據(jù)host地址匹配-Method=GET#根據(jù)請(qǐng)求?法匹配-Path=***#路由斷?匹配-Query=baz#路由斷?Query匹配-RemoteAddr=192.168.1.1/24#根據(jù)遠(yuǎn)程路徑匹配定義請(qǐng)求路徑時(shí),我們還可以據(jù)微服務(wù)名稱拉取請(qǐng)求路徑,下?是兩種不同?法定義uri,實(shí)現(xiàn)同樣的功能。#uri::9001#當(dāng)訪問(wèn)9090端?時(shí),?動(dòng)把ip和端?替換為此uriuri:lb://userservice#根據(jù)微服務(wù)名稱拉取請(qǐng)求路徑discovery:locator:enabled:true#開(kāi)啟根據(jù)微服務(wù)名稱?動(dòng)轉(zhuǎn)發(fā)lower-case-service-id:true#w微服務(wù)名稱?寫(xiě)呈現(xiàn)總體的配置如圖2.4SpringCloudGateway過(guò)濾器SpringCloudGateway除了具有請(qǐng)求路由功能之外,也?持對(duì)請(qǐng)求的過(guò)濾。?命周期:過(guò)濾器有兩種?命周期,PRE和POST:PRE:這種過(guò)濾器在請(qǐng)求被路由之前調(diào)?。我們可利?這種過(guò)濾器實(shí)現(xiàn)?份驗(yàn)證、在集群中選擇請(qǐng)求的微服務(wù)、記錄調(diào)試信息等。POST:這種過(guò)濾器在路由到微服務(wù)以后執(zhí)?。這種過(guò)濾器可?來(lái)為響應(yīng)添加標(biāo)準(zhǔn)的HTTPHeader、收集統(tǒng)計(jì)信息和指標(biāo)、將響應(yīng)從微服務(wù)發(fā)送給客戶端等。過(guò)濾器類型:GatewayFilter:應(yīng)?到單個(gè)路由或者?個(gè)分組的路由上GlobalFilter:應(yīng)?到所有的路由上局部過(guò)濾器可以使?SpringCloudGateway內(nèi)置的?法,在這?不做過(guò)多解釋。這?主要介紹如何?定義全局過(guò)濾器過(guò)濾器實(shí)踐:創(chuàng)建?個(gè)Filter包,在包下新建GatewayFilter類,?定義全局過(guò)濾器需要繼承GlobalFilter,Ordered接?,并重寫(xiě)接?的兩個(gè)?法@ComponentpublicclassGatewayFilterimplementsGlobalFilter,Ordered{//在??寫(xiě)過(guò)濾器的邏輯@OverridepublicMono<Void>filter(ServerWebExchangeexchange,GatewayFilterChainchain){System.out.println("進(jìn)了過(guò)濾器");//表?繼續(xù)向下執(zhí)?returnchain.filter(exchange);}//過(guò)濾器的優(yōu)先級(jí),數(shù)值越?,優(yōu)先級(jí)越?@OverridepublicintgetOrder(){return0;}}通過(guò)訪問(wèn)可以看到控制臺(tái)上出現(xiàn)了打印的信息。模擬?戶認(rèn)證過(guò)程:全局過(guò)濾器可以實(shí)現(xiàn)對(duì)全局的?戶驗(yàn)證。修改gatewayFilter,編寫(xiě)失敗的邏輯,如果獲取到的request請(qǐng)求中第?個(gè)屬性不是access-token或?yàn)榭?,則返回HttpStatus.UNAUTHORIZED的報(bào)錯(cuò)@ComponentpublicclassGatewayFilterimplementsGlobalFilter,Ordered{//在??寫(xiě)過(guò)濾器的邏輯@OverridepublicMono<Void>filter(ServerWebExchangeexchange,GatewayFilterChainchain){System.out.println("進(jìn)?了過(guò)濾器");Stringtoken=exchange.getRequest().getQueryParams().getFirst("access-token");if(token==null){//如果不存在,認(rèn)證失敗System.out.println("沒(méi)有登陸");exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);returnexchange.getResponse().setComplete();}returnchain.filter(exchange);}//過(guò)濾器的優(yōu)先級(jí),數(shù)值越?,優(yōu)先級(jí)越?@OverridepublicintgetOrder(){return0;}}(三)?關(guān)限流在實(shí)際環(huán)境中會(huì)遇到這樣的問(wèn)題,同?時(shí)間會(huì)有許多請(qǐng)求去調(diào)?微服務(wù),?量請(qǐng)求的進(jìn)?很有可能導(dǎo)致微服務(wù)被破環(huán),因此限流就變得很重要。3.1常見(jiàn)的?些限流算法:計(jì)數(shù)器算法:設(shè)定?個(gè)單位時(shí)間內(nèi)的計(jì)數(shù)值,如果單位時(shí)間內(nèi)訪問(wèn)的請(qǐng)求?于這個(gè)設(shè)定的值,則之后的請(qǐng)求都拒絕。直到單位時(shí)間內(nèi)的值低于這個(gè)值才繼續(xù)接收。漏桶算法:我們可以把漏桶算法想象成?個(gè)漏?。請(qǐng)求進(jìn)來(lái)時(shí)先到漏?中,然后按設(shè)定好的輸出速率分配到微服務(wù)上。當(dāng)?下?有很多請(qǐng)求進(jìn)來(lái)時(shí),只能在漏?上等著。為了控制流量,需要設(shè)置兩個(gè)變量:?個(gè)是桶的??,另?個(gè)是漏?流出的速率。令牌桶算法:令牌桶算法是對(duì)漏桶算法的?種改進(jìn),相?于漏桶算法,令牌桶算法能允許?定程度的突發(fā)調(diào)?。令牌桶算法的原理:在令牌桶算法中,存在?個(gè)桶,?來(lái)存放固定數(shù)量的令牌,令牌會(huì)以?定速率放到桶中,桶中的令牌滿了之后就不會(huì)再放令牌。當(dāng)?個(gè)請(qǐng)求來(lái)臨時(shí),要先在令牌桶中拿到?個(gè)令牌,才能去調(diào)?微服務(wù),當(dāng)令牌桶中沒(méi)有令牌的時(shí)候,后來(lái)到的請(qǐng)求就需要等待。令牌桶算法除了可以限流,還允許?定程度的突發(fā)調(diào)?:?如?個(gè)令牌桶的容量是100,在沒(méi)有請(qǐng)求的時(shí)候,令牌桶中的令牌數(shù)量是滿的。此時(shí)如果突然來(lái)了100個(gè)請(qǐng)求,那么這100個(gè)請(qǐng)求都能被?刻執(zhí)?。3.2基于Filter的限流實(shí)踐SpringCloudGateway官?就提供了基于令牌桶的限流?持,基于其內(nèi)置的過(guò)濾器??RequestRateLimiterGatewayFilterFactory實(shí)現(xiàn)。在過(guò)濾器??中是通過(guò)Redis和lua腳本結(jié)合的?式進(jìn)?流量控制。所以我們可以通過(guò)配置redis,在redis中看到運(yùn)?的情況。環(huán)境搭建:?先還是引?相關(guān)依賴:<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId></dependency>修改配置?件:整段配置?件如下:server:port:9090spring:application:name:api-gateway-server#配置redis的參數(shù)redis:host:localhostport:6379#配置SpringCloudGateway的路由cloud:gateway:routes:-id:user-service#id是?定義的標(biāo)識(shí)#uri::9001#當(dāng)訪問(wèn)9090端?時(shí),?動(dòng)把ip和端?替換為此uriuri:lb://userservice#根據(jù)微服務(wù)名稱拉取請(qǐng)求路徑predicates:-Path=/user/**#?動(dòng)匹配/user/**的路徑filters:-name:RequestRateLimiterargs:#使?SpEL從Spring容器中獲取對(duì)象key-resolver:'#{@pathKeyResolver}'#令牌桶每秒填充的平均速率redis-rate-limiter.replenishRate:1#令牌桶的容量redis-rate-limiter.burstCapacity:3discovery:locator:enabled:true#開(kāi)啟根據(jù)微服務(wù)名稱?動(dòng)轉(zhuǎn)發(fā)lower-case-service-id:true#w微服務(wù)名稱?寫(xiě)呈現(xiàn)eureka:client:service-url:defaultZone:http://localhost:9000/eureka/instance:prefer-ip-address:true這?需要注意的是第19?開(kāi)始的過(guò)濾器配置,?先要從Spring容器中獲取對(duì)象,這個(gè)對(duì)象我們接下來(lái)會(huì)去創(chuàng)建。其次就是設(shè)置令牌桶的填充速率和容量。為了?便觀察我設(shè)置的?較?。配置KeyResolver為了達(dá)到不同的限流效果和規(guī)則,可以通過(guò)實(shí)現(xiàn)KeyResolver接?,定義不同請(qǐng)求類型的限流鍵。新建KeyResolverConfiguration類:這?僅僅實(shí)現(xiàn)基于路徑的限流,即同?路徑請(qǐng)求超過(guò)令牌桶的限制就會(huì)報(bào)錯(cuò)。@ComponentpublicclassKeyResolverConfiguration{/**基于請(qǐng)求路徑的限流*/@BeanpublicKeyResolverpathKeyResolver(){//lambda表達(dá)式returnexchange->Mono.just(exchange.getRequest().getPath().toString());//////////////普通的java寫(xiě)法returnnewKeyResolver(){@Overridepublic

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論