SpringCloudGateway筆記(8)-權重

使用SpringCloudGateway的重要功能 – 權重路由

由於後端的服務器有時候性能不同,或者是由於需要灰度發佈,需要上線一部分新版本的服務

注:灰度發佈是指在黑與白之間,能夠平滑過渡的一種發佈方式。AB test就是一種灰度發佈方式,讓一部分用戶繼續用A,一部分用戶開始用B,如果用戶對B沒有什麼反對意見,那麼逐步擴大範圍,把所有用戶都遷移到B上面來。灰度發佈可以保證整體系統的穩定,在初始灰度的時候就可以發現、調整問題,以保證其影響度,而我們平常所說的金絲雀部署也就是灰度發佈的一種方式。

spring-cloud-gateway自身提供一個predicate叫WeightRoutePredicateFactory,在啓動的時候也可以看到

2019-05-29 23:06:47.321  INFO 4736 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [After]
2019-05-29 23:06:47.321  INFO 4736 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Before]
2019-05-29 23:06:47.322  INFO 4736 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Between]
2019-05-29 23:06:47.322  INFO 4736 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Cookie]
2019-05-29 23:06:47.322  INFO 4736 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Header]
2019-05-29 23:06:47.322  INFO 4736 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Host]
2019-05-29 23:06:47.322  INFO 4736 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Method]
2019-05-29 23:06:47.322  INFO 4736 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Path]
2019-05-29 23:06:47.322  INFO 4736 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Query]
2019-05-29 23:06:47.322  INFO 4736 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [ReadBodyPredicateFactory]
2019-05-29 23:06:47.322  INFO 4736 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [RemoteAddr]
2019-05-29 23:06:47.322  INFO 4736 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Weight]
2019-05-29 23:06:47.322  INFO 4736 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [CloudFoundryRouteService]

但是不知道爲什麼在文檔裏面沒有相關的描述,在官方ISSUE裏面也有人提到了這個問題

https://github.com/spring-cloud/spring-cloud-gateway/issues/1072

具體的使用方式

      routes:
        - id: spring-cloud-client-demo
          uri: lb://spring-cloud-client-demo
          predicates:
            - Path=/client/**
            - Weight=group1, 2
          filters:
            - AddRequestHeader=X-Request-Foo, Bar
            - StripPrefix=1
            - SaveSession
        - id: spring-cloud-client-demo1
          uri: lb://spring-cloud-client-demo
          predicates:
            - Path=/client/**
            - Weight=group1, 8
          filters:
            - StripPrefix=2

Weight有兩個屬性,group1是指定分組,後面的數字代表了權重

使用PostMan發起請求

GET http://localhost:10001/client/demo/demo/weight?param=mt

在對應的spring-cloud-client-demo工程裏面有兩個不同的controller

 @GetMapping("/weight")
    public String weight(@RequestParam String param) {
        log.info("aaaa: {}", param);
        return "aaa";
    }


    @GetMapping("/demo/weight")
    public String demoWeight(@RequestParam String param) {
        log.info("===============sb: {}", param);
        return "bbb";
    }

發起多次請求,可以觀察到大概滿足1:4這樣一個比例

2019-05-29 23:19:15.462  INFO 1764 --- [nio-8801-exec-1] c.m.d.client.controller.DemoController   : aaaa: mt
2019-05-29 23:19:29.399  INFO 1764 --- [nio-8801-exec-2] c.m.d.client.controller.DemoController   : aaaa: mt
2019-05-29 23:19:33.512  INFO 1764 --- [nio-8801-exec-3] c.m.d.client.controller.DemoController   : aaaa: mt
2019-05-29 23:19:36.425  INFO 1764 --- [nio-8801-exec-5] c.m.d.client.controller.DemoController   : ===============sb: mt
2019-05-29 23:19:37.404  INFO 1764 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController   : ===============sb: mt
2019-05-29 23:19:39.425  INFO 1764 --- [nio-8801-exec-4] c.m.d.client.controller.DemoController   : aaaa: mt
2019-05-29 23:19:42.396  INFO 1764 --- [nio-8801-exec-7] c.m.d.client.controller.DemoController   : aaaa: mt
2019-05-29 23:19:44.393  INFO 1764 --- [nio-8801-exec-8] c.m.d.client.controller.DemoController   : aaaa: mt
2019-05-29 23:19:45.422  INFO 1764 --- [nio-8801-exec-9] c.m.d.client.controller.DemoController   : aaaa: mt
2019-05-29 23:19:47.398  INFO 1764 --- [io-8801-exec-10] c.m.d.client.controller.DemoController   : ===============sb: mt
2019-05-29 23:19:48.389  INFO 1764 --- [nio-8801-exec-1] c.m.d.client.controller.DemoController   : aaaa: mt
2019-05-29 23:19:50.499  INFO 1764 --- [nio-8801-exec-2] c.m.d.client.controller.DemoController   : aaaa: mt
2019-05-29 23:19:54.380  INFO 1764 --- [nio-8801-exec-3] c.m.d.client.controller.DemoController   : aaaa: mt
2019-05-29 23:19:55.399  INFO 1764 --- [nio-8801-exec-5] c.m.d.client.controller.DemoController   : aaaa: mt
2019-05-29 23:19:56.404  INFO 1764 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController   : aaaa: mt
2019-05-29 23:19:57.402  INFO 1764 --- [nio-8801-exec-4] c.m.d.client.controller.DemoController   : aaaa: mt
2019-05-29 23:19:58.393  INFO 1764 --- [nio-8801-exec-7] c.m.d.client.controller.DemoController   : aaaa: mt
2019-05-29 23:19:59.395  INFO 1764 --- [nio-8801-exec-8] c.m.d.client.controller.DemoController   : aaaa: mt
2019-05-29 23:20:00.397  INFO 1764 --- [nio-8801-exec-9] c.m.d.client.controller.DemoController   : aaaa: mt
2019-05-29 23:20:02.408  INFO 1764 --- [io-8801-exec-10] c.m.d.client.controller.DemoController   : aaaa: mt
2019-05-29 23:20:03.390  INFO 1764 --- [nio-8801-exec-1] c.m.d.client.controller.DemoController   : aaaa: mt
2019-05-29 23:20:05.435  INFO 1764 --- [nio-8801-exec-2] c.m.d.client.controller.DemoController   : aaaa: mt
2019-05-29 23:20:06.430  INFO 1764 --- [nio-8801-exec-3] c.m.d.client.controller.DemoController   : aaaa: mt
2019-05-29 23:20:13.410  INFO 1764 --- [nio-8801-exec-5] c.m.d.client.controller.DemoController   : aaaa: mt
2019-05-29 23:20:14.435  INFO 1764 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController   : ===============sb: mt
2019-05-29 23:20:17.481  INFO 1764 --- [nio-8801-exec-4] c.m.d.client.controller.DemoController   : aaaa: mt

這裏還有一種情況是反向代理的時候,因爲url只能寫一個,所以可以配置一組反向代理,這樣就滿足了往多個地址代理的需求

例如,這裏proxy爲了方便兩個使用了一個url,實際是使用不同的地址

        - id: proxy
          uri: http://localhost:8801
          predicates:
            - Path=/demo/**
            - Weight=group2, 8
        - id: proxy1
          uri: http://localhost:8801
          predicates:
            - Path=/demo/**
            - Weight=group2, 2
          filters:
            - StripPrefix=1

用PostMan發起請求

http://localhost:10001/demo/demo/weight?param=mt

可以看到,這兩個反向代理是屬於同一組代理,按照權重來進行路由,實現了不同url的負載均衡

2019-05-29 23:26:07.460  INFO 1764 --- [nio-8801-exec-3] c.m.d.client.controller.DemoController   : aaaa: mt
2019-05-29 23:26:10.399  INFO 1764 --- [nio-8801-exec-5] c.m.d.client.controller.DemoController   : aaaa: mt
2019-05-29 23:26:13.482  INFO 1764 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController   : aaaa: mt
2019-05-29 23:26:17.424  INFO 1764 --- [nio-8801-exec-4] c.m.d.client.controller.DemoController   : ===============sb: mt
2019-05-29 23:26:20.390  INFO 1764 --- [nio-8801-exec-7] c.m.d.client.controller.DemoController   : ===============sb: mt
2019-05-29 23:26:23.405  INFO 1764 --- [nio-8801-exec-8] c.m.d.client.controller.DemoController   : ===============sb: mt
2019-05-29 23:26:24.405  INFO 1764 --- [nio-8801-exec-9] c.m.d.client.controller.DemoController   : aaaa: mt
2019-05-29 23:26:26.415  INFO 1764 --- [io-8801-exec-10] c.m.d.client.controller.DemoController   : ===============sb: mt
2019-05-29 23:26:27.423  INFO 1764 --- [nio-8801-exec-1] c.m.d.client.controller.DemoController   : ===============sb: mt
2019-05-29 23:26:29.421  INFO 1764 --- [nio-8801-exec-2] c.m.d.client.controller.DemoController   : ===============sb: mt
2019-05-29 23:26:32.407  INFO 1764 --- [nio-8801-exec-3] c.m.d.client.controller.DemoController   : ===============sb: mt
2019-05-29 23:26:34.392  INFO 1764 --- [nio-8801-exec-5] c.m.d.client.controller.DemoController   : ===============sb: mt
2019-05-29 23:26:37.418  INFO 1764 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController   : ===============sb: mt
2019-05-29 23:26:38.412  INFO 1764 --- [nio-8801-exec-4] c.m.d.client.controller.DemoController   : ===============sb: mt
2019-05-29 23:26:40.482  INFO 1764 --- [nio-8801-exec-7] c.m.d.client.controller.DemoController   : ===============sb: mt
2019-05-29 23:26:43.408  INFO 1764 --- [nio-8801-exec-8] c.m.d.client.controller.DemoController   : aaaa: mt
2019-05-29 23:26:44.459  INFO 1764 --- [nio-8801-exec-9] c.m.d.client.controller.DemoController   : ===============sb: mt
2019-05-29 23:26:46.426  INFO 1764 --- [io-8801-exec-10] c.m.d.client.controller.DemoController   : ===============sb: mt
2019-05-29 23:26:47.403  INFO 1764 --- [nio-8801-exec-1] c.m.d.client.controller.DemoController   : aaaa: mt
2019-05-29 23:26:48.408  INFO 1764 --- [nio-8801-exec-2] c.m.d.client.controller.DemoController   : aaaa: mt
2019-05-29 23:26:49.410  INFO 1764 --- [nio-8801-exec-3] c.m.d.client.controller.DemoController   : ===============sb: mt
2019-05-29 23:26:50.409  INFO 1764 --- [nio-8801-exec-5] c.m.d.client.controller.DemoController   : ===============sb: mt
2019-05-29 23:26:51.429  INFO 1764 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController   : ===============sb: mt
2019-05-29 23:26:53.441  INFO 1764 --- [nio-8801-exec-4] c.m.d.client.controller.DemoController   : ===============sb: mt
2019-05-29 23:26:55.435  INFO 1764 --- [nio-8801-exec-7] c.m.d.client.controller.DemoController   : ===============sb: mt

GITHUB代碼地址

歡迎關注微信交流
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章