当前位置: 首页 > news >正文

订阅发布延时_网关实现灰度发布

一、背景互联网产品开发有个非常特别的地方,就是不停的升级,升级,再升级。采用敏捷开发的方式,基本上保持每周或者每两周一次的发布频率,系统升级总是伴随着各种风险,新旧版本兼容的风险,用户使用习惯突然改变而造成用户流失的风险,系统宕机的风险,500错误服务不可用的风险等等。为了避免这些风险,很多产品都采用了灰度发布的策略,其主要思想就是把影响集中到一个点,然后再发散到一个面,出现意外情况后很容易就回退,即使影响也是可控的。任何脱离实际业务的技术工作都是耍流氓,技术需要服务于业务。因此,本文尽量淡化了业务方面的因素,聚焦于技术层面,建议在实际运用中还是要根据各自的业务场景去变化和调整。

二、什么是灰度灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式。AB test就是一种灰度发布方式,让一部分用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。互联网系统,灰度其实就是根据设定的规则将请求路由到我们的灰度版本(灰度机器)上来。比如对于API来说,一般有如下几个需求:特定用户(比如测试帐号)、 特定的App(比如测试app或者合作App)、特定的模块、接口(只有某些接口需要灰度,这种一般是API Container的修改,拿一些不是很重要的API做灰度测试)、特定的机器(某些请求IP转发到灰度机)等。

三、灰度的优势1、 在发布过程中降低上线风险2、 降低影响范围,并且范围可控3、 降低对测试的依赖,减少线下自测的数据构造成本4、 特定的请求能够指向特定的服务器,方便集中监控日志,方便跟踪完整的调用链路5、 方便系统流量切入6、 便于随时回滚7、 指定特定人群,方便系统回访,方便产品需求收集,完善产品功能,提升产品质量8、 在无状态的情况下保障用户使用到的版本一致9、 避免宕机给用户带来不好的体验和使用

四、目标1、 做到对现有业务系统无侵入性2、 能够发挥以上提到的灰度的优势3、 发布系统的灵活配置4、 发布系统和业务系统的松耦合5、 和网关系统结合,让操作平滑

五、功能1、 路由策略管理/配置2、 灰度规则管理3、 开启/关闭开关

六、系统设计需要设计的系统分为两种场景,一种是http方式接入,需要借助网关(gate-way)去实现流量的切换,和系统路由;另一种是rpc接入(目前为dubbo),需要借助dubbo提供的负载均衡策略来实现,结合自带的qos(dubbo的在线运维命令)实现服务启动/关闭。【说明】:服务内部执行线程监控待定,sentinel 、 pinpoint or other。

1、http方式接入

f59d5b6ae23bc13a98c535822b6aab4a.png

其中分为几个重要的部分:接入层网关,接入客户端请求,根据下发的配置将符合条件的请求转发到新旧系统上.配置管理后台,这个后台可以配置不同的转发策略给接入层网关.稳定和灰度两种处理客户端请求的业务服务器.

http请求的入口都落在网关上,网关会根据管控平台(admin dashboard)的配置进行uri的选择。此时请求数据会判断当前应用是否已经开启灰度,再次判断是应用级别的灰度还是服务级别的灰度,然后根据管控平台配置的灰度策略进行灰度,可以支持白名单、权重、ip段、业务域等。管控平台会调用引擎管理执行相应的指令,进行关闭、开启、更新策略和白名单数据等,每次网关重新reload和重启时会从灰度管理系统调用接口读取配置应用的信息,加入缓存。为了提升性能,应用的基本信息、灰度策略、白名单等数据缓存在内存或者类redis这样的缓冲中,灵活的进行缓存数据的更新。实现功能:1、动态路由2、服务动态编排,实现流量的自由切换3、启服/停服4、服务自检

2、rpc(dubbo)接入

如果直接停机重启rpc service会有什么影响:服务发布时,直接重启Tomcat,导致节点正在处理的请求会受到影响,严重时会有数据异常。服务发布时如果节点正在作为task_tracker运行lts任务,会导致任务失败并retry。服务发布时如果节点正在消费RocketMQ中的消息,会导致消息消费异常,甚至进入retry或dlq队列。服务发布完成后没有即时验证机制,直接暴露给用户,如有异常影响面很广。线上无法同时存在新老版本的服务来用于长时间的验证。竟然有这么多问题,想想就可怕,泪崩~,因此必须想法优雅的实现服务的启停,因此引出dubbo 服务的持续发布:c02c0e0de43e59f991ab9887c6f88ce4.pngdubbo-consumer实现不同的负载均衡,在负载的时候进行白名单校验和策略选择。系统对灰度管控平台非强制依赖,管控平台出现问题不影响系统正常运行。负载动态路由,阻止后续流量进入,监控服务是否还有执行的线程,加入钩子offline服务或者接口,进行服务升级,自检,启动online,接入负载均衡。

由于很多接口都有在Dubbo中进行注册,因此需要有办法能够对其Provider Service接口进行下线或屏蔽,使其不提供服务,即其它服务无法调用它的接口。Service接口下线后,此consumer机器自然无任何流量流入,因此也无流量返回,达到下线consumer机器的目的,然后即可部署代码。官方有提供Dubbo-Admin工具,用于对Dubbo中各APP及其Service接口进行管理,里面自然也包含有实现下线的功能,可以有3种方法:屏蔽,貌似一直没有效果(尴尬);禁用,可以成功禁用;权重调节,可以设置0-100的权重,设置为0时即不提供服务。

6d036181feb2e1315cb1bb45a9a05693.png经过权重调节方案,通过Dubbo-Admin对需要下线机器的APP应用接口权限设置为0。

实现的功能:1、缓存负载策略在系统启动的时候要根据系统配置拉取灰度策略,并且保存在内存中,定时获取最新的负载策略,需要提供及时触发的策略更新接口。2、 负载均衡在系统上线之前选择运行时使用的负载均衡进行调用。3、系统配置系统在上线前需要录入管控平台,并且完成相应的配置,在启动的时候作为唯一标识能够拉取相应的配置。4、监控和统计系统在内存中缓存统计信息,定时上传管控平台,监控出现问题不影响系统正常使用(sentinel,or dubbo-amdin模块扩展)。5、qos运维工具系统的启动使用qos,停服采用延时关闭结合jvm钩子。

七、检查机制

为了平滑发布的顺利进行,检查确认机制不可或缺,即确保Dubbo/Http中的下线都已生效,并且无流量发生,我们从以下两个维度去检查:

接口检查,调用Dubbo、Http的API接口,检查业务服务机器状态,是否为已经下线。当然,在做了下线功能的同时,我们也有检查功能和上线功能,可供调用。监控检查,调用监控平台(ELK)的API接口,检查业务服务机器的请求访问数和日志流量是否都已经为0,已经处于下线状态。经过上述改造后,我们新的发布流程如下,基本解决了平滑发布问题,发布时对业务的影响降到了最低;

八、停服/启服后小范围验证1.灰度验证--不影响线上用户2.部分实例发布-- 导部分流量到新实例(可通过网关路由规则:用户ID取模,区域限制等等)3.全部发布


欢迎关注运维自研堂订阅号,运维自研堂是一个技术分享平台,主要是运维自动化开发:linux、python、django、saltstack、tornado、bootstrap、redis、golang、docker、etcd、k8s、ci/cd、devops等经验分享。

  • 容器平台自动化CI/CD流水线实操

  • 云原生语义化 CI/CD最佳实践

  • 【提速500%】让Drone飞起来

  • 小孩子也能看懂的kubernetes教程

  • 谷歌开源 Kubernetes 原生 CI/CD 构建框架 Tekton

  • 架构师是怎么炼成的

  • IPv6时代对业务的挑战

  • 如何打造一个安全稳定高效的容器云平台

  • 深入理解无服务器架构(Faas/Serverless)

  • CI/CD 场景价值

  • 云原生架构及设计原则

  • Jira与Zabbix结合

  • 【Zabbix】告警事件归档与提取

  • 【HMonitor】Zabbix告警管理平台

  • Zabbix 告警收敛

  • Zabbix v3.0微信报警及API使用

  • zabbix v3.0安装部署及使用

  • Web权限设计

  • 搭建 kubernetes 容器编排平台

  • 区块链入门教程

  • 基于Gogs+Drone搭建的私有CI/CD平台

  • WEB架构设计心得

  • Docker与CI/CD

  • 【实战篇】Docker的CI/CD流水线实践

  • 基于 Harbor 搭建 Docker 私有镜像仓库

  • 利用helm部署应用到kubernetes

开源    创新     共享

投稿&商务合作

Mail:idevops168@163.com       QQ:785249378     微信:Idevops001

88b7aac8a9087d2c74001a4c41ea7241.gif

牛人并不可怕,可怕的是牛人比我们还努力!

63e035669bdfdfe46f54ace41a59d423.png

长按图片,识别加入我们!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 本地引入bootstrap_如何引入 Spring Cloud AliCloud ACM
  • Windows XP 中提供的快捷键列表[比较全]
  • python is beautiful_Python学习之beautifulsoup4库的使用
  • Sysinternals Suite 工具下载
  • python朋友圈广告怎么这么火_利用Python让你的微信朋友圈与众不同,更加高大上...
  • 这个世界,有点创新真难啊
  • python2和python3的不同点_Django python2和python3的区别
  • 笑林广记
  • python绘图库seaborn_Python 绘图总结(seaborn库的使用) (上)
  • ITCAST心法第2讲:“学”“问”之道
  • 2字节取值范围_c++的变量类型的数值范围(常用)
  • extremecomponents使用struts2国际化信息的方法
  • 如何快速找到package里的main_餐饮加盟行业如何快速找到精准客户?
  • 数据库事务性操作
  • python random库全部_python常用库之random
  • 【前端学习】-粗谈选择器
  • dva中组件的懒加载
  • ES6之路之模块详解
  • jquery cookie
  • mockjs让前端开发独立于后端
  • MySQL数据库运维之数据恢复
  • scala基础语法(二)
  • 不上全站https的网站你们就等着被恶心死吧
  • 高度不固定时垂直居中
  • 构建工具 - 收藏集 - 掘金
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 为视图添加丝滑的水波纹
  • 最近的计划
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • !!java web学习笔记(一到五)
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #传输# #传输数据判断#
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)jQuery 基础
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • ******IT公司面试题汇总+优秀技术博客汇总
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .NET 中 GetProcess 相关方法的性能
  • .NET成年了,然后呢?
  • []T 还是 []*T, 这是一个问题
  • []利用定点式具实现:文件读取,完成不同进制之间的
  • [20171106]配置客户端连接注意.txt
  • [Algorithm][动态规划][路径问题][不同路径][不同路径Ⅱ][珠宝的最高价值]详细讲解
  • [android] 手机卫士黑名单功能(ListView优化)
  • [AutoSar]BSW_OS 01 priority ceiling protocol(PCP)
  • [bzoj2957]楼房重建
  • [c]统计数字
  • [CareerCup] 14.5 Object Reflection 对象反射