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