基于比率的路由到旧版和现代应用程序–通过Spring Cloud的Netflix Zuul

从应用程序的旧版本迁移到应用程序的现代化版本时,一个非常普遍的要求是能够将用户缓慢迁移到新应用程序。 在本文中,我将介绍通过Spring Cloud使用对Netflix Zuul的支持编写的这种路由层。 在继续之前,我必须承认,此处演示的大多数代码都是与最高级的丁少珍合作编写的

情境

我有一个旧服务,它已被重新设计为一个更现代的版本(假设作为此迁移的一部分,端点的uri并未更改)。 我想将用户从旧版应用程序缓慢迁移到现代版本。

使用Spring Cloud Netflix实施– Zuul支持

使用Spring Cloud项目中的Netflix Zuul支持可以轻松实现这一目标。

Zuul由一组过滤器驱动,这些过滤器在对后端的请求之前(前置过滤器),期间(路由过滤器)和之后(后过滤器)处理请求。 Spring Cloud将其自定义过滤器集添加到Zuul,并通过如下配置来驱动这些过滤器的行为:

zuul:routes:ratio-route:path: /routes/**strip-prefix: false

这指定Zuul将使用前缀“ / routes”处理对Uri的请求,并且不会从下游调用中删除此前缀。 该逻辑被编码为“ PreDecorationFilter” 。 我的目标是在PreDecorationFilter之后对请求执行操作,并将后端指定为旧版或新版。 在此情况下,对请求起作用的过滤器如下所示:

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
...@Service
public class RatioBasedRoutingZuulFilter extends ZuulFilter {public static final String LEGACY_APP = "legacy";public static final String MODERN_APP = "modern";private Random random = new Random();@Autowiredprivate RatioRoutingProperties ratioRoutingProperties;@Overridepublic String filterType() {return "pre";}@Overridepublic int filterOrder() {return FilterConstants.PRE_DECORATION_FILTER_ORDER + 1;}@Overridepublic boolean shouldFilter() {RequestContext ctx = RequestContext.getCurrentContext();return ctx.containsKey(SERVICE_ID_KEY)&& ctx.get(SERVICE_ID_KEY).equals("ratio-route");}@Overridepublic Object run() {RequestContext ctx = RequestContext.getCurrentContext();if (isTargetedToLegacy()) {ctx.put(SERVICE_ID_KEY, LEGACY_APP);} else {ctx.put(SERVICE_ID_KEY, MODERN_APP);}return null;}boolean isTargetedToLegacy() {return random.nextInt(100) < ratioRoutingProperties.getOldPercent();}
}

通过覆盖filterOrder()方法,可以将过滤器设置为在“ PreDecorationFilter”之后执行操作。 路由逻辑相当幼稚,但在大多数情况下都可以使用。 解析serviceId之后,Spring Cloud将使用Ribbon来路由请求,仅出于变化目的,我在传统呼叫中使用已配置的url,在现代后端呼叫中使用了Eureka。 如果您有兴趣探索整个应用程序,可以在我的github仓库中找到

在完成整个设置后,通过对旧版处理20%的流量进行的小测试,可以确认过滤器有效地工作:

结论

Spring Cloud对Netflix Zuul的支持使处理这样的路由方案变得轻而易举,并且应该非常适合具有他们可能想要实现的这类路由方案的任何组织。

翻译自: https://www.javacodegeeks.com/2017/05/ratio-based-routing-legacy-modern-app-netflix-zuul-via-spring-cloud.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux查找设备所在分片,Linux设备驱动统一模型解析

soc节点指定了&#xff1c;0x0 0xe0000000 0x00100000&#xff1e;&#xff1b;此属性值指定对于1024KB范围的地址空间&#xff0c;在物理0x0处寻址的子节点映射到物理0xe0000000的父地址。通过这种映射&#xff0c;串行设备节点可以通过0xe0004600地址的加载或存储、0x4600(在…

一个兼容所有浏览器的阻止事件冒泡方法

function stopBubble(event) { //阻止冒泡事件 //取消事件冒泡 var e arguments.callee.caller.arguments[0] || event; //若省略此句&#xff0c;下面的e改为event&#xff0c;IE运行可以&#xff0c;但是其他浏览器就不兼容 if (e && e.stopPropagation) { // this …

linux shell 脚本 supress,《linux Shell 脚本攻略》进阶学习(第一部分)

第二章命令之乐cat 不仅可以读取文件并且连接数据&#xff0c;它还能从标准输入中进行读取要从标准输入中读取&#xff0c;就要使用管道操作符echo Text through stdin | cat - file.txt。这里的-被作为来之stdin 文本的文件名称实例 在file.txt 中写入dfagfmirgjriogjrogijdfg…

xaml_XAML或JavaFx?

xaml这是使用XAML和JavaFx构建应用程序的快速&#xff0c;主观&#xff0c; 无权且非常不科学的比较。 比较是基于我与每个人合作的个人经验。 在XAML方面&#xff0c;这意味着WPF和Win8存储应用程序 。 在JavaFx方面&#xff0c;这意味着Windows 7应用程序。 JavaFX JavaFx被…

古代猪文

题意&#xff1a; 给定q &#xff0c;n 求$q^{\sum\limits {d|n} C_{n}^{d} }mod 999911659$ 题解&#xff1a; 首先如果你直接算次方上的数的话会炸掉&#xff0c;因为欧拉定理我们可以得到 $q^{\sum\limits {d|n} C_{n}^{d} mod999911658}mod 999911659$ 因为mod的数是个合数…

linux gcc 7.3.0安装,升级gcc到7.3.0

#查看当前版本gcc --version # 先查看当前版本确认是否需要升级tar -zxvf gcc-7.3.0.tar.gzcd gcc-7.3.0#检测和安装相关依赖包&#xff0c;这个过程需要耐心等待&#xff0c;此步骤会将依赖包下载到gcc-7.3.0目录&#xff0c;如果因网络原因无法完成请自行使用wget下载。该步骤…

使用Envoy代理的微服务模式,第二部分:超时和重试

该博客是系列文章的一部分&#xff0c;该系列文章更深入地介绍了Envoy Proxy和Istio.io &#xff0c;以及它如何实现更优雅的连接和管理微服务的方式。 跟随我christianposta &#xff0c;紧跟这些博客文章的发布。 什么是Envoy代理 &#xff0c;它如何工作&#xff1f; 如何…

矩阵快速幂总结

依然主要还是自用 首先矩阵一条性质的概述和证明 概述:对于一个临接矩阵$G$来说&#xff0c;它自乘$G^k$次方中$G[i][j]$含义为从i走到j走k步方案数. 证明:比较麻烦,我们设f[i]表示从1走到其他点方案数,那么根据矩阵递推优化,k次就是转移了k次,那么每次走一步,k次就是走了k步 最…

c语言有一个正整数加上100,c语言编程实现:一个整数,它加上100后是完全平方数,再加168又是完全平方数,求该数。...

满意答案问题&#xff1a;一整数&#xff0c;它加100后是完全平方数&#xff0c;再加168还是完全平方数&#xff0c;求该整数解题思路&#xff1a;设该数为x&#xff0c;它加100后是A&#xff0c;再加168为B。则因为A是完全平方数&#xff0c;所以A为正数&#xff0c;且Ay*y&am…

C语言计算分段函数pta,PTA浙大版《C语言程序设计(第3版)》题目集 练习2-11 计算分段函数[2] (10分)...

1.编程将一个字符串中所有空格替换为“%20”#define _CRT_SECURE_NO_WARNINGS#include #includeusing namespace std;const int maxd 20;//最大深度int m[1 << maxd];//最大结点个数为2的maxd次方-1//编程将字符串中的空格用%20代替…2021/5/21 3:32:25pssh是由python编写…

「PKUWC2018」Slay the Spire

国际惯例不放题干 扯淡 其实题目翻译过来是杀戮尖塔&#xff0c;某steam上的卡牌游戏&#xff0c;我也曾热衷刷榜 题解 首先题目中要求的期望是假期望,结合题目中所给的阶乘就可以看出这其实是从$2*n$张牌中选择$m$张牌使用,并且所有情况都取最大值时的和 首先排序贪心最大 再说…

java lambda使用_在Java 8 Lambda上使用Apache Commons Functor功能接口

java lambda使用Apache Commons Functor &#xff08;以下称为[functor]&#xff09;是一个Apache Commons组件&#xff0c;它提供功能性的编程API和已实现的几种模式&#xff08;访问者&#xff0c;生成器&#xff0c;聚合器等&#xff09;。 Java 8具有几个不错的新功能&…

基于svm图像分类C语言,基于SVM的图像分类算法与实现.PDF

, ( ) 计算机工程与应用40 ComputerEngineeringandApplications基于SVM的图像分类算法与实现张淑雅 赵一鸣 李均利, ,, ,ZHANGShu-yaZHAOYi-mingLIJun-li宁波大学 数字技术与应用软件研究所 浙江 宁波, 315211, , , ,InstituteofDSPandSoftwareTechniquesNingboUniversityNingb…

前端ui框架

http://frozenui.github.io/components.html#progress rozenUI是什么 Frozen UI是一个开源的简单易用&#xff0c;轻量快捷的移动端UI框架。基于手Q样式规范&#xff0c;选取最常用的组件&#xff0c; 做成手Q公用离线包减少请求&#xff0c;升级方式友好&#xff0c;文档完善…

德国留学语言c1,德国留学申请,关于语言

申请德国大学并不容易&#xff0c;语言是一大关。对于申请德国大学的人来说&#xff0c;除国际课程和个别专业外&#xff0c;各大学对申请人德语学时要求一般都在800学时以上&#xff0c;目前比较权威的德语考试有TestDaf和DSH这两种类型。TestDaF&#xff1a;“外国学生申请大…

一个iOS表单框架-UFKit

效果&#xff1a; 使用&#xff1a; pod UFKit- (void)viewDidLoad {[super viewDidLoad];__block UFFormView *formView [UFFormView makeFormView:^(UFFormViewMaker * _Nonnull make) {make.addSection([UFSection makeSection:^(UFSectionMaker * _Nonnull make) {make.ad…

c语言手写指针和乘号,C-学会使用指针(示例代码)

先说&#xff1a;唯手熟尔指针指针存储着一个内存空间的地址定义一个指针int a&#xff1b;int * p&#xff1b;定义一个指针&#xff0c;只需在变量前面加一个 * 号。这里的指针只能存储一个存放整数的内存空间的地址指针如何存储地址p &a;&叫取地址符。这样整形指针…

考后反思7.25

D1 考试时首先看的第一题&#xff0c;不会&#xff0c;然后看第二题&#xff0c;原题&#xff01;&#xff01;&#xff01;&#xff01; 第二题啥也没想&#xff0c;就只是打了一个tarjan判割点&#xff0c; 打完的时候有点慌&#xff0c;总觉得自己打错了什么&#xff0c;调了…

android getinstance 方法,Android中的'new Fragment()'和'Fragment.getInstance()'有什么区别?...

当我们片段添加到特定的布局&#xff0c;我们可以使用folloing码Fragment fragment new SampleFragment();FragmentManager fragmentManager getSupportFragmentManager();FragmentTransaction fragmentTransaction fragmentManager.beginTransaction();fragmentTransaction…

查找发布地图的 REST URL并查询相关信息

1、登录ArcGIS Server Manager 2、登录后&#xff0c;里面是以前自己发布的地图服务 3、点击自己发布的地图&#xff0c;然后按下功能选项&#xff0c;再点击箭头来找到URL 4、点击进去&#xff0c;分别能从红圈中找到相关的信息&#xff0c;分别为arcgis JavaScript&#xff0…