引入依賴
<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”。 |
|||||||||||||||||||
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 |