最新要闻
- 每日热议!刘洋一杆领跑资格考试36洞 四人并列第二
- 天天热议:曾凭五菱宏光MINI EV火爆出圈 小米汽车营销负责人周钘离职
- 全球限量1962台!徕卡推出D-Lux7 “007”限量版相机:售价达16800元
- 全球最资讯丨《嗜血印》魅魔DLC完善更新 新增魅魔纹和性感尾巴
- 全球热点!抄底手慢无:南国生椰拿铁33.9元起32杯(赠冰川杯)
- 热推荐:不满足于对话!微软希望ChatGPT控制机器为人服务
- 世界即时看!小米智能工厂二期项目主体结构已封顶:年底竣工交付
- 全球热消息:小米汽车明年量产!雷军晒新到手礼物:F1传奇设计师自传
- 世界百事通!博主实探上海巴奴火锅店:土豆11元6片 换算下来45元1斤
- 加密劫持病毒现身苹果macOS:盗版软件成主要途径
- 努比亚Z50 Ultra官宣:真全面屏!
- 全球速递!巴克利:湖人把一切归咎于威少会让他愤怒 在快船有最佳夺冠机会
- 全球今亮点!《霍格沃茨之遗》温咖癫啦维欧萨
- 最快2025年商用!日本飞行汽车载人试飞成功:机体中国造
- 老人推倒摩托后去世 继承人被起诉背后:老人是惯犯 车主不能忍
- 全球短讯!衡水新型冠状病毒肺炎疫情:2月24日衡水疫情最新消息今天数据统计情况通报
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
【网关开发】9.Openresty 自定义流量分流策略支持灰度(金丝雀)等发布业务场景
- 背景
- 发布模式
- 蓝绿发布
- 金丝雀发布
- 滚动更新
- 实现原理
- 架构图
- 流程说明
- 核心代码
- 数据结构
- 流量标记
- 代理策略
- 测试
- 总结与思考
- 优先级
- 扩展
背景
随着云技术和基础架构的成熟,发布过程中可以通过引入相应的发布策略,能让我们在早期实验阶段就可以发现、调整问题,来保证整体系统的稳定性网关作为流量入口,要求有能力进行流量分流配置支持各种灰度发布、金丝雀发布、滚动更新等模式
(资料图)
发布模式
蓝绿发布
通过部署两套环境来解决新老版本的发布问题,流量逐渐的从老系统切换到新系统中,同时保持两个系统中在线,同时切换
金丝雀发布
是灰度发布的一种实现,部署的时候让一小部分用户先试用功能 ,通过日志监控或者服务器监控,或新用户的反馈。如果没有严重问题,尽快部署这个新版本,否则快速回滚,小代价去试错
滚动更新
一般是取出一个或者多个服务器停止服务,执行更新,并重新将其投入使用
实现原理
分成标记和代理策略两部分,标记是根据用户的header中key或者IP等特征,对流量进行标记,代理策略则根据用户的标记值选择对应的机器列表,实现特定的用户访问特定的机器
架构图
流程说明
金丝雀与灰度的流量原理一致1.云平台开始进行金丝雀发布,一般新启动一个POD,将机器元数据增加标签(runtime:v1.0.0)2.通知网关管理后台增加流量规则3.网关管理后台将数据写入etcd,etcd推送给所有网关节点的openresty更新配置4.特殊用户访问请求会将这部分流量进行标记,标记结果是将header中会带有特殊的值5.在负载均衡模块会将标签特殊值与带有元数据标签的机器进行选择。
核心代码
本次代码库:https://github.com/zhaoshoucheng/openresty/blob/main/pkg/lua_script/upstream/traffic_policy.lua在设计上实现两种标记方式一种是
- 流量分组:一个流量只能有一个分组,多个分组之间的流量是相互独立
- 流量标签:一个流量可以有很多个标签。所以流量可以在多个标签间共用。
数据结构
流量标记set_group 是分组标记 所有ip是10.99.4.179会被标记成gray分组set_tag 是标签标记 所有header中带有x-canary-test:test 会打上标签ruversion:ruversion_server_test
{"available_domain": ["server_test.com", "server_test1.com"],"name": "server_test","rules": [{"actions": {"action": "set_group","value": "gray"},"key": "","op": "equal","type": "ip","value": "10.99.4.179"}, {"actions": {"action": "set_tag","key": "ruversion","value": "ruversion_server_test"},"key": "x-canary-test","op": "equal","type": "headers","value": "test"}]}
代理策略当分组是gray,则匹配元数据traffic_strategy:gray的机器
{"apply_on": ["server_test.com", "server_test1.com"],"enabled_when": {"match_group": "gray","match_tags": {}},"endpoint_metadata_match": {"traffic_strategy": "gray"},"name": "server_test_match_group"}
当标记的标签是ruversion:ruversion_server_test,则匹配元数据app_version:server_test-v1.0.0的机器
{"apply_on": ["server_test.com", "server_test1.com"],"enabled_when": {"match_group": "","match_tags": {"ruversion": "ruversion_server_test"}},"endpoint_metadata_match": {"app_version": "server_test-v1.0.0"},"name": "server_test_match_tags"}
机器元数据信息metadata中保存的标签
{"endpoints": [{"address": "10.218.22.239:8090","metadata": {"app_version": "server_test-v2.0.0","traffic_strategy": "gray",},"modify_date": 0,"state": "up","weight": 1}, {"address": "10.218.22.246:8090","metadata": {"app_version": "server_test-v1.0.0","traffic_strategy": "default",},"modify_date": 0,"state": "up","weight": 1}]}
剩下的就是通过程序,把这些关联起来
流量标记
apis.conf 配置access_by_lua_block阶段需要调用的lua块
access_by_lua_block {require "upstream.traffic_policy".do_coloring()}
元表数据结构 _coloring_policy 标记配置,proxy_policy代理策略配置
function _M.new(opt) return setmetatable({ _coloring_policy = {}, -- map[domain]coloring policy _proxy_policy = {}, -- map[domain]proxy policy _etcd_revision = "0", }, _MT)endlocal function do_coloring(self) if not coloring_policy then return end local policy = coloring_policy:get_coloring_policy() -- 根据域名获取配置 if not policy then return end local parts = { } local rules = policy.rules for i = 1, #rules do local rule = rules[i] local cond = rule.op if not cond then return "invalid rule op `"..tostring(rule.op).."`" end local _match = false if rule.type and rule.type == "headers" then local headers = ngx.req.get_headers() if headers[rule.key] and headers[rule.key] == rule.value then _match = true end end if rule.type and rule.type == "ip" then if ngx.var.remote_addr == rule.value then _match = true end end -- TODO 可以添加其他条件 local actions = rule.actions if _match then if actions.action == "set_group" then ngx.req.set_header("X-Traffic-Group", actions.value) end if actions.action == "set_tag" then table.insert(parts, actions.key.."="..actions.value) end end end if #parts ~= 0 then ngx.req.set_header("X-Traffic-Metadata", table.concat(parts, "; ")) endend
测试经过流量标记后,header中的值,命中两种不同的规则grouptag
代理策略
代理策略主要是根据流量标记,选择合适的机器列表,传给负载均衡模块upstream_context.lua 调用方
-- 将所有机器列表输入,选择合适的机器输出local ups_nodes = traffoc_policy:do_proxy(self._ups.nodes)
traffic_policy.lua
local function do_proxy(self, nodes) if not coloring_policy then return end local policies = coloring_policy:get_proxy_policy() --根据域名选择对应的策略 if not policies then return nodes end return _match_metadata(policies, nodes) endlocal function _match_metadata(policies, nodes) local headers = ngx.req.get_headers() local header_traffic_group = headers["x-traffic-group"] -- 查看分组标记 local header_traffic_tags = get_header_metadata(headers["x-traffic-metadata"]) -- 标签标记 local endpoint_match = {} for i = 1, #policies do local policy = policies[i] local enabled_when = policy["enabled_when"] if not enabled_when then break end if enabled_when["match_group"] ~= "" and header_traffic_group and enabled_when["match_group"] == header_traffic_group then -- group 检测命中 endpoint_match = policy["endpoint_metadata_match"] break end if not header_traffic_tags then goto continue end if enabled_when["match_tags"] and enabled_when["match_tags"] ~= {} then for key, value in pairs(enabled_when["match_tags"]) do if header_traffic_tags[key] ~= value then goto continue end end -- tag 检测命中 endpoint_match = policy["endpoint_metadata_match"] break end ::continue:: end local match_nodes = {} for i = 1, #nodes do -- 选择机器 local metadata = nodes[i]["metadata"] for key, value in pairs(endpoint_match) do if metadata[key] ~= value then goto nextnode end end table.insert(match_nodes, nodes[i]) ::nextnode:: end return match_nodesend
测试
策略命中与机器选择标记分流方式分组分流方式
总结与思考
最核心的功能是如何使流量分流,也就是特殊的流量转发到特殊的机器,只有可以控制流量的分流才有后续的灰度发布、金丝雀发布、滚动更新等业务场景。所以所有的流量标记、代理策略实际上都是在实现流量动态分流的功能。
优先级
本文只是为了理解流量分流策略,实际在匹配会有优先级来控制匹配过程
扩展
把思路打开,实际上流量标记就是识别流量,在header中添加数据,代理策略就是根据header中选择机器,两个也不一定成对使用,也可以单独进行配置使用,实现更复杂和独特的业务场景。
【网关开发】9.Openresty 自定义流量分流策略支持灰度(金丝雀)等发布业务场景
每日热议!刘洋一杆领跑资格考试36洞 四人并列第二
天天热议:曾凭五菱宏光MINI EV火爆出圈 小米汽车营销负责人周钘离职
全球限量1962台!徕卡推出D-Lux7 “007”限量版相机:售价达16800元
全球最资讯丨《嗜血印》魅魔DLC完善更新 新增魅魔纹和性感尾巴
全球热点!抄底手慢无:南国生椰拿铁33.9元起32杯(赠冰川杯)
热推荐:不满足于对话!微软希望ChatGPT控制机器为人服务
网络时间同步设备(时钟同步)产品的功能及技术参数
每日简讯:MegEngine 使用小技巧:使用 Netron 实现模型可视化
环球今日讯!切换页签,再切换回来,v-tooltip会一直显示问题
世界即时看!小米智能工厂二期项目主体结构已封顶:年底竣工交付
全球热消息:小米汽车明年量产!雷军晒新到手礼物:F1传奇设计师自传
世界百事通!博主实探上海巴奴火锅店:土豆11元6片 换算下来45元1斤
加密劫持病毒现身苹果macOS:盗版软件成主要途径
努比亚Z50 Ultra官宣:真全面屏!
全球速递!巴克利:湖人把一切归咎于威少会让他愤怒 在快船有最佳夺冠机会
全球今亮点!《霍格沃茨之遗》温咖癫啦维欧萨
最快2025年商用!日本飞行汽车载人试飞成功:机体中国造
天天最资讯丨记Cucumber行为驱动测试的简单配置与使用方式
老人推倒摩托后去世 继承人被起诉背后:老人是惯犯 车主不能忍
【全球独家】读Java实战(第二版)笔记19_尾声
全球短讯!衡水新型冠状病毒肺炎疫情:2月24日衡水疫情最新消息今天数据统计情况通报
全球即时:搜狗输入法UOS版上架统信UOS:适配龙芯LoongArch等架构
每日短讯:干翻 nio ,王炸 io_uring 来了 !!(图解+史上最全)
全球快看:CPU推理|使用英特尔 Sapphire Rapids 加速 PyTorch Transformers
世界视点!死锁面试题
18、实体类对象比对-JSON
产品经理,项目经理,FTO
当前最新:《狂飙》取景地拍照收费摊主已搬离:没给续签合同
环球速看:索尼A7M4将发布2.0固件 或下放部分索尼A7R5功能
80%的人出错了 你的数码相机用对了吗?
全球热讯:爱奇艺奇迹一般的赚钱了!但是 就这它也好意思?
快看点丨AMD Zen4锐龙9 7945HX大放异彩!16核心打平Intel 24核心
世界今头条!长色斑的原因有哪些_脸上为什么会长色斑
热门:007 - 研究
每日信息:47.多态
第二章 物理层
day02-自己实现Mybatis底层机制-01
世界快资讯:CSS背景设置与Emmet语法
环球观焦点:AMD发布23.2.2版驱动:RX 7900显卡小打鸡血 性能提升14%
天天最新:大理州5个新能源装备制造项目投产
深圳一外卖小哥疑送餐时猝死:曾拼命跑上六楼
环球热头条丨向上捅破天 吉利银河支持低轨卫星技术:全球无盲区定位
13代酷睿i9+满血4060显卡!华硕天选4正式开售 到手价8999元
当前短讯!造车新势力 电动自行车品牌“VELOTRIC”A轮融资:获5000万元
中疾控提醒:近期水痘处于高发期 要注意做好防护!
13代酷睿+RTX 4060!七彩虹将星X16 Pro图赏
19999元起 雷蛇推出2023款灵刃15游戏本:i7+RTX 4060
股价大涨7% 阿里发布Q3财报:营收2477.6亿 利润超456亿
全球快报:第八章 从源文件到可执行文件
天天通讯!《黑豹》《蚁人》皆扑街 漫威超级英雄为何在国内失宠?
男子一脚急刹车醒来直接四肢瘫痪 医生提醒:车祸受伤后别随意拖拽
焦点快看:系列首次支持:三星Galaxy Tab S9平板终于支持IP67防水
每日热文:三星S23首销:仅重168g的骁龙8 Gen2旗舰 屏幕比小米13更小
涨价2000只是开胃菜!销售:特斯拉还要涨价
全球今热点:电工化身“Tony”,为留守老人解决“头”等大事
环球聚焦:邓超谈《中国乒乓》排片少:大家的不容易我非常理解
今亮点!摩根大通已限制员工使用ChatGPT:数据安全更重要
世界视讯!我国第三款国产ECMO产品获批上市:性能达到国际水平
全球即时:月薪4万招人去非洲养鸡当场长?企业回应:环境艰苦 不招年轻人
当前焦点!Windows 上 Docker 部署 MongoDb 并构建数据持久化
2022最新整理iOS app上架app详细教程
webrtc QOS笔记二 音频buffer数据不足生成很多gap的问题
当前最新:记录--前端项目中运行 npm run xxx 的时候发生了什么?
前沿资讯!科考中的意外收获!中国科学家在非洲发现消失百余年的濒危植物
天天速读:极氪001再遭奇葩故障:中控黑了、仪表花了、HUD“涂马赛克”
刚买两个月的谷歌Pixel 7 Pro翻车:绿屏无响应 用户绝望了
世界今头条!《和平精英》将推出开放世界玩法“绿洲世界” 能发射火箭
焦点信息:连过三科!新疆小伙1天拿到驾驶证
今日热议:低代码选型,论协同开发的重要性
【JVM】运行时内存分配
opencv-python 批量更改图像分辨率并且保留图像原有的透明度
热点!数据库概念
世界滚动:k8s~ingress限流机制
全球即时看!方正证券研究报告:行到水穷处,坐看云起时
环球快资讯丨不怕零下40℃极寒!我国复兴号高寒智能动车组投入运行
天天播报:为防员工摸鱼办公桌旁装监控 员工:很无语、感觉没隐私
《王者荣耀》花木兰新皮肤明日上线:143元 美背歌姬
世界时讯:海底捞回应禁止自带菜:可自带酒水饮品
天天短讯!RTX 4090高画质如何?《原子之心》PC平台性能分析:多配置流畅运行
【世界热闻】单特征线性回归
全球实时:为什么说《ps1屠龙刀》是awk、sed的恩人?
天天最资讯丨C语言在线代码运行编译工具推荐
全球快播:联想首款GeekPro游戏本真机公布:1TB SSD 超高性价比
环球微头条丨我国研发人员总量稳居世界首位 顶尖科技人才加速涌现
跑着跑着天窗会掉 奔驰中国召回超2万辆汽车
68岁成龙18年后再拍《神话2》 定名《传说》 古力娜扎主演
观速讯丨外卖员穿工装禁入成都高端商场 成都SKP回应:内部规定
焦点日报:135期 手绘汽车壁纸|插画 卫士还是老款好看 路虎卫士无水印手机壁纸
每日快讯!手把手教你为基于Netty的IM生成自签名SSL/TLS证书
当前热门:《我想进大厂》之Spring夺命连环10问
《分布式技术原理与算法解析》学习笔记Day20
世界看点:数据治理如何做?火山引擎DataLeap帮助这款产品3个月降低计算成本20%
世界今头条!装饰器设计模式这样学,保你必懂!
当前速讯:手机端ChatGPT搜索来了!微软2周火速上线 @Bing即用
多辆房车霸占高速服务区露营:有车主搭帐篷还晒咸菜
魔兽等游戏停服一个月 暴雪真不着急:两家中国公司抢破头
P1219 [USACO1.5]八皇后 Checker Challenge
世界新资讯:Java单元测试浅析(JUnit+Mockito)
81python装饰器