Spring Cloud Gateway(網(wǎng)關(guān))

概念

Gateway是基于異步非阻塞模型上進(jìn)行開發(fā)的疟位,有springcloud團(tuán)隊(duì)開發(fā)勋篓。用來代替Zuul。

內(nèi)容

Route(路由)

路由是構(gòu)建網(wǎng)關(guān)的基本模塊睡毒,它由ID,目標(biāo)URL冗栗,一系列的斷言和過濾器組成,如果斷言為true則匹配該路由

Predicate(斷言)

參考的是java8的java.util.function.Predicate
開發(fā)人員可以匹配HTTP請(qǐng)求中的所有內(nèi)容(例如請(qǐng)求頭或者請(qǐng)求參數(shù))供搀,如果請(qǐng)求與斷言想匹配則路由

Filter(過濾)

指的是Spring框架中GatewayFilter的實(shí)例隅居,使用過濾器,可以請(qǐng)求被路由器前或者之后對(duì)請(qǐng)求進(jìn)行修改

Zuul

Zuul1基于servlet阻塞I/O的API Gateway葛虐,且進(jìn)入維護(hù)
Zuul2雖然基于非阻塞I/O胎源,但是還沒有發(fā)布,且SpringCloud沒有整合

優(yōu)點(diǎn)

  1. 基于Spring Framework5, Project Reactor 和SpringBoot 2.0 進(jìn)行構(gòu)建
  2. 動(dòng)態(tài)路由:能夠匹配任何請(qǐng)求屬性
  3. 可以對(duì)路由指定Predicate(斷言) 和 Filter(過濾器)
  4. 繼承Hystrix的斷路器功能
  5. 集成SpringCloud服務(wù)發(fā)現(xiàn)功能
  6. 易于編寫的Predicate(斷言) 和 Filter(過濾器)
  7. 請(qǐng)求限流功能
  8. 支持路由重寫

作用

可以不對(duì)外開放服務(wù)端屿脐,只對(duì)外開放網(wǎng)關(guān)

Spring Cloud Gateway工作流程

Spring Cloud Gateway工作流程.png

使用

  1. 新建網(wǎng)關(guān)模型
  2. pom引入Gateway
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
  1. 將網(wǎng)關(guān)注冊(cè)進(jìn)eureka/Zookeeper/Consul
  2. 由yml網(wǎng)關(guān)配置涕蚤。在yml中加入
spring: 
  cloud:
    gateway:
      routes:
        - id: payment_routh #路由的id宪卿,沒有固定規(guī)則但要求唯一,建議配合服務(wù)名
        -url: http://localhost:8001 #匹配后提供服務(wù)的路由地址
        -predicates:
          - Path=/payment/get/** #斷言万栅,路徑相匹配的進(jìn)行路由

        - id: payment_routh2 #路由的id佑钾,沒有固定規(guī)則但要求唯一,建議配合服務(wù)名
        -url: http://localhost:8001 #匹配后提供服務(wù)的路由地址
        -predicates:
          - Path=/payment/1b/** #斷言烦粒,路徑相匹配的進(jìn)行路由
  1. 測(cè)試
    在網(wǎng)關(guān)中休溶,不需要springboot的web和actuator,否則啟動(dòng)報(bào)錯(cuò)扰她。在pom中移除即可
    --啟動(dòng)eureka/Zookeeper/Consul兽掰、網(wǎng)關(guān)、服務(wù)端
    --通過網(wǎng)關(guān)訪問服務(wù)端
  2. 用代碼配置徒役,創(chuàng)建一個(gè)配置類
@Configuration
public class GatwayConfig{
  @Bean
  public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){
    RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
    
    routes .route("path_route",r -> r.path("/guonei").uri("http://baidu.com/guonei")).build();
    return routes.build();
  }
}

實(shí)現(xiàn)動(dòng)態(tài)路由功能

默認(rèn)情況下Gateway會(huì)根據(jù)注冊(cè)中心注冊(cè)的服務(wù)列表孽尽,以注冊(cè)中心上微服務(wù)名為路徑創(chuàng)建動(dòng)態(tài)路由進(jìn)行轉(zhuǎn)發(fā),從而實(shí)現(xiàn)動(dòng)態(tài)路由功能

實(shí)現(xiàn)

spring: 
  cloud:
    gateway:
      discovery: 
        locator:
          enabled: true
      routes:
        - id: payment_routh #路由的id忧勿,沒有固定規(guī)則但要求唯一杉女,建議配合服務(wù)名
       # -url: http://localhost:8001 #匹配后提供服務(wù)的路由地址
        -url: 1b://cloud-payment-service
        -predicates:
          - Path=/payment/get/** #斷言,路徑相匹配的進(jìn)行路由

        - id: payment_routh2 #路由的id狐蜕,沒有固定規(guī)則但要求唯一宠纯,建議配合服務(wù)名
        #-url: http://localhost:8001 #匹配后提供服務(wù)的路由地址
        -url: 1b://cloud-payment-service
        -predicates:
          - Path=/payment/1b/** #斷言,路徑相匹配的進(jìn)行路由

predicates的參數(shù).如下為官網(wǎng)內(nèi)容

  1. 所述After路線謂詞工廠有一個(gè)參數(shù)层释,一個(gè)datetime(其是Java ZonedDateTime)婆瓜。該謂詞匹配在指定日期時(shí)間之后發(fā)生的請(qǐng)求。下面的示例配置路由后謂詞:
    例子1. application.yml
spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - After=2017-01-20T17:42:47.789-07:00[America/Denver]

這條路線符合2017年1月20日17:42山區(qū)時(shí)間(丹佛)之后的任何請(qǐng)求贡羔。

  • 獲取時(shí)區(qū)
ZonedDateTime zbj = ZonedDateTime.now();//默認(rèn)時(shí)區(qū)
System.out.println(zbj);
  1. 所述Before路線謂詞工廠有一個(gè)參數(shù)廉白,一個(gè)datetime(其是Java ZonedDateTime)。該謂詞匹配在指定之前發(fā)生的請(qǐng)求datetime乖寒。下面的示例配置路由前謂詞:
    例子2. application.yml
spring:
  cloud:
    gateway:
      routes:
      - id: before_route
        uri: https://example.org
        predicates:
        - Before=2017-01-20T17:42:47.789-07:00[America/Denver]

這條路線符合2017年1月20日山區(qū)時(shí)間(丹佛)之前的任何請(qǐng)求猴蹂。

  1. 該Between路線謂詞工廠有兩個(gè)參數(shù),datetime1并且datetime2 這是JavaZonedDateTime對(duì)象楣嘁。該謂詞匹配之后datetime1和之前發(fā)生的請(qǐng)求datetime2磅轻。該datetime2參數(shù)必須是后datetime1。以下示例配置了路由之間的謂詞:
    例子3. application.yml
spring:
  cloud:
    gateway:
      routes:
      - id: between_route
        uri: https://example.org
        predicates:
        - Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]

此路線與2017年1月20日山區(qū)時(shí)間(丹佛)之后和2017年1月21日17:42山區(qū)時(shí)間(丹佛)之后的任何請(qǐng)求相匹配逐虚。這對(duì)于維護(hù)時(shí)段可能很有用聋溜。

  1. 所述Cookie路線謂詞工廠采用兩個(gè)參數(shù),該cookiename和regexp(其是Java正則表達(dá)式)叭爱。該謂詞匹配具有給定名稱且其值與正則表達(dá)式匹配的cookie撮躁。以下示例配置cookie路由謂詞工廠:
    例子4. application.yml
spring:
  cloud:
    gateway:
      routes:
      - id: cookie_route
        uri: https://example.org
        predicates:
        - Cookie=chocolate, ch.p

此路由匹配具有名稱為chocolate與ch.p正則表達(dá)式匹配的cookie的請(qǐng)求。

  1. 所述Header路線謂詞工廠采用兩個(gè)參數(shù)买雾,報(bào)頭name和一個(gè)regexp(其是Java正則表達(dá)式)把曼。該謂詞與具有給定名稱的標(biāo)頭匹配杨帽,該標(biāo)頭的值與正則表達(dá)式匹配。以下示例配置標(biāo)頭路由謂詞:
    例子5. application.yml
spring:
  cloud:
    gateway:
      routes:
      - id: header_route
        uri: https://example.org
        predicates:
        - Header=X-Request-Id, \d+

如果請(qǐng)求具有名為X-Request-Id其值與\d+正則表達(dá)式匹配的標(biāo)頭(即嗤军,其值為一個(gè)或多個(gè)數(shù)字)注盈,則此路由匹配。

  1. Host路線謂詞工廠需要一個(gè)參數(shù):主機(jī)名的列表patterns型雳。該模式是帶有.分隔符的Ant樣式的模式当凡。謂詞與Host匹配模式的標(biāo)頭匹配。以下示例配置主機(jī)路由謂詞:
    例子6. application.yml
spring:
  cloud:
    gateway:
      routes:
      - id: host_route
        uri: https://example.org
        predicates:
        - Host=**.somehost.org,**.anotherhost.org

{sub}.myhost.org還支持URI模板變量(例如)纠俭。

如果請(qǐng)求具有這種路由匹配Host用的頭值www.somehost.orgbeta.somehost.orgwww.anotherhost.org沿量。

該謂詞提取URI模板變量(例如sub,在前面的示例中定義的)作為名稱和值的映射冤荆,并ServerWebExchange.getAttributes()使用中定義的鍵將其放在中ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE朴则。這些值可供工廠使用GatewayFilter

  1. 所述Method路線謂詞廠需要methods的參數(shù),它是一個(gè)或多個(gè)參數(shù):HTTP方法來匹配钓简。以下示例配置方法route謂詞:
    例子7. application.yml
spring:
  cloud:
    gateway:
      routes:
      - id: method_route
        uri: https://example.org
        predicates:
        - Method=GET,POST

如果請(qǐng)求方法是aGET或a乌妒,則此路由匹配POST。

  1. Path路線謂詞廠有兩個(gè)參數(shù):春天的列表PathMatcher patterns和所謂的可選標(biāo)志matchTrailingSlash(默認(rèn)true)外邓。以下示例配置路徑路由謂詞:
    例子8. application.yml
spring:
  cloud:
    gateway:
      routes:
      - id: path_route
        uri: https://example.org
        predicates:
        - Path=/red/{segment},/blue/{segment}

如果請(qǐng)求路徑為撤蚊,則此路由匹配,例如:/red/1/red/1//red/blue/blue/green损话。

如果matchTrailingSlash設(shè)置為false侦啸,則請(qǐng)求路徑/red/1/將不匹配。

該謂詞提取URI模板變量(例如segment丧枪,在前面的示例中定義的)作為名稱和值的映射光涂,并ServerWebExchange.getAttributes()使用中定義的鍵將其放在中ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE。這些值可供工廠使用GatewayFilter

可以使用實(shí)用程序方法(稱為get)來簡(jiǎn)化對(duì)這些變量的訪問拧烦。下面的示例演示如何使用該get方法:

Map<String, String> uriVariables = ServerWebExchangeUtils.getPathPredicateVariables(exchange);

String segment = uriVariables.get("segment");
  1. 所述Query路線謂詞工廠采用兩個(gè)參數(shù):所要求的param和可選的regexp(其是Java正則表達(dá)式)忘闻。以下示例配置查詢路由謂詞:
    例子9. application.yml
spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: https://example.org
        predicates:
        - Query=green

如果請(qǐng)求包含green查詢參數(shù),則前面的路由匹配恋博。

application.yml

spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: https://example.org
        predicates:
        - Query=red, gree.

如果請(qǐng)求包含一個(gè)前述路線匹配red齐佳,其值相匹配的查詢參數(shù)gree.的regexp,所以green和greet將匹配债沮。

  1. 所述RemoteAddr路線謂詞工廠需要的列表(分鐘尺寸1) sources炼吴,其是CIDR的表示法(IPv4或IPv6)的字符串,如192.168.0.1/16(其中192.168.0.1是一個(gè)IP地址和16一個(gè)子網(wǎng)掩碼)秦士。以下示例配置一個(gè)RemoteAddr路由謂詞:
    例子10. application.yml
spring:
  cloud:
    gateway:
      routes:
      - id: remoteaddr_route
        uri: https://example.org
        predicates:
        - RemoteAddr=192.168.1.1/24

如果請(qǐng)求的遠(yuǎn)程地址為,則此路由匹配192.168.1.10永高。

  1. Weight路線謂詞工廠有兩個(gè)參數(shù):groupweight(一個(gè)int)隧土。權(quán)重是按組計(jì)算的提针。以下示例配置權(quán)重路由謂詞:
    例子11. application.yml
spring:
  cloud:
    gateway:
      routes:
      - id: weight_high
        uri: https://weighthigh.org
        predicates:
        - Weight=group1, 8
      - id: weight_low
        uri: https://weightlow.org
        predicates:
        - Weight=group1, 2

這條路線會(huì)將大約80%的流量轉(zhuǎn)發(fā)到weighthigh.org,將大約20%的流量轉(zhuǎn)發(fā)weightlow.org曹傀。

Spring Cloud gateway的Filter

非自定義的簡(jiǎn)單辐脖,按照文檔配置即可
Spring Cloud gateway的Filte官方文檔

生命周期與種類

  1. 生命周期-Only Two
  • pre
  • post
  1. 種類 - Only Two
  • GatewayFilter 單一的Filter
  • GlobalFilter 全局的Filter

自定義過濾器

  1. 新建Gateway配置類,實(shí)現(xiàn)GlobalFilter,Ordered接口皆愉,內(nèi)容如下
@Component
public class GatewayConfig implements GlobalFilter,Ordered{
  @Override
  public Mono<Void> filter(ServerWebExchange exchange,GatewayFilterChain chain){//exchange可以獲取到請(qǐng)求信息嗜价,chain用來將新的請(qǐng)求發(fā)出到下一個(gè)過濾鏈
    String name = exchange.getRequest().getQueryParams().getFilter("uname");
    if(name == null){
      ...
    }
    return chain.filter(exchange);
  }
  //getOrder是順序
  @Override
  public int getOrder(){
    ...
    return 0;
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市幕庐,隨后出現(xiàn)的幾起案子久锥,更是在濱河造成了極大的恐慌,老刑警劉巖异剥,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瑟由,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡冤寿,警方通過查閱死者的電腦和手機(jī)歹苦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來督怜,“玉大人殴瘦,你說我怎么就攤上這事『鸥埽” “怎么了蚪腋?”我有些...
    開封第一講書人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)究流。 經(jīng)常有香客問我辣吃,道長(zhǎng),這世上最難降的妖魔是什么芬探? 我笑而不...
    開封第一講書人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任神得,我火速辦了婚禮,結(jié)果婚禮上偷仿,老公的妹妹穿的比我還像新娘哩簿。我一直安慰自己,他們只是感情好酝静,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開白布节榜。 她就那樣靜靜地躺著,像睡著了一般别智。 火紅的嫁衣襯著肌膚如雪宗苍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,610評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音讳窟,去河邊找鬼让歼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛丽啡,可吹牛的內(nèi)容都是我干的谋右。 我是一名探鬼主播,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼补箍,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼改执!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起坑雅,我...
    開封第一講書人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤辈挂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后霞丧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呢岗,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年蛹尝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了后豫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡突那,死狀恐怖挫酿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情愕难,我是刑警寧澤早龟,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站猫缭,受9級(jí)特大地震影響葱弟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜猜丹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一芝加、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧射窒,春花似錦藏杖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至艾疟,卻和暖如春来吩,著一層夾襖步出監(jiān)牢的瞬間敢辩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工弟疆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留责鳍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓兽间,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親正塌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嘀略,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容