首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringCloudGateway笔记(8)-权重

SpringCloudGateway笔记(8)-权重

作者头像
yingzi_code
发布于 2019-08-30 14:06:59
发布于 2019-08-30 14:06:59
1.8K00
代码可运行
举报
运行总次数:0
代码可运行

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/yingziisme/article/details/94591082

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

由于后端的服务器有时候性能不同,或者是由于需要灰度发布,需要上线一部分新版本的服务

注:灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式。AB test就是一种灰度发布方式,让一部分用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度,而我们平常所说的金丝雀部署也就是灰度发布的一种方式。

spring-cloud-gateway自身提供一个predicate叫WeightRoutePredicateFactory,在启动的时候也可以看到

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

具体的使用方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
      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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 @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这样一个比例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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,实际是使用不同的地址

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        - 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的负载均衡

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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代码地址

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年07月08日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Feign的拦截器RequestInterceptor
SpringCloud的微服务使用Feign进行服务间调用的时候可以使用RequestInterceptor统一拦截请求来完成设置header等相关请求,但RequestInterceptor和ClientHttpRequestInterceptor有点不同,它拿不到原本的请求,所以要通过其他方法来获取原本的请求
yingzi_code
2020/03/18
31.9K3
SpringCloudGateway笔记(2)-filter与自定义filter
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
yingzi_code
2019/08/30
2.2K0
Nacos + Spring Cloud Gateway动态路由配置
具体的Nacos怎么配置就不介绍了,可以参考阿里巴巴的官方介绍,这里通过windows直接本地启动开启单机模式,登录Nacos Console,创建dev的namespace,在dev下的默认分组下创建gateway-router的dataId
BUG弄潮儿
2021/06/25
7.5K0
Nacos + Spring Cloud Gateway动态路由配置
Spring-LogBack笔记(1) - 基础使用
TRACE < DEBUG < INFO < WARN < ERROR < FATAL
yingzi_code
2020/03/18
4240
SpringCloudGateway笔记(4)-WebSession
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
yingzi_code
2019/08/30
7.4K0
Ribbon拦截器ClientHttpRequestInterceptor-传递header
Ribbon拦截器ClientHttpRequestInterceptor-传递header
yingzi_code
2020/03/20
1.9K0
Ribbon拦截器ClientHttpRequestInterceptor-传递header
Spring Cloud【Finchley】实战-06使用/actuator/bus-refresh端点手动刷新配置 + 使用Spring Cloud Bus自动更新配置
Spring Cloud实战-05配置中心的搭建(配合使用Eureka)和Config Server高可用 中的遗留问题:不能自动更新配置。
小小工匠
2021/08/17
1.4K0
Spring Boot 整合 apollo
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
程序员果果
2019/05/16
7360
JVM内存级分布式缓存Hazelcast 顶
1. 它是用Java编写的。 2. 与其他一些内存数据库(如redis)不同,Hazelcast是多线程的,这意味着可从所有可用的CPU内核中受益。 3. 与其他内存数据网格不同 - 它设计用于分布式环境。它支持每个群集无限数量的map和缓存。
算法之名
2019/08/20
1.4K0
JVM内存级分布式缓存Hazelcast
                                                                            顶
瑞吉外卖-分类管理业务开发
前面我们已经完成了后台系统的员工管理功能开发,在新增员工时需要设置创建时间、创建人、修改时间、修改人等字段,在编辑员工时需要设置修改时间和修改人等字段。这些字段属于公共字段,也就是很多表中都有这些字段,如下:
用户9615083
2022/12/25
7200
瑞吉外卖-分类管理业务开发
SpringCloudGateway笔记(3)-Predict与自定义Predict
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
yingzi_code
2019/08/30
1.7K0
当Tomcat遇上Netty
分部给到的异常日志大概是这样(鉴于公司规定禁止截图禁止拍照禁止外传任何信息,下面是我网上找到一张类似的报错):
彤哥
2020/05/22
1.2K1
当Tomcat遇上Netty
SpringCloudGateway笔记(9)-限流
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
yingzi_code
2019/08/30
2.4K0
SpringCloud 2.x学习笔记:7、Spring Cloud Bus(Greenwich版本)
在pom.xml文件添加spring-cloud-starter-bus-amqp,完整的配置文件如下:
程裕强
2019/07/02
9300
SpringCloud 2.x学习笔记:7、Spring Cloud Bus(Greenwich版本)
SpringCloudGateway笔记(6)-请求体不全
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
yingzi_code
2019/08/30
2.2K0
学会 Arthas,让你 3 年经验掌握 5 年功力
Arthas 是Alibaba开源的Java诊断工具,动态跟踪Java代码;实时监控JVM状态,可以在不中断程序执行的情况下轻松完成JVM相关问题排查工作 。支持JDK 6+,支持Linux/Mac/Windows。这个工具真的很好用,而且入门超简单,十分推荐。
爱撸猫的杰
2022/09/21
7060
提高系统吞吐量的一把利器:DeferredResult 到底有多强?
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/09/28
9640
提高系统吞吐量的一把利器:DeferredResult 到底有多强?
分布式系统「全链路日志追踪」实战之 RestTemplate & Feign
(图片来源于 Google Dapper 的一篇论文,这是链路追踪理论基础的鼻祖)这张图看上去感觉很高大上的样子 ,但精髓在于日志追踪架构设计思维。即设计思维很重要!设计思维很重要!设计思维很重要!设计思维很重要![重要的话说四遍 ] —— 思路和方案设计指导可落地的开发实现
IT技术小咖
2020/04/27
5.6K0
分布式系统「全链路日志追踪」实战之 RestTemplate & Feign
SpringCloudGateway笔记(7)-响应不全
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
yingzi_code
2019/08/30
2.6K0
Spring Boot 整合 apollo
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
jwangkun
2021/12/27
8500
Spring Boot 整合 apollo
推荐阅读
相关推荐
Feign的拦截器RequestInterceptor
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档