初探spring-cloud-gateway

引入依賴

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

配置代理地址 

server:
  port: 80
spring:
  application:
    name: spring-cloud-gateway
  cloud:
    gateway:
      routes:
      - id: baidu
        uri: https://www.baidu.com
        predicates:
        - Path=/baidu
        filters:
        #請求路徑截取的功能@value截取幾位
        - StripPrefix=1


當你請求http://localhost/baidu時轉發https://www.baidu.com

 Eureka和Geteway合用

添加eureka依賴

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>1.4.6.RELEASE</version>
            <!--因爲和geteway中web衝突-->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

配置代理服務信息

server:
  port: 80
spring:
  application:
    name: spring-cloud-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
          lower-case-service-id: true
      routes:
      - id: spring-producer
        uri: lb://spring-cloud-producer
        predicates:
        - Path=/spring-producer/**
        filters:
        #請求路徑截取的功能@截取一位
        - StripPrefix=1

當你請求http://localhost/spring-producer/test時轉發http://localhost/spring-cloud-producer/test

附錄:

server:
  port: 8080
eureka:
  client:
    service-url:
  #指定註冊中心的地址,以便使用服務發現功能
      defaultZone: http://localhost:8000/eureka/       
logging:
  level:
  #調整相 gateway 包的 log 級別,以便排查問題
    org.springframework.cloud.gateway: debug          
spring:
  cloud:
    gateway:
     discovery:
        locator:
  #是否與服務註冊於發現組件進行結合,通過 serviceId 轉發到具體的服務實例。默認爲 false,設爲 true 便開啓通過服務中心的自動根據 serviceId 創建路由的功能
         enabled: true
      routes:
  #我們自定義的路由 ID,保持唯一
       - id: cookie_route
   #目標服務地址
         uri: http://baidu.com
   #格式爲:lb://應用註冊服務名
         uri: lb://spring-cloud-producer
 

基於 Filter(過濾器):Spring Cloud Gateway 的 Filter 的生命週期不像 Zuul 的那麼豐富,它只有兩個:“pre” 和 “post”。
PRE: 這種過濾器在請求被路由之前調用。我們可利用這種過濾器實現身份驗證、在集羣中選擇請求的微服務、記錄調試信息等。
POST:這種過濾器在路由到微服務以後執行。這種過濾器可用來爲響應添加標準的 HTTP Header、收集統計信息和指標、將響應從微服務發送給客戶端等
Spring Cloud Gateway 的 Filter 分爲兩種:GatewayFilter 與 GlobalFilter。GlobalFilter 會應用到所有的路由上,而 GatewayFilter 將應用到單個路由或者一個分組的路由上

 
 
 
 
        filters:                         
  #AddRequestParameter 這樣就會給匹配的每個請求添加上foo=bar的參數和值;證明網關在轉發的過程中已經通過 filter 添加了設置的參數和值。
         - AddRequestParameter=foo, bar
  #StripPrefix Filter StripPrefix Filter 是一個請求路徑截取的功能,我們可以利用這個功能來做特殊業務的轉發;
這個配置的例子表示,當請求路徑匹配到/name/**會將包含name和後邊的字符串接去掉轉發, StripPrefix=2就代表截取路徑的個數,這樣配置後當請求/name/bar/foo後端匹配到的請求路徑就會變成http://www.baidu.com/foo
 
 
         - StripPrefix=2
  #PrefixPath Filter 的作用和 StripPrefix 正相反,是在 URL 路徑前面添加一部分的前綴
         - PrefixPath=/mypath
  #限速路由器 限速在高併發場景中比較常用的手段之一,可以有效的保障服務的整體穩定性,Spring Cloud Gateway 提供了基於 Redis 的限流方案。所以我們首先需要添加對應的依賴包spring-boot-starter-data-redis-reactive
filter 名稱必須是 RequestRateLimiter
redis-rate-limiter.replenishRate:允許用戶每秒處理多少個請求
redis-rate-limiter.burstCapacity:令牌桶的容量,允許在一秒鐘內完成的最大請求數
key-resolver:使用 SpEL 按名稱引用 bean
根據請求參數中的 user 字段來限流
@Bean KeyResolver userKeyResolver()
{ return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user")); }
請求 IP 地址來限流;
@Bean KeyResolver ipKeyResolver()
{ return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName()); }
 
 
 
 
 
 
 
 
 
 
 
         - name: RequestRateLimiter
          args:
            redis-rate-limiter.replenishRate: 10
            redis-rate-limiter.burstCapacity: 20
             key-resolver: "#{@userKeyResolver}"
  #熔斷路由器 Spring Cloud Gateway 也可以利用 Hystrix 的熔斷特性,在流量過大時進行服務降級,添加上依賴 spring-cloud-starter-netflix-hystrix
配置後,gateway 將使用 myCommandName 作爲名稱生成 HystrixCommand 對象來進行熔斷管理。
 
         - Hystrix=myCommandName
  #熔斷路由器 如果想添加熔斷後的回調內容。需要添加一些配置,fallbackUri: forward:/incaseoffailureusethis配置了 fallback 時要會調的路徑,當調用 Hystrix 的 fallback 被調用時,請求將轉發到/incaseoffailureuset這個 URI。
 
         - name: Hystrix
          args:
            name: fallbackcmd
            fallbackUri: forward:/incaseoffailureusethis
  #重試路由器 RetryGatewayFilter 是 Spring Cloud Gateway 對請求重試提供的一個 GatewayFilter Factory;Retry GatewayFilter 通過這四個參數來控制重試機制: retries, statuses, methods, 和 series;
retries:重試次數,默認值是 3 次

statuses:HTTP 的狀態返回碼,取值請參考:org.springframework.http.HttpStatus
methods:指定哪些方法的請求需要進行重試邏輯,默認值是 GET 方法,取值參考:org.springframework.http.HttpMethod
series:一些列的狀態碼配置,取值參考:org.springframework.http.HttpStatus.Series。符合的某段狀態碼纔會進行重試邏輯,默認值是 SERVER_ERROR,值是 5,也就是 5XX(5 開頭的狀態碼),共有5 個值
 
 
 
 
 
 
         - name: Retry
          args:
            retries: 3
            statuses: BAD_GATEWAY
  Predicate 介紹:Predicate 來源於 Java 8,是 Java 8 中引入的一個函數,Predicate 接受一個輸入參數,返回一個布爾值結果。該接口包含多種默認方法來將 Predicate 組合成其他複雜的邏輯(比如:與,或,非)。可以用於接口請求參數校驗、判斷新老數據是否有變化需要進行更新操作。
Spring Cloud Gateway 中 Spring 利用 Predicate 的特性實現了各種路由匹配規則,有通過 Header、請求參數等不同的條件來進行作爲條件匹配到對應的路由。Predicate 就是爲了實現一組匹配規則,方便讓請求過來找到對應的 Route 進行處理。
 
 
 
         predicates:
  通過時間匹配:Predicate 支持設置一個時間,在請求進行轉發的時候,可以通過判斷在這個時間之前或者之後進行轉發。
示例:比如我們現在設置只有在2019年1月1日纔會轉發到我的網站,在這之前不進行轉發,我就可以這樣配置:
提示:Spring 是通過 ZonedDateTime 來對時間進行的對比,ZonedDateTime 是 Java 8 中日期時間功能裏,用於表示帶時區的日期與時間信息的類,ZonedDateTime 支持通過時區來設置時間,中國的時區是:Asia/Shanghai。
提示:After Route Predicate 是指在這個時間之後的請求都轉發到目標地址。示例是指,請求時間在 2018年1月20日6點6分6秒之後的所有請求都轉發到地址http://baidu.com。+08:00是指時間和UTC時間相差八個小時,時間地區爲Asia/Shanghai。
提示:Before Route Predicate 剛好相反,在某個時間之前的請求的請求都進行轉發。
提示:除過在時間之前或者之後外,Gateway 還支持限制路由請求在某一個時間段範圍內,可以使用 Between Route Predicate 來實現。
 
 
 
 
 
 
 
         - Before=2018-01-20T06:06:06+08:00[Asia/Shanghai]
         - After=2018-01-20T06:06:06+08:00[Asia/Shanghai]
         - Between=2018-01-20T06:06:06+08:00[Asia/Shanghai], 2019-01-20T06:06:06+08:00[Asia/Shanghai]
  通過 Cookie 匹配:Cookie Route Predicate 可以接收兩個參數,一個是 Cookie name ,一個是正則表達式,路由規則會通過獲取對應的 Cookie name 值和正則表達式去匹配,如果匹配上就會執行路由,如果沒有匹配上則不執行。測試數據:baidu=kee.e
 
         - Cookie=baidu, kee.e
  通過 Header 屬性匹配:Header Route Predicate 和 Cookie Route Predicate 一樣,也是接收 2 個參數,一個 header 中屬性名稱和一個正則表達式,這個屬性值和正則表達式匹配則執行。測試數據:X-Request-Id:666666 或者 X-Request-Id:neo
 
         - Header=X-Request-Id, \d+
  通過 Host 匹配:Host Route Predicate 接收一組參數,一組匹配的域名列表,這個模板是一個 ant 分隔的模板,用.號作爲分隔符。它通過參數中的主機地址作爲匹配規則。測試數據:www.baidu.com 或者 www.baidu.com
 
         - Host=**.baidu.com
  通過請求方式匹配:可以通過是 POST、GET、PUT、DELETE 等不同的請求方式來進行路由。
         - Method=GET
  通過請求路徑匹配:Path Route Predicate 接收一個匹配路徑的參數來判斷是否走路由。 測試數據:/foo/1 或者 /foo/bar 
@Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder)
{return builder.routes() .route("path_route", r -> r.path("/about") .uri("http://www.baidu.com"))  .build();}

示例:上面配置了一個 id 爲 path_route 的路由,當訪問地址http://localhost:8080/about時會自動轉發到地址:http://www.baidu.com/about
 
 
 
         - Path=/foo/{segment}
  通過請求參數匹配:Query Route Predicate 支持傳入兩個參數,一個是屬性名一個爲屬性值,屬性值可以是正則表達式。測試數據:- Query=smile 只要請求中包含 smile 屬性的參數即可匹配路由; - Query=keep, pu. 只要當請求中包含 keep 屬性並且參數值是以 pu 開頭的長度爲三位的字符串纔會進行匹配和路由
 
         - Query=keep, pu.
  通過請求 ip 地址進行匹配:Predicate 也支持通過設置某個 ip 區間號段的請求才會路由,RemoteAddr Route Predicate 接受 cidr 符號(IPv4 或 IPv6 )字符串的列表(最小大小爲1),例如 192.168.0.1/16 (其中 192.168.0.1 是 IP 地址,16 是子網掩碼)。測試數據:請求的遠程地址是 192.168.1.10,則此路由將匹配
 
         - RemoteAddr=192.168.1.1/24
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章