溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何實(shí)現(xiàn)spring cloud getway路由配置

發(fā)布時間:2021-10-12 10:01:51 來源:億速云 閱讀:311 作者:iii 欄目:編程語言

這篇文章主要介紹“如何實(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.添加啟動類

如何實(shí)現(xiàn)spring cloud getway路由配置

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ù)報錯如下:

如何實(shí)現(xiàn)spring cloud getway路由配置

這個錯誤是因?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

如何實(shí)現(xiàn)spring cloud getway路由配置

重寫轉(zhuǎn)發(fā)路徑

在SpringCloud Gateway中,路由轉(zhuǎn)發(fā)是直接將匹配的路由path直接拼接到映射路徑(URI)之后,那
么在微服務(wù)開發(fā)中往往沒有那么便利。這里就可以通過RewritePath機(jī)制來進(jìn)行路徑重寫。
(1) 案例改造
修改 application.yml ,將匹配路徑改為 /product-service/**

如何實(shí)現(xiàn)spring cloud getway路由配置

重新啟動網(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

如何實(shí)現(xiàn)spring cloud getway路由配置

                                                                            網(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

如何實(shí)現(xiàn)spring cloud getway路由配置

如果連續(xù)刷新請求就會出現(xiàn)如下界面

如何實(shí)現(xiàn)spring cloud getway路由配置

通過reids的MONITOR可以監(jiān)聽redis的執(zhí)行過程。這時候Redis中會有對應(yīng)的數(shù)據(jù)

如何實(shí)現(xiàn)spring cloud getway路由配置

大括號中就是我們的限流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.修改配置文件:

如何實(shí)現(xiàn)spring cloud getway路由配置

訪問同上,如果訪問頻率過高也是出現(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í)用的文章!

向AI問一下細(xì)節(jié)

免責(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)容。

AI