返回顶部
首页 > 资讯 > 精选 >Nginx怎么实现简单的前端灰度系统
  • 172
分享到

Nginx怎么实现简单的前端灰度系统

2023-07-05 14:07:16 172人浏览 独家记忆
摘要

本篇内容主要讲解“Nginx怎么实现简单的前端灰度系统”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Nginx怎么实现简单的前端灰度系统”吧!写在前面的话灰度这个概念,来自数字图像领域,最初是描

本篇内容主要讲解“Nginx怎么实现简单的前端灰度系统”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Nginx怎么实现简单的前端灰度系统”吧!

写在前面的话

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

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

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

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

  1. 增量灰度:小的patch可以增量的添加在发布版本上,也可以通过开关一键关闭

  2. 用户灰度:增量和全量版本都可对不同群体或者某几个特定的用户进行灰度可见

  3. 版本回退:每一个版本都在灰度系统里可见,可以一键回退

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

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

灰度规则

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

灰度策略优先级
未生效
生效
全量一般

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

灰度系统数据库设计

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

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

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

下面是设计ER图:

Nginx怎么实现简单的前端灰度系统

我们依此来分析:

子项目表

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

Nginx怎么实现简单的前端灰度系统

灰度用户表

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

资源表

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

Nginx怎么实现简单的前端灰度系统

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

Nginx怎么实现简单的前端灰度系统

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

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

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

Nginx怎么实现简单的前端灰度系统

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

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

Nginx怎么实现简单的前端灰度系统

其中 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 动作即可:

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

灰度策略表

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

Nginx怎么实现简单的前端灰度系统

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

  • default: 未生效

  • failure: 生效

  • success: 全量

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

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

灰度系统接口api开发

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

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

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

名称描述接收参数输出
getConsoleVersion获取当前用的产品版本userId,productsresource键值对列表

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

  1. 遍历 products,获取每一个产品的 projectId

  2. 对于每一个 projectId,联查资源表,分别获取对应的 resourceId

  3. 对于每一个resourceId,结合 userId,并联查灰度策略表,筛选出起作用的灰度策略中可用的资源

  4. 返回每一个资源的 data 信息。

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

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

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

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

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

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

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

前端页面展示

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

  • 登录

Nginx怎么实现简单的前端灰度系统

  • 查看资源

Nginx怎么实现简单的前端灰度系统

  • 配置策略

Nginx怎么实现简单的前端灰度系统

Nginx怎么实现简单的前端灰度系统


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

Nginx怎么实现简单的前端灰度系统

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

Nginx怎么实现简单的前端灰度系统

访问转发

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

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

到此,相信大家对“Nginx怎么实现简单的前端灰度系统”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Nginx怎么实现简单的前端灰度系统

本文链接: https://lsjlt.com/news/352254.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Nginx怎么实现简单的前端灰度系统
    本篇内容主要讲解“Nginx怎么实现简单的前端灰度系统”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Nginx怎么实现简单的前端灰度系统”吧!写在前面的话灰度这个概念,来自数字图像领域,最初是描...
    99+
    2023-07-05
  • 分享一个简单的前端灰度系统
    先介绍一个要部署的前端项目(你可以根据自己的前端项目动态调整)。本项目针对的前端项目是一个基于微服务架构的项目,下面是设计ER图:我们依此来分析:子项目表该表用于存放所有子项目的信息,新建一个微服务子项目时,会在这个表里新建一个条目,数据示...
    99+
    2023-05-14
    前端
  • js实现简单的前端分页效果
    有些项目业务比较简单,但用到前端分页的地方又比较多,插件的体积比较难控制用起来也麻烦,所以自己写一个简易的。 实现思路 通过 jQuery.slice() 选择子集的区间元素, 然后...
    99+
    2024-04-02
  • Python+Vue实现简单的前后端分离
    准备工作 安装Node环境安装Python环境 注意:项目整个过程需要从后往前,即先数据库->后端->前端;启动流程也是先启动后端项目,再启动前端项目 完整项目地址:地址 前端 开发工具:Vis...
    99+
    2023-08-31
    python vue mysql 前后端分离
  • asp简单投票系统怎么实现
    要实现一个简单的ASP投票系统,可以按照以下步骤进行:1. 创建一个数据库表来存储投票相关的数据,例如投票主题、选项、投票结果等。2...
    99+
    2023-09-22
    asp
  • JavaScript怎么实现简单抽奖系统
    这篇文章主要讲解了“JavaScript怎么实现简单抽奖系统”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript怎么实现简单抽奖系统”吧!模拟实现抽奖系统前端使用JavaScr...
    99+
    2023-06-29
  • 怎么用js实现简单的抽奖系统
    今天小编给大家分享一下怎么用js实现简单的抽奖系统的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。效果图如图所示:字节带闪动,...
    99+
    2023-06-29
  • Android Studio 接入OpenCV最简单的例子 : 实现灰度图效果
    1. 前言 上文 我们在Windows电脑上实现了人脸功能,接下来我们要把人脸识别的功能移植到Android上。 那么首先第一步,就是要创建一个Native的Android项目,并且配置好OpenGL...
    99+
    2023-09-13
    android studio opencv android 接入 灰度图效果
  • php怎么实现简单的雇员管理系统
    这篇文章主要讲解了“php怎么实现简单的雇员管理系统”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php怎么实现简单的雇员管理系统”吧!  这是一...
    99+
    2024-04-02
  • python怎么实现简单的学生管理系统
    这篇文章主要为大家展示了python怎么实现简单的学生管理系统,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“python怎么实现简单的学生管理系统”这篇文章吧。python是什么意思Python是...
    99+
    2023-06-06
  • js实现简单的抽奖系统
    一个用js编写的简单的抽奖系统,供大家参考,具体内容如下 效果图如图所示:字节带闪动,点击开始,可进行抽奖,并且按钮变为结束按钮,然后点击结束按钮,可以结束,并抽奖成功。 代码如下...
    99+
    2024-04-02
  • C#实现简单的点餐系统
    本文项目为大家分享了C#实现点餐系统,供大家参考,具体内容如下 项目介绍:一家店铺使用的外卖点餐系统本项目分三大模块:登录注册模块,用户模块,店家模块 1.登录注册模块 登录分为用户...
    99+
    2024-04-02
  • Python使用Redis实现作业调度系统(超简单)
    概述 Redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的Web应用程序的完美解决方案。 Redis从它的许多竞争继承来的三个主要特点: Redis数据库完全在内存中,使用磁盘仅用...
    99+
    2022-06-04
    作业 简单 系统
  • 怎么实现一个前端监控回放系统
    本篇内容主要讲解“怎么实现一个前端监控回放系统”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么实现一个前端监控回放系统”吧!1 / 实现方案思路要想给用户的访...
    99+
    2024-04-02
  • C++怎么实现简单通讯录管理系统
    本篇内容介绍了“C++怎么实现简单通讯录管理系统”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、代码#include <i...
    99+
    2023-06-29
  • 怎么用Java实现简单员工管理系统
    这篇文章主要讲解了“怎么用Java实现简单员工管理系统”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Java实现简单员工管理系统”吧!代码如下:import java.uti...
    99+
    2023-06-29
  • python怎么实现简单通讯录管理系统
    要实现简单的通讯录管理系统,可以使用Python的字典来存储联系人的信息。以下是一个简单的实现示例:```pythoncontact...
    99+
    2023-08-18
    python
  • C语言怎么实现简单的图书管理系统
    实现一个简单的图书管理系统可以使用C语言来实现,以下是一个简单的示例代码: #include <stdio.h> #in...
    99+
    2024-03-08
    c语言
  • 如何利用Python+Vue实现简单的前后端分离
    目录准备工作前端后端数据库总结准备工作 安装Node环境安装Python环境 注意:项目整个过程需要从后往前,即先数据库->后端->前端;启动流程也是先启动后端项目,再启...
    99+
    2024-04-02
  • Docker+Nginx打包部署前后端分离怎么实现
    这篇文章主要介绍“Docker+Nginx打包部署前后端分离怎么实现”,在日常操作中,相信很多人在Docker+Nginx打包部署前后端分离怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Docker+...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作