一、软件技术栈
软件分为前端和后端(控制服务、计算实例)两个整体部分,针对这两个部分,我们采用以下技术栈
1.1 前端部分
前端部分我们采用Javascript实现
前端框架采用React框架实现
组件库使用Ant Design组件库
难度较高的组件Web IDE功能采用Ace Editor实现
1.2 后端部分
- 关于语言与框架
本软件的后端部分计划主要计划采用两种语言实现,分别为Golang 1.20
与Python 3.10
其对应的http框架为gin
框架与Django
框架
对应的rpc框架为kitex
框架与thrift
框架,对应的idl语言为thrift
- 关于组件选型
组件主要使用数据库、缓存与消息队列三种组件
数据库使用mongoDB
、MySQL
两种
KV缓存根据是否需要为各服务独立的缓存以及是否需要持久化分别使用redis
与memcache
消息队列使用RocketMQ
1.3 计算实例部分
- 容器: Docker
- 集群管理: Kubernetes
- 函数版本管理: 对象储存MinIO
- 镜像管理: Harbor仓库
二、组成部分与架构
2.1 整体架构
本软件的整体架构如下, 主要分为前端Web页面和后端两个主要部分。
2.1 前端
前端主要采用React实现,要求所有组件均通过函数形式编写,并使用React Hook来实现状态管理等功能。
前端部分主要分为三个部分
- View层:
- JSX:主要页面构建与组件的编写
- CSS文件:每一个JSX文件对应一个,用于样式的编写
- Controller层:JS文件,每一个JSX文件对应一个,用于JSX组件中注册方法的编写
- Model层:JS文件,用于工具函数、后端接口调用封装与相应数据结构的封装
其中:
View层主要利用Ant Design组件库实现,节省写页面的时间
ajax请求使用jQuery库的封装来实现
2.2 后端
后端采用微服务架构,服务按照模块划分,部署在不同的docker容器中,服务之间使用rpc(remote process call)进行调用,rpc所需idl文件由统一的仓库进行管理。
后端存在控制实例与计算实例两种实例,对应的模块和功能如下
部署在控制实例的模块:
- 数据库、缓存、对象储存等资源
- 用户信息管理模块:负责用户的注册、验证、登录鉴权与单点登录验证、信息管理等功能。
- 代码与镜像管理模块:负责对用户上传的代码进行管理,同时对代码提供镜像打包等功能。
- 实例调度模块:负责与k8s的控制api交互,配置deployment、service、ingress等配置文件,以及对部署的实例的网关进行注册
- 触发器模块:对自定义触发器的服务,向服务部署实例的触发器模块部署相应的触发规则
- 日志模块:日志查询服务
- 计费与监控模块:对聚合后的监控数据进行中转,以及对计费信息进行查询
- 后台API网关:聚合各服务提供的API,使其对前端暴露统一格式的接口
部署在计算实例的模块:
- 日志模块:对实例容器进行聚合和入库
- 计费与监控模块:监控容器的运行情况,并进行计费
- 用户API网关:对用户访问的服务进行代理
- 触发器模块:接受控制服务的触发器注册,对本机服务进行触发
三、系统开发目标
3.1 编码目标
上述提到的所有服务均需要编码
3.2 单测目标
服务接口handler仅进行参数校验与结果返回,其余业务逻辑需要写入service部分
单测需要覆盖所有的service与tool函数,覆盖率要求80%以上(含)
3.3 压测指标:
- 后台服务请求并发量:1~20
- 同时活跃服务数:1~10
- 总服务数:1~100
- 用户服务并发量:1~10
- 日志写入并发数:1~100
3.4 真实测试指标
系统性能指标
- 函数调用响应延迟:<0.5s
- 用户从客户端发起一个请求开始,到客户端接收到从服务器端返回的响应结束,整个过程耗费的时间
- 并发用户:
并发用户数指在同一时刻内,登录系统并进行业务操作的用户数量。
- 错误率:<0.1%~0.5%
指系统在负载情况下,失败交易的概率。错误率=(用户函数错误次数/调用次数×100%。稳定性较好的系统,其错误率应该由超时引起,即为超时率。
资源指标
- CPU,Memory,网络吞吐量等
数据库指标
- 包括SQL、吞吐量、缓存命中率、连接数等
前端指标
- 页面展示
- 首次显示时间:<2s
- OnLoad事件时间:<5s
- 完全载入时间:<10s
- 网络
- DNS时间:<100ms
- 连接时间:<200ms
- 服务器时间:<500ms
- 传输时间:<200ms
- 等待时间:<100ms
稳定性指标
- 最短稳定时间
- 系统按照最大容量的80%或标准压力(系统的预期日常压力)情况下运行,能够稳定运行的最短时间
3.5 系统文档编写
本软件文档分为注释与文档两部分
文档粒度较大,需要撰写接口文档、使用文档与设计文档三种
- 接口文档:用于定义服务接口,包括URL、入参、出参以及功能概述
- 使用文档:用于介绍本软件的使用方式
- 设计文档:即上述的详细设计部分与本文档
而对于较细粒度的信息,我们采用注释的形式来进行编写
注释基本格式为
第一行:函数名称 + 函数主要功能简介
第二部分: 函数入参与意义 #python服务入参需要标记类型
第三部分: 函数返回值与意义 #python服务需要声明返回值类型
第四部分: 如果函数可能出现异常,简述异常的触发条件与返回结构
在Python服务中,注释撰写于Python函数声明下,函数实现之上部分
在Golang服务中,注释撰写于Go函数声明上方,紧贴函数声明
在IDL(thrift)文件中,注释撰写于函数声明上方,对于参数为结构体类型,字段作用注释与字段信息位于同一行,以行内注释形式撰写