分享一个简单的前端灰度系统

本篇文章给大家带来了关于前端的相关知识,其中主要跟大家分享一个简单的前端灰度系统,并且介绍这个系统怎么写的?感兴趣的朋友下面一起来看一下吧,希望对大家有帮助。

写在前面的话

灰度这个概念,来自数字图像领域,最初是描述黑白数字图像的灰度值,范围从 02550 表示黑色,255 表示白色,中间的数值表示不同程度的灰色。

灰度系统的诞生源于交叉学科的建设,在互联网上也不例外。对于一个软件产品,在开发和发布的时候肯定希望用户能够顺利的看到想让其看到的内容。但是,发布没有一帆风顺的,如果在发布的某个环节出了问题,比如打错了镜像或者由于部署环境不同触发了隐藏的bug,导致用户看到了错误的页面或者旧的页面,这就出现了生产事故。为了避免这种情况出现,借鉴数字图像处理的理念,设计师们设计出了一种介于 01 之间的过渡系统的概念:让系统可以预先发布,并设置可见范围,就像朋友圈一样,等到风险可控后,再对公众可见。这就是灰度系统。

灰度系统版本的发布动作称作 灰度发布,又名金丝雀发布,或者灰度测试,他是指在黑与白之间能够平滑过渡的一种发布方式。在其上可以进行A/B testing,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。(概念来自知乎)

立即学习“前端免费学习笔记(深入)”;

对于前端领域,演进到现在,灰度系统主要有如下几点功能:

增量灰度:小的patch可以增量的添加在发布版本上,也可以通过开关一键关闭用户灰度:增量和全量版本都可对不同群体或者某几个特定的用户进行灰度可见版本回退:每一个版本都在灰度系统里可见,可以一键回退

前端灰度系统工作流程图如下:

sequenceDiagram前端项目-->灰度系统: 部署阶段前端项目->>灰度系统: 1.CI 写入打包资源前端项目->>灰度系统: 2.CI 打包完成后更新资源状态前端项目-->灰度系统: 访问阶段前端项目->>灰度系统: 1.页面访问,请求当前登录用户对应的资源版本灰度系统-->>前端项目: 2.从对应版本的资源目录返回前端资源

灰度规则

关于灰度资源优先级的说明如下:

灰度策略 优先级

未生效低生效高全量一般

如此就起到了灰度的作用:全量表示所有人都可以看;生效表示只有在规则中的用户才可以看到这部分增量更新,优先级最高;未生效表示不灰度,优先级最低。

灰度系统数据库设计

为什么灰度系统有后端:前端项目 CI 部署后,会产生一个 commit 号和一个镜像记录,并且打包后的文件存放在服务器中某一个深层的文件夹目录中,灰度系统需要存入该部署的目录地址,便于在切换灰度时查找不同版本的文件。

先介绍一个要部署的前端项目(你可以根据自己的前端项目动态调整)。

本项目针对的前端项目是一个基于微服务架构的项目,

下面是设计ER图:

image.png

我们依此来分析:

子项目表

该表用于存放所有子项目的信息,新建一个微服务子项目时,会在这个表里新建一个条目,数据示意如下:

image.png

灰度用户表

用于灰度系统登录的用户,拥有灰度权限的人才可以加入。

资源表

资源表存放项目在 CI 中写入的 commit 信息和 build 完以后在服务器的存放位置,数据示意如下:

image.png

其中 branch 是跑CI的分支,data 存放打包资源目录信息,一般结构如下:

image.png

gitProjectId 存放该产品在 gitlab 中的项目号, status 表示构建状态:0:构建完成 1:部署完成 2:构建失败,3:部署失败。

这里简单提一下 CI 是如何写入灰度系统数据库的,过多详情不做解释,写入数据库方式很多,这只是其中一种实现方式。

首先在 CI build 环节往服务器写入打包信息的 JSON:

image.png

其中 build.sh 负责把传入的参数写到一个 json 中。

在 CI 部署环节,通过调用脚本创建资源:

image.png

其中 run_gray.js:

const { ENV, file, branch, projectId, gitProjectId, user, commitMsg } = require('yargs').argv;axios({    url: URL,    method: "POST",    headers: {        remoteUser: user    },    data: {        Action: "CreateResource",        projectId,        branch,        commitMsg,        gitProjectId,        channel: Channel,        data: fs.readFileSync(file, 'utf8'),        status: "0"    }}).then(...)

其中 status 的变化,在 CI 部署服务器完成后,追加一个 UpdateResource 动作即可:

简单听记 简单听记

百度网盘推出的一款AI语音转文字工具

简单听记 269 查看详情 简单听记

if [[ $RetCode != 0 ]]; then curl "$STARK_URL" -X 'POST' -H 'remoteUser: '"$GITLAB_USER_NAME"'' -H 'Content-Type: application/json' -d '{"Action": "UpdateResource", "id": "'"$ResourceId"'", "status": "2"}' > test.log && echo `cat test.log`; fi

灰度策略表

灰度策略是对灰度资源的调动配置。其设计如下:

image.png

其中,prijectId 表示灰度的项目,resourceId 表示使用的资源,rules 配置了对应的用户或用户组(看你怎么配置了,我这里只配置了单独的 userId),status 是灰度的状态,我设置了三种:

default: 未生效failure: 生效success: 全量

状态生效表示是增量发布的意思。

到这里,数据库设计就完毕了。

灰度系统接口API开发

有了数据库,还需要提供能够操作数据库的服务,上边创建资源的接口就是调用的灰度自己的API实现的。主要的API列表如下:

名称 描述

getResourcesByProjectId获取单个产品下所有资源getResourcesById通过主键获取资源createResource创建一个资源updateResource更新一个资源getIngressesByProjectId获取单个产品下灰度策略任务列表getIngressById通过主键获取单个灰度策略任务详情createIngress创建一个策略updateIngress更新一个策略

剩余的接口有用户处理的,有子项目管理的,这里不做详述。除了上边的必须的接口外,还有一个最重要的接口,那就是获取当前登录用户需要的资源版本的接口。在用户访问时,需要首先调用灰度系统的这个接口来获取资源地址,然后才能重定向到给该用户看的页面中去:

名称 描述 接收参数 输出

getConsoleVersion获取当前用的产品版本userId,productsresource键值对列表

getConsoleVersion 接受两个参数,一个是当前登录的用户 ID, 一个是当前用户访问的微服务系统中所包含的产品列表。该接口做了如下几步操作:

遍历 products,获取每一个产品的 projectId对于每一个 projectId,联查资源表,分别获取对应的 resourceId对于每一个resourceId,结合 userId,并联查灰度策略表,筛选出起作用的灰度策略中可用的资源返回每一个资源的 data 信息。

其中第三步处理相对繁琐一些,比如说,一个资源有两个起作用的灰度资源,一个是增量的,一个是全量的,这里应该拿增量的版本,因为他优先级更高。

获取用户版本的流程图如下:

graph TD用户登录页面 --> 获取所有产品下的资源列表获取所有产品下的资源列表 --> 根据灰度策略筛选资源中该用户可用的部分 --> 返回产品维度的资源对象

最后返回的资源大概长这个样子:

interface VersionResponse {    [productId: number]: ResourceVersion;}interface ResourceVersion {    files: string[];    config: ResourceConfig;    dependencies: string[];}

其中 files 就是 JSON 解析后的上述 data 信息的文件列表,因为打包后的文件往往有 css和多个js。

至于这个后端使用什么语言,什么框架来写,并不重要,重要的是一定要稳定,他要挂掉了,用户就进不去系统了,容灾和容错要做好;如果是个客户比较多的网站,并发分流也要考虑进去。

前端页面展示

前端页面就随便使用了一个前端框架搭了一下,选型不是重点,组件库能够满足要求就行:

登录

image.png

查看资源

image.png

配置策略

image.png

image.png

部署以后,实际运行项目看看效果:

image.png

可以看到,在调用业务接口之前,优先调用了 getConsoleVersion来获取版本,其返回值是以产品为 key 的键值对:

image.png

访问转发

这里拿到部署信息后,服务器要进行下一步处理的。我这里是把它封装到一个对象中,带着参数传给了微服务的 hook 去了,可以期待一下后续的手写一个前端微服务的系列文章;如果你是单页应用,可能需要把工作重心放在 Nginx 的转发上,通过灰度系统告知转发策略后,Nginx负责来切换路由转发,可能只是改变一个路由变量。 (你也可以参照我 nginx 相关文章),下面我简单的给个示意图:

graph TD灰度系统配置灰度策略 --> 告知Nginx资源地址 告知Nginx资源地址 --> Nginx服务器配置资源转发

总结

前端灰度系统,其实就是一个后台管理系统。他配置和管理了不同版本的前端部署资源和对应的用户策略,在需要的时候进行配置。

接下来的文章我会配套性的讲一下 NginxDocker 的前端入门使用,敬请期待!

推荐学习:《web前端开发》

以上就是分享一个简单的前端灰度系统的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/542618.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月9日 15:59:49
下一篇 2025年11月9日 16:00:49

相关推荐

  • 以太坊在企业级应用中的潜力

    在数字经济浪潮席卷全球的当下,区块链技术作为底层基础设施,正以前所未有的速度改变着各个行业。其中,以太坊作为最成熟、最活跃的公链生态之一,其在企业级应用中的潜力吸引了无数目光。它不仅仅是一种加密货币,更是一个可编程的区块链平台,为开发者提供了构建去中心化应用(dapp)的强大工具。那么,以太坊究竟如…

    好文分享 2025年12月9日
    000
  • 什么是DApp?它和我们手机上的App有什么不一样?

    binance币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币交易所: 注册入口: APP下载: DApp,即去中心化应用,它运行在区块链或P2P网络上,而非传统中心化服务器。其核心优势在于公开透明、不可篡改且抗审查,这与我们日常使用的App有本质区别。 核心架…

    2025年12月9日
    000
  • Avantis(AVNT)币是什么?怎么买?AVNT工作原理、代币经济学及未来展望

    avantis (avnt)一经推出,便在upbit、bithumb和币安等主流虚拟资产交易所上市,价格较上市价飙升逾 80%,引发市场广泛关注。avantis 是一家基于 coinbase 区块链平台“base”构建的去中心化交易所,提供多种资产类别的永续期货交易,包括虚拟资产、原材料和金属,并以…

    2025年12月9日 好文分享
    000
  • 以太坊生态应用:DApp世界的无限可能

    以太坊作为区块链技术的开创者之一,其生态系统正在以前所未有的速度扩张,而其中最引人注目的莫过于dapp(去中心化应用)的蓬勃发展。dapp不仅是区块链技术应用落地的核心体现,更是预示着一个由智能合约驱动、用户拥有数据主权的全新互联网时代的到来。它们摆脱了传统中心化平台的束缚,通过代码强制执行协议,确…

    好文分享 2025年12月9日
    000
  • 以太坊智能合约:代码即法律的实现

    在数字世界的核心,以太坊智能合约正在重塑我们对信任、协议和法律的理解。它们不仅仅是代码片段;它们是自我执行的协议,其条款直接写入代码。这种创新理念颠覆了传统合同的概念,将人类解释的模糊性降到最低,并用确定性取而代之。想象一下,一个协议一旦达成,就能自动执行其所有条款,无需中介,无需律师,也无需担心某…

    好文分享 2025年12月9日
    000
  • Synthetix (SNX)币飙升80%:SNX会推出以太坊上的首个Perps DEX 吗?

    链上永续合约在2025年再次成为焦点,开发者们正在寻求一种具有类似clob执行方式的主网结算设计。 Binance币安 欧易OKX ️ Huobi火币️ Synthetix (SNX)正在为那一刻做准备:链下订单匹配、在以太坊上进行链上结算,并计划于2025年第四季度推出直接创建在L1上的永续合约D…

    2025年12月9日 好文分享
    000
  • Zora ($ZORA)是什么?怎么买?ZORA价格预测2025, 2026–2030

    Binance币安 欧易OKX ️ Huobi火币️ Zora是什么以及为何重要 ‍ Zora (ZORA) 是一个专为创作者、艺术家和文化社区打造的 以太坊二层(L2)区块链和NFT协议 。其使命简单而革命性: 让所有人都能轻松铸造、收集和交易NFT — 无需承担传统平台的高昂gas费用或面对准入…

    2025年12月9日 好文分享
    000
  • ChainOpera AI (COAI) 币是什么?COAI代币经济学、未来前景及价格预测

    Binance币安 欧易OKX ️ Huobi火币️ ChainOpera AI(COAI)于2025年10月9日在Bitget等主流交易所上线USDT计价(U标)永续期货交易,引起市场关注。 ChainOpera AI(COAI)是一个运行在BNB链上的去中心化AI代理网络,COAI是其原生代币。…

    2025年12月9日
    000
  • ETH智能合约怎么用 ETH智能合约使用方法

    1、币安binance 2、欧易okx 3、火币HTX 4、大门Gate.io 以太坊(ETH)智能合约是自动执行的链上代码,它驱动着去中心化应用(DApp)的运行。本文将为您揭示与这些智能合约交互的基本流程,通过清晰的步骤,帮助您安全、高效地使用基于以太坊的各项服务,轻松踏入去中心化世界的大门。 …

    2025年12月9日
    000
  • Enso(ENSO)币是什么?如何领取?ENSO代币经济与未来发展介绍

    目录 Enso(ENSO)最新动态Enso是什么Enso核心能力快捷引擎和原子执行统一 API/SDK 和多链读写实际用例和规模开发人员入职和集成路径三步快速集成何时选择 EnsoENSO币是什么ENSO代币经济基本面和通货膨胀跨链和可用性分配生态系统进展风险和限制路线图常问问题关键要点 enso …

    2025年12月9日 好文分享
    000
  • Token 2049圆桌会议 索拉纳币(Sol)的金库押注:从资产负债表到生态飞轮

    目录 数字资产载体的定义与定位为何机构投资者选择数字资产载体行业整合与未来发展路径 随着加密货币与传统金融市场的交叉融合不断加深,数字资产载体(DAX)作为连接两者的关键工具应运而生,逐渐成为市场关注的焦点。在这一领域中,Solana 生态凭借其高效的运算能力、低成本的交易优势及潜力十足的生态布局,…

    2025年12月9日
    000
  • 以太坊合约怎样追加保证金 以太坊合约保证金追加攻略

    在以太坊智能合约的交互中,追加保证金是管理仓位风险、避免资产被清算的关键一步,特别是在去中心化金融(DeFi)应用中,它指用户向合约中增加抵押资产以提升仓位的健康度。 准备工作与核心概念 1、 您首先需要准备一个能够与以太坊网络交互的钱苞(如MetaMask),并确保钱苞内有足够的ETH来支付网络交…

    2025年12月9日
    000
  • 去中心化交易所安全吗?DEX和CEX有什么区别?DEX新手入门指南

    binance币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币交易所: 注册入口: APP下载: 去中心化交易所(DEX)近年来在加密货币领域受到关注。与传统中心化交易所(CEX)不同,DEX在区块链上运行,旨在提供一种无需信任中介的交易方式。用户在DEX上交易…

    2025年12月8日
    000
  • Vue.js应用中配置环境变量:灵活管理后端通信地址

    在%ignore_a_1%应用中,灵活配置后端api地址等参数是开发与部署的关键。本文将详细介绍两种主要的环境变量配置方法:推荐使用的`.env`文件,以及通过`cross-env`库在命令行中设置环境变量。通过这些方法,开发者可以轻松实现开发、测试、生产等不同环境下配置的动态切换,提高应用的可维护…

    2025年12月6日 web前端
    000
  • JavaScript动态生成日历式水平日期布局的优化实践

    本教程将指导如何使用javascript高效、正确地动态生成html表格中的日历式水平日期布局。重点解决直接操作`innerhtml`时遇到的标签闭合问题,通过数组构建html字符串来避免浏览器解析错误,并利用事件委托机制优化动态生成元素的事件处理,确保生成结构清晰、功能完善的日期展示。 在前端开发…

    2025年12月6日 web前端
    000
  • JavaScript响应式编程与Observable

    Observable是响应式编程中处理异步数据流的核心概念,它允许随时间推移发出多个值,支持订阅、操作符链式调用及统一错误处理,广泛应用于事件监听、状态管理和复杂异步逻辑,提升代码可维护性与可读性。 响应式编程是一种面向数据流和变化传播的编程范式。在前端开发中,尤其面对复杂的用户交互和异步操作时,J…

    2025年12月6日 web前端
    000
  • VSCode入门:基础配置与插件推荐

    刚用VSCode,别急着装一堆东西。先把基础设好,再按需求加插件,效率高还不卡。核心就三步:界面顺手、主题舒服、功能够用。 设置中文和常用界面 打开软件,左边活动栏有五个图标,点最下面那个“扩展”。搜索“Chinese”,装上官方出的“Chinese (Simplified) Language Pa…

    2025年12月6日 开发工具
    000
  • MySQL模糊查询:高效处理含空格和多格式电话号码

    在mysql数据库中,当电话号码字段包含多种格式和空格时,传统的`like`查询可能无法返回预期结果。本文将介绍如何利用`replace`函数在查询时动态移除电话号码中的空格,从而实现准确的模糊匹配。同时,我们还将探讨性能考量及数据标准化等最佳实践,帮助您优化数据库查询和数据质量。 挑战:含空格电话…

    2025年12月6日 后端开发
    000
  • JavaScript持续集成与部署

    持续集成与部署(CI/CD)通过自动化测试、构建和部署提升JavaScript项目交付效率。1. CI指频繁合并代码并自动运行测试以快速发现错误;2. CD在CI通过后自动将应用部署至生产环境;3. 常用工具包括GitHub Actions、GitLab CI/CD、CircleCI和Jenkins…

    2025年12月6日 web前端
    000
  • 解决HTML锚点链接页面重载与URL路径丢失问题

    在使用html锚点链接进行页面内部导航时,开发者可能会遇到页面意外重载或url路径丢失的问题,导致无法正确滚动到目标区域。本文将深入探讨这一常见问题的根源,并提供一种简洁有效的解决方案:确保锚点链接的`href`属性包含当前页面的完整相对路径,从而实现平滑的页面内跳转,避免不必要的页面刷新和url结…

    2025年12月6日 后端开发
    000

发表回复

登录后才能评论
关注微信