大流量场景下如何云淡风轻地进行线上发布?

简介: 本文介绍了微服务治理下金丝雀发布的能力,解决了发布期间少量流量验证新功能的问题。

前言

本文,我们继续聊聊《揭秘大流量场景下发布如丝般顺滑背后的原因》中的另外一环,灰度发布,也叫金丝雀发布。

很多互联网公司在半夜发布的另外一个重要原因是不具备可灰度能力,新版本存在 bug 或者其它原因会影响线上的客户,无奈之下只能选择在半夜进行发布来减少影响面。

我们知道默认情况下,无论是 Kubernetes 还是 ECS,新老版本都存在的情况下会根据特定的负载均衡算法随机地路由到不同的实例上,随机意味着出问题也会随机出现。我们需要一套动态路由来完成灰度发布的解决方案。

在 RPC 领域,我们称灰度发布为动态路由,动态路由的意思是指流量可以动态地路由到指定的实例上。

动态路由场景

动态路由是微服务里非常核心的功能,流量动态路由意味着可以做非常多的事情。由此衍生出各个场景:

  • 金丝雀发布:只有满足特定规则(比如 Query Parameter、HEADER、COOKIE 中某些 KEY 满足一些条件)或者是固定流量比例的流量才会进入新版本,其它流量都路由到老版本上。

 

image.png

  • 同机房优先路由:当公司规模扩大之后,应用会跨机房部署来达到高可用的目的。由于异地跨机房调用出现的网络延迟问题,需要确保服务消费方能优先调用相同机房的服务消费方,这就需要同机房优先路由的能力。

 

image.png

  • 标签路由:金丝雀发布的新场景。金丝雀发布一般只有新和老两个版本,标签路由可以在线上部署多个版本,每个版本都对于一个标签。

  • 全链路灰度:在业务比较复杂,服务调用链路较长的场景下,每个应用都需要设置路由规则会显得非常繁琐,全链路灰度在金丝雀/标签路由的基础上加上了 "标签透传" 的能力,让灰度流量只在灰度版本之间路由。

 

image.png

接下来我会分几篇文章详细讲一下这几个场景,今天我们先来聊聊金丝雀发布。金丝雀发布可以让我们在白天流量高峰喝着茶吃着瓜子进行线上发布,不需要在半夜为发布的事情而苦恼。

大流量下的应用部署现状

应用 Demo

Demo 以 Spring Cloud 为例,服务调用链路如下图所示:

 

image.png

流量从 Netflix Zuul 对应的 Ingress 进来,会调用 SC-A 应用对应的服务,SC-A 应用内部调用 SC-B 应用的服务,SC-B 应用内部调用 SC-C 应用的服务。SC-A 有线上版本和灰度版本这两个版本。

Helm 部署 Demo

Demo 为纯开源 Spring Cloud 架构,项目地址:https://github.com/aliyun/alibabacloud-microservice-demo/tree/master/microservice-doc-demo/traffic-management。

部署完毕后,阿里云容器服务上的工作负载情况如下:

 

image.png

我们通过 "while true; do curl http://{ip:port}/A/a;echo;done" shell 命令不断地去访问 Spring Cloud 服务,各个服务的作用仅仅是打印当前服务的IP,这样我们可以看到整体调用链路:

while true; do curl http://{ip:port}/A/a;echo;done
A[10.0.0.73] -> B[10.0.0.180] -> C[10.0.0.72]
A1[10.0.0.20] -> B[10.0.0.180] -> C[10.0.0.72]
A1[10.0.0.20] -> B[10.0.0.180] -> C[10.0.0.72]
A[10.0.0.73] -> B[10.0.0.180] -> C[10.0.0.72]
A[10.0.0.73] -> B[10.0.0.180] -> C[10.0.0.72]
A1[10.0.0.20] -> B[10.0.0.180] -> C[10.0.0.72]
A[10.0.0.73] -> B[10.0.0.180] -> C[10.0.0.72]
A1[10.0.0.20] -> B[10.0.0.180] -> C[10.0.0.72]
A[10.0.0.73] -> B[10.0.0.180] -> C[10.0.0.72]
...

从这个过程我们明显可以看出 Netflix Zuul -> SC-A 这条链路是随机访问的,由于 SC-A 的线上版本和灰度版本各只有 1 个 Pod,所以随机打印了这两个 POD 的 IP。

开源金丝雀的实现

动态路由的本质就是寻址过程中去找符合条件的实例地址。

Apache Dubbo 提供了 RouterChain 的能力去过滤 Invoker 列表,RouterChain 内部维护着 Router 列表,每个 Router 都会做过滤 Invoker 的逻辑,最后将 Invoker 列表交付给 LoadBalance 做负载均衡获取最后的 Invoker。

ScriptRouter,ConditionRouter 和 TagRouter 这些内置的 Router 内部都是 Dubbo 自带的动态路由能力。

Spring Cloud 的路由能力由 Ribbon 实现。Ribbon 设计了 ILoadBalancer 接口用于获取 Server 列表,最后将这个列表交付给 IRule 做负载均衡策略获取最后的 Server。这块在设计上跟 Dubbo 相比是有缺陷的。

Spring Cloud Ribbon 里的 ILoadBalancer 相当于是 Dubbo RouterChain 里的一个 Router,IRule 相当于是 Dubbo LoadBalance。

最新版本的 Spring Cloud 新增了 Spring Cloud LoadBalancer 组件代替 Ribbon 用于做负载均衡,Spring Cloud LoadBalancer 里的 ServiceInstanceListSupplier 用于获取实例列表信息,ReactiveLoadBalancer 使用负载均衡策略获取最后的实例。

这是 3 者对应组件的说明:

 

image.png

Apache Dubbo 虽然内置了各种 Router,但实际使用下来却有非常多的问题。比如 TagRouter 跟 IP 绑定,在 Kubernetes 下无法工作;ScriptRouter 用了 ScriptEngine 去做脚本的处理,会有性能问题;Dubbo Admin 的使用体验非常糟糕等等。

Spring Cloud 官方并没有提供动态路由的能力,只有社区上的一些开发者自己去扩展了这个能力,社区上也没有任何的 UI 交互界面。

这时候 MSE 告诉你,MSE 的微服务解决方案提供了动态路由的能力,不需要做任何的代码和配置的修改,就能使用 OPEN API 或者 UI 交互去完成金丝雀发布。只需将您的应用接入 MSE 服务治理,您就能享受到金丝雀能力。

只要你的应用是基于 Spring Cloud 或 Dubbo 最近五年内的版本开发,就能直接使用完整的 MSE 微服务治理能力,不需要修改任何代码和配置。

无需任何代码修改就可以做到动态路由的能力,这不香吗?

MSE 金丝雀能力

应用接入 MSE 即可享受 MSE 提供的动态路由能力,无需任何代码修改。

引入标签概念

MSE 引入了标签的概念,可以针对每个标签设置路由规则,满足该路由规则的流量会路由到这个标签对应的实例下。我们将 Spring Cloud Demo 进行一点改造,给 SC-A 的灰度版本打上 "blue" 标签( Helm 已经完成了这个步骤)。

 

image.png

接入 MSE 后,MSE 默认会给应用分配一个 100% 路由到未打标实例的路由规则。此时,我们继续通过 "while true; do curl http://{ip:port}/A/a;echo;done" shell 命令去执行,这个时候调用 SC-A 全部返回线上版本的 IP:

while true; do curl http://{ip:port}/A/a;echo;done
A[10.0.0.73] -> B[10.0.0.180] -> C[10.0.0.72]
A[10.0.0.73] -> B[10.0.0.180] -> C[10.0.0.72]
A[10.0.0.73] -> B[10.0.0.180] -> C[10.0.0.72]
A[10.0.0.73] -> B[10.0.0.180] -> C[10.0.0.72]
A[10.0.0.73] -> B[10.0.0.180] -> C[10.0.0.72]
...

设置金丝雀路由规则

我们在 MSE 上的应用详情页里的金丝雀 Tab 页里设置 HEADER 里 env 这个 KEY 的值为 test 的金丝雀路由条件:

 

image.png

传入 HEADER 继续使用 shell 执行:

while true; do curl -H "env:test" http://139.196.200.40/A/a;echo;done
A1[10.0.0.20] -> B[10.0.0.180] -> C[10.0.0.72]
A1[10.0.0.20] -> B[10.0.0.180] -> C[10.0.0.72]
A1[10.0.0.20] -> B[10.0.0.180] -> C[10.0.0.72]
A1[10.0.0.20] -> B[10.0.0.180] -> C[10.0.0.72]
A1[10.0.0.20] -> B[10.0.0.180] -> C[10.0.0.72]
A1[10.0.0.20] -> B[10.0.0.180] -> C[10.0.0.72]
A1[10.0.0.20] -> B[10.0.0.180] -> C[10.0.0.72]
A1[10.0.0.20] -> B[10.0.0.180] -> C[10.0.0.72]
A1[10.0.0.20] -> B[10.0.0.180] -> C[10.0.0.72]
...

这个时候我们发现满足金丝雀规则的流量都去了 SC-A 的灰度版本。

金丝雀路由规则解析

大家看到金丝雀路由规则界面上有两种分别,分别是流量比例流量规则:

 

image.png

流量规则:表示满足该规则的流量会路由到对应标签(本文使用 blue 作为灰度标签)实例上。比如本文例子中 HEADER 里 env=test 的流量一定会去 blue 标签对应的实例。

流量比例:不满足任何流量规则的流量会按照流量百分比进行路由。比如本文例子中不满足 HEADER 里 env=test 的流量会以 100% 的规则路由到未打标的实例上,由于是 100%,所以那些不满足规则的流量全部都去了未打标实例上(本文未打标表示线上版本)。

MSE 提供的流量规则里的条件支持 HEADER、Query Parameter、COOKIE 以及 Request BODY

Query Parameter、HEADER、COOKIE 和 Request Body 除了支持常规的运算符外,还支持 in(白名单),对 100 取模和百分比。这里的百分比并不是比例规则中的总流量百分比,而是指对应参数的 hash 值取模,这样就可以让固定的值永远满足路由条件(如果按照流量比例,用户 A 这次访问的是线上版本,下次可能会访问灰度版本)。举个例子,如果 HEADER 中带有用户 ID,我让想部分用户永远能够访问灰度实例,这个时候可以对用户 ID 的 hash 值取模去完成(当然,这个也可以通过白名单去操作,白名单的缺点并不随机,需要输入各个名单)。

Request Body 目前支持解析 json 字符串,比如如下字符串:

{  "a": "aa","b": [1,2,3],"c": [{"d": "dd"}],"e": {"f": "ff"}
}

JSON 访问表达式 .a 的值为 aa。
JSON 访问表达式 .b[0] 的值为 1。
JSON 访问表达式 .c[0].d 的值为 dd。
JSON 访问表达式 .e.f 的值为 ff。

总结

本文介绍了微服务治理下金丝雀发布的能力,解决了发布期间少量流量验证新功能的问题。您的应用只需接入 MSE 服务治理,无需任何操作即可享受到动态路由的能力。除了 MSE(微服务引擎),金丝雀发布还被 EDAS、SAE 等云产品集成。

原文链接

本文为阿里云原创内容,未经允许不得转载。

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

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

相关文章

匿名提问:rm -rf了怎么办?

整理 | 易璜珵出品 | 《新程序员》IT界流传着一个神秘的代码,老程序员听了总是意味深长地一笑,而新手程序员则总是手痒地想试试,那就是删库指令rm -rf。这一行代码下去,海量数据可能就荡然无存。近几年发生的“删库跑路”事件让这…

ubuntu matlab_有没有人和我一起整理Python的matlab代替

想找人一起整理Python中matlab代替的包,最好是能够将常用功能用tkinter封装起来,积少成多,逐步逼近完整。比如将scipy中的最小二乘法拟合功能,找个图形界面封装一下,就变成了曲线拟合工具,可以代替matlab的…

逸仙电商Seata企业级落地实践

简介: 本文将会以逸仙电商的业务作为背景, 先介绍一下seata的原理, 并给大家进行线上演示, 由浅入深去介绍这款中间件, 以便读者更加容易去理解 Seata 这个中间件。 作者 | 张嘉伟(GitHub ID:l…

“类云”的存储服务什么样?Pure Storage发布Pure Fusion等系列新品

一键部署自动化存储平台与云原生数据库即服务,无缝连接基础设施运营与应用程序。 编辑 | 宋慧 出品 | CSDN 云计算 近日,专为多云环境提供存储即服务的Pure Storage发布一系列现代化基础设施、运营及应用程序,这是Pure Storage迈向创新现代…

mac mongodb可视化工具_MongoDB从立地到成佛(介绍、安装、增删改查)

文章作者公众号bigsai,已收录在回车课堂,如有帮助还请不吝啬点个赞赞支持一下!课程导学大家好我是bigsai,我们都学过数据库,但你可能更熟悉关系(型)数据库例如MySQL,SQL SERVER,ORACLE等,对于非…

阿里巴巴云原生 etcd 服务集群管控优化实践

简介: 这些年,阿里云原生 etcd 服务发生了翻天覆地的变化,这篇文章主要分享一下 etcd 服务在面对业务量大规模增长下遇到的问题以及我们是如何解决的,希望对读者了解 etcd 的使用和管控运维提供经验分享。 作者 | 陈星宇&#xff…

计算机组装与维护思考问题,计算机组装与维护中的常见问题及解决方法

郜庆国摘要:在如今的社会下,各个领域的很多行业在工作的时候都需要用到计算机来帮助工作的进行,因为计算机在很多情况下都能够很好地进行计算与帮助,所以我们在进行工作时,不仅提高了工作的效率,还解决了很…

淘票票首次公开小程序开发秘籍,踩过坑才知道怎么走!

简介: 在2019年,阿里巴巴文娱的淘票票几乎涉足了当时市面上所有的小程序。在不少平台上,淘票票是阿里“第一批吃螃蟹”的技术团队。回顾过往,阿里文娱做过很多尝试,也踩过很多坑。《小程序 大世界》总结了淘票票过去 2…

stm32f407 6个串口dma_stm32之DMA

一. 对于大容量的STM32芯片有2个DMA控制器,控制器1有7个通道,控制器2有5个通道每个通道都可以配置一些外设的地址。二. 通道的配置过程:1. 首先设置CPARx寄存器和CMARx寄存器。通过DMA控制器把一个地址的值复制到另外一个地址,通过…

立足当下,塑造未来

今天,以“5G与世界同行”为主题的2021全球移动宽带论坛(Global MBB Forum)在迪拜举行。期间,华为轮值董事长胡厚崑发表了题为“立足当下,塑造未来”的主题演讲。胡厚崑指出:“5G预商用五年以来,…

jfinal html5,Jfinal框架整合webSocket技术功能实现

技术难度:简单在这里我会用最简单的方法实现JFinal框架结合webSocket最基础的功能,以至于后续业务的拓展需要小伙伴们依据实际情况去实现相应的开发!废话不多说,直接上代码!1、编写webSocket类package morality.ws;imp…

行业实战 | 5G+边缘计算+“自由视角” 让体育赛事更畅快

简介: 世界本是多维的。进入5G时代,观众对多维度视觉体验的需求日益增长,5G MEC网络与边缘计算的结合,具备大带宽、低延迟特性,使视频多维视觉呈现成为现实。在第二十三届CUBA中国大学生篮球联赛期间,中国电…

华为汪涛:走向智能世界2030,无线网络未来十年十大产业趋势

2021全球移动宽带论坛(Global MBB Forum)期间,华为常务董事、ICT基础设施业务管理委员会主任汪涛发表了题为“走向智能世界2030,无线网络未来十年十大趋势”的主题演讲。汪涛表示:“未来十年,是走向智能世界…

python怎么输入一个数字并调用_Python3 实例(一)

原标题:Python3 实例(一) Python Hello World 实例 以下实例为学习Python的第一个实例,即如何输出"Hello World!": 实例 # -*- coding: UTF-8 -*- # Filename : helloworld.py # author by : www.runoob.com…

未来教育计算机书,未来教育.全国计算机等级考试

1册图书1张光盘,轻松应对2018年一级计算机基础及MS Office应用考试 n 1.历年真题精选,全方位把握真考动向,具有练习价值 n (1)新大纲、新题型、新题库,全方位解读无纸化考试,帮助考生轻松过关。 n (2)精选2017年~2016年…

python制作简单网页_python 跑服务器,访问自己制作的简单页面

1 python 跑服务器,访问自己制作的简单页面2 # winb出现一个网址http:/0.0.1:5000/复制到浏览器查看 # http://127.0.0.1:5000/home做这个首先要安装好python的flask,前面有详细的安装步骤 具体代码如下# coding:utf-8 # Flask构造函数,从fla…

华为云专属月·行业深耕专项行动正式开启

10月15日,以“云上共创 互联网新价值”为主题的“华为云专属月行业深耕”线上发布会圆满举办。会上,华为云宣布“华为云专属月行业深耕专项行动”正式启动,本次专属月期间,华为云将面向包括电商、游戏、移动出行三大行业在内的互联…

计算机电子工程专业就业前景,就业前景好的4大类专业,电气电子类上榜,有你喜欢的吗?...

原标题:就业前景好的4大类专业,电气电子类上榜,有你喜欢的吗?行业的发展和社会的发展是紧密相连的,所以为了推动社会各个行业的发展,在大学中就会设立很多类型的专业。下面来介绍一下就业前景好的4大类专业…

Nacos 2.0 性能提升十倍,贡献者 80% 以上来自阿里之外

简介: 3 月 20 日,Nacos 2.0 正式发布。Nacos 是阿里巴巴在 2018 年开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台,也可以理解为微服务的注册中心 配置中心。 来源 | 阿里巴巴云原生公众号 3 月 20 日&#xff0c…

以系统化视角反观产品运营,解读提升用户转化的“四部曲”

简介: 正常的活动运营通常会围绕公司经营目标,针对不同性质、不同类型的活动开展工作。这样的活动一般会分四个阶段:活动准备、活动策划、活动执行与活动复盘阶段。 作者:友盟数据大使 Suffering 如今,移动互联网的红…