您好,登錄后才能下訂單哦!
這篇文章主要介紹“如何實(shí)現(xiàn)spring cloud getway路由配置”,在日常操作中,相信很多人在如何實(shí)現(xiàn)spring cloud getway路由配置問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何實(shí)現(xiàn)spring cloud getway路由配置”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
1.創(chuàng)建工程getway-server
2.添加pom依賴:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId></dependency>
3.添加啟動類
4.添加配置文件:
#端口server: port: 8080#服務(wù)名稱spring: application:name: getway-service cloud:gateway: routes: - id: product-service uri: lb://product-service #根據(jù)服務(wù)名稱從注冊中心拉取服務(wù)請求路徑 predicates: - Path=/product/**
id:我們自定義的路由 ID,保持唯一
uri:目標(biāo)服務(wù)地址
predicates:路由條件,Predicate 接受一個輸入?yún)?shù),返回一個布爾值結(jié)果。該接口包含多種默
認(rèn)方法來將 Predicate 組合成其他復(fù)雜的邏輯(比如:與,或,非)
5.啟動getway服務(wù)報錯如下:
這個錯誤是因?yàn)間etway內(nèi)部是通過netty + webflux實(shí)現(xiàn),webflux實(shí)現(xiàn)和springmvc沖突
解決辦法:將父工程配置的如下依賴添加到需要的工程中:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency>
對應(yīng)在product和order服務(wù)中添加依賴,再次啟動getway服務(wù)就成功了。
訪問 http://localhost:8080/product/1
重寫轉(zhuǎn)發(fā)路徑
在SpringCloud Gateway中,路由轉(zhuǎn)發(fā)是直接將匹配的路由path直接拼接到映射路徑(URI)之后,那
么在微服務(wù)開發(fā)中往往沒有那么便利。這里就可以通過RewritePath機(jī)制來進(jìn)行路徑重寫。
(1) 案例改造
修改 application.yml ,將匹配路徑改為 /product-service/**
重新啟動網(wǎng)關(guān),我們在瀏覽器訪問http://127.0.0.1:8080/product-service/product/1,會拋出404。這
是由于路由轉(zhuǎn)發(fā)規(guī)則默認(rèn)轉(zhuǎn)發(fā)到商品微服務(wù)( http://127.0.0.1:9002/productservice/product/1 )路徑上,而商品微服務(wù)又沒有 product-service 對應(yīng)的映射配置。
(2) 添加RewritePath重寫轉(zhuǎn)發(fā)路徑
修改 application.yml ,添加重寫規(guī)則
#服務(wù)名稱spring: application:name: getway-service cloud:gateway: routes: - id: product-service# uri: http://127.0.0.1:9001 uri: lb://product-service #根據(jù)服務(wù)名稱從注冊中心拉取服務(wù)請求路徑 predicates:# - Path=/product/** - Path=/product-service/**filters: - RewritePath=/product-service/(?<segment>.*), /$\{segment}#根據(jù)服務(wù)名稱配置路由轉(zhuǎn)發(fā) discovery: locator:enabled: true #開啟服務(wù)名稱自動轉(zhuǎn)發(fā) lower-case-service-id: true #名稱小寫形式
通過RewritePath配置重寫轉(zhuǎn)發(fā)的url,將/product-service/(?.*),重寫為{segment},然后轉(zhuǎn)發(fā)到訂單
微服務(wù)。比如在網(wǎng)頁上請求http://localhost:8080/product-service/product,此時會將請求轉(zhuǎn)發(fā)到htt
p://127.0.0.1:9002/product/1
網(wǎng)關(guān)限流
1.pom文件添加如下依賴:
<!--redis的依賴--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis-reactive</artifactId></dependency><!--監(jiān)控依賴--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId></dependency> 2.修改配置文件
server: port: 8080 #端口spring: application:name: gateway-service #服務(wù)名稱 redis:host: localhostpool: 6379database: 0 cloud: #配置SpringCloudGateway的路由 gateway: routes: - id: order-serviceuri: lb://order-servicepredicates: - Path=/order-service/**filters: - RewritePath=/order-service/(?<segment>.*), /$\{segment} - id: product-serviceuri: lb://product-servicepredicates: - Path=/product-service/**filters: - name: RequestRateLimiter args:# # 使用SpEL從容器中獲取對象 key-resolver: '#{@pathKeyResolver}'# # 令牌桶每秒填充平均速率 redis-rate-limiter.replenishRate: 1# # 令牌桶的上限 redis-rate-limiter.burstCapacity: 3 - RewritePath=/product-service/(?<segment>.*), /$\{segment}
3.新建KeyResolverConfiguration類
@Configurationpublic class KeyResolverConfiguration {/** * 請求路徑的限流規(guī)則 * @return */ @Bean public KeyResolver pathKeyResolver() {return new KeyResolver(){public Mono<String> resolve(ServerWebExchange exchange) {return Mono.just(exchange.getRequest().getPath().toString()); } }; } }
訪問 http://localhost:8080/product-service/product/1
如果連續(xù)刷新請求就會出現(xiàn)如下界面
通過reids的MONITOR可以監(jiān)聽redis的執(zhí)行過程。這時候Redis中會有對應(yīng)的數(shù)據(jù)
大括號中就是我們的限流Key,這邊是IP,本地的就是localhost
timestamp:存儲的是當(dāng)前時間的秒數(shù),也就是System.currentTimeMillis() / 1000或者
Instant.now().getEpochSecond()
tokens:存儲的是當(dāng)前這秒鐘的對應(yīng)的可用的令牌數(shù)量
根據(jù)參數(shù)限流
1.在KeyResolverConfiguration類中添加如下代碼
/** * 請求參數(shù)限流 * @return */@Beanpublic KeyResolver userKeyResolver() {return exchange -> Mono.just( exchange.getRequest().getQueryParams().getFirst("userId")//exchange.getRequest().getHeaders().getFirst("X-Forwarded-For") 基于請求ip的限流 );}
2.修改配置文件:
訪問同上,如果訪問頻率過高也是出現(xiàn)同樣的效果
訪問地址: http://localhost:8080/product-service/product/1?userId=1
需要帶上參數(shù)。
到此,關(guān)于“如何實(shí)現(xiàn)spring cloud getway路由配置”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。