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

下載本文檔

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

文檔簡介

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

溫馨提示

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

評論

0/150

提交評論