iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > 其他 >分享一个简单的前端灰度系统
  • 740
分享到

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

前端 2023-05-14 22:05:10 740人浏览 泡泡鱼
摘要

先介绍一个要部署的前端项目(你可以根据自己的前端项目动态调整)。本项目针对的前端项目是一个基于微服务架构的项目,下面是设计ER图:我们依此来分析:子项目表该表用于存放所有子项目的信息,新建一个微服务子项目时,会在这个表里新建一个条目,数据示

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

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

下面是设计ER图:

image.png

我们依此来分析:

子项目表

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

image.png

灰度用户表

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

资源表

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

image.png

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

image.png

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

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

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

image.png

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

  1. 在 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 动作即可:

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, 一个是当前用户访问的微服务系统中所包含的产品列表。该接口做了如下几步操作:

  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。

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

前端页面展示

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

  • 登录

image.png

  • 查看资源

image.png

  • 配置策略

image.png

image.png


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

image.png

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

image.png

访问转发

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

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

总结

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

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

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

--结束END--

本文标题: 分享一个简单的前端灰度系统

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 分享一个简单的前端灰度系统
    先介绍一个要部署的前端项目(你可以根据自己的前端项目动态调整)。本项目针对的前端项目是一个基于微服务架构的项目,下面是设计ER图:我们依此来分析:子项目表该表用于存放所有子项目的信息,新建一个微服务子项目时,会在这个表里新建一个条目,数据示...
    99+
    2023-05-14
    前端
  • Nginx怎么实现简单的前端灰度系统
    本篇内容主要讲解“Nginx怎么实现简单的前端灰度系统”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Nginx怎么实现简单的前端灰度系统”吧!写在前面的话灰度这个概念,来自数字图像领域,最初是描...
    99+
    2023-07-05
  • 分享一个简单的java爬虫框架
    反复给网站编写不同的爬虫逻辑太麻烦了,自己实现了一个小框架可以自定义的部分有:请求方式(默认为Getuser-agent为谷歌浏览器的设置),可以通过实现RequestSet接口来自定义请求方式储存方式(默认储存在f盘的html文件夹下),...
    99+
    2023-05-30
    java 爬虫框架 ava
  • 一天撸一个财务APP系统【安卓端+前端+后端】
    昨天有个粉丝朋友也想学开发Web和小程序、安卓,问可以在大学学会吗? 在学校学到的东西真的有限: 在很多的高校,有一些教授是学院派的,他们没有做过多少开发工作,上课就是照本宣科,讲的知识点都是陈年落伍...
    99+
    2023-09-16
    android 前端 java
  • 用Python实现一个简单的用户系统
    目录前言正文总结前言  如标题所说,这是一个非常简单的程序,并不涉及任何高深的学问,更适合一些刚入手Python的新人研究一下基础内容的用法,此案列对于有些编程经验的人来讲...
    99+
    2024-04-02
  • js实现简单的前端分页效果
    有些项目业务比较简单,但用到前端分页的地方又比较多,插件的体积比较难控制用起来也麻烦,所以自己写一个简易的。 实现思路 通过 jQuery.slice() 选择子集的区间元素, 然后...
    99+
    2024-04-02
  • Python+Vue实现简单的前后端分离
    准备工作 安装Node环境安装Python环境 注意:项目整个过程需要从后往前,即先数据库->后端->前端;启动流程也是先启动后端项目,再启动前端项目 完整项目地址:地址 前端 开发工具:Vis...
    99+
    2023-08-31
    python vue mysql 前后端分离
  • 【Python】实现一个简单的区块链系统
    本文章利用 Python 实现一个简单的功能较为完善的区块链系统(包括区块链结构、账户、钱包、转账),采用的共识机制是 POW。 一、区块与区块链结构 Block.py import hashlibfrom datetime import ...
    99+
    2023-09-22
    区块链 python 共识算法
  • 如何利用C++实现一个简单的电影评分系统?
    如何利用C++实现一个简单的电影评分系统?电影评分系统是一个能够让用户对所观看的电影进行评分和评论的系统。在这个系统中,用户可以选择电影并针对其进行评分,同时也可以查看其他用户的评分和评论。在这篇文章中,我们将介绍如何使用C++编程语言实现...
    99+
    2023-11-02
    C++电影评分系统
  • 利用Java编写一个简单的租车系统
    这期内容当中小编将会给大家带来有关利用Java编写一个简单的租车系统,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。实现目标java编写一个控制台版的“租车系统”实现功能   ...
    99+
    2023-05-31
    java 租车系统 ava
  • 用Python做一个简单的图书管理系统
    目录制定步骤1、进入提示语:2、获取用户输入:扩展:3、完善各指令程序4、优化程序,使代码更简洁扩展:制定步骤 1、进入提示语: 为了制作一个友好的“图书管理系统&rdq...
    99+
    2023-05-17
    Python 管理系统 Python图书管理系统
  • 基于C++实现一个简单的音乐系统
    目录一、前言二、实现步骤三、代码实现四、讲解程序一、前言 2022临近尾声,2023即将来临。 过去的一年,我们同努力,我们共欢笑.。 每一次成功都蕴藏着我们辛勤的劳动。 新的一年即...
    99+
    2022-12-29
    C++音乐系统 C++声音系统 C++ Beep
  • Go语言实战之实现一个简单分布式系统
    目录引子思路实战节点通信主节点工作节点将它们放在一起代码效果总结引子 如今很多云原生系统、分布式系统,例如 Kubernetes,都是用 Go 语言写的,这是因为 Go 语言天然支持...
    99+
    2024-04-02
  • 一个简单的java学生寝室查询系统
    本文实例为大家分享了java学生寝室查询系统的具体代码,供大家参考,具体内容如下前端部分:index.html<!DOCTYPE html><html lang="en"><head> <meta...
    99+
    2023-05-31
    java 学生寝室系统 ava
  • 利用Python编写一个简单的缓存系统
    目录项目展示不用落地的缓存系统系统应该如何实现铺垫python字典基本操作定义一个不用落地的缓存系统数据如何落地将对象保存到磁盘将对象从磁盘中导入到内存中将数据落地和缓存系统结合起来...
    99+
    2023-05-16
    Python实现缓存系统 Python缓存系统 Python缓存
  • 实现一个简单得数据响应系统
    目录1、Dep2、了解 obverser3、了解 watch 和 observer4、触发依赖5、总结一下流程1、Dep 其实,这就是一个依赖收集的容器, depend 收集依赖, ...
    99+
    2024-04-02
  • 怎么使用java做一个简单的聊天系统
    要使用Java创建一个简单的聊天系统,您可以按照以下步骤进行操作:1. 创建一个ServerSocket对象,用于接收客户端的连接请求。可以使用以下代码:```javaServerSocket serverSocket = new Se...
    99+
    2023-08-11
    java
  • C++实现一个简单的SOAP客户端
    目录1、简介2、实现客户端2.1 准备xml文件2.2 引入库文件2.3 构建请求数据的xml2.4 执行Http协议的POST方法2.5 解析响应数据的xml3、测试客户端1、简介...
    99+
    2024-04-02
  • 如何使用MySQL和Ruby on Rails开发一个简单的在线调度系统
    如何使用MySQL和Ruby on Rails开发一个简单的在线调度系统随着科技的不断发展,越来越多的企业和组织需要一个高效的调度系统来管理和分配资源。而使用MySQL和Ruby on Rails来开发一个简单的在线调度系统则是一种常见和可...
    99+
    2023-10-22
    MySQL Ruby on Rails 在线调度系统
  • 怎么实现一个前端监控回放系统
    本篇内容主要讲解“怎么实现一个前端监控回放系统”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么实现一个前端监控回放系统”吧!1 / 实现方案思路要想给用户的访...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作