有赞移动关于权限与审批流程的标准化
有赞移动有weex发布平台、移动配置中心平台、App分发平台、热修复平台等。这些平台都需要发布,而发布就需要规范化,需要审批制度。如果为各个平台开发这个审批流程,看起来是一种浪费。
首先想到第一种方案:接入现有的前后端发布平台。
移动侧的发布基本是配置类的发布,跟后端应用和前端应用的发布不一样。后端应用和前端应用的发布都是将指定的内容推送到某台或者多台机器进行部署、启动。两者如果硬要做抽象,成本反而更大,而且不易维护。所以放弃第一种方案。
那么是否可以抽象成单独的统一管理平台,进行标准化呢?
# 二、梳理
首先看一下标准的发布审批流程一般是怎么样的?
第一步:申请人提交发布单
第二步:负责人审批
第三步:申请人发布
而这里申请人和负责人就是以权限为区分。
一般的权限角色有模块负责人、开发、运营、测试等。
其中,审批人是模块负责人,而申请人可以是开发,也可以是模块负责人。而二方平台还可以根据不同角色赋予不同的权限。
### 2.1 权限
权限实质上指的是用户和模块之间的关系。所以只需要模块的唯一标识和用户的唯一标识,用户的唯一标识由统一的用户认证服务提供,模块的唯一标识由各个二方平台提供。对于二方平台来说,只要提供模块唯一标识和用户唯一标识,然后获得角色即可,然后根据角色进行相应的操作。所以这一层就可以单独抽离出来。现有的前后端发布平台也已经验证了这一点。
### 2.2 审批
审批需要哪些元素呢? 申请人、审批内容、审批人、审批状态。其中审批内容在各个二方平台是不一样的。
尽管如此,还是可以抽象成两个字段:审批单唯一标识和用于查看审批详情的链接。这两个字段都可以由二方平台提供。所以审批也是可以做抽象的。
# 三、设计
如何设计这个统一的平台将权限与审批流程标准化呢?首先看一下二方平台和有赞移动权限与审批统一管理平台(以下简称统一管理平台)的交互流程图。
![52e9f2242349ac20691b3a9e6508d2cb.png](/content/images/2019/07/———0709.png)
首先,二方平台和统一管理平台都要依赖CAS,CAS是有赞的用户认证平台。这样,就可以基于同个用户进行权限管理。
## 3.1 二方平台与统一管理平台的交互
从图中可以看到,二方平台与统一管理平台主要有四大交互:添加模块、获取权限、提交发布单、获取发布单状态。
### 3.1.1 添加模块
模块是最小的可配置权限的元素,比如weex发布平台对应的各个模块、热修复平台对应的App等。需要在发布平台配置权限的时候,就需要选择模块。
所以,二方平台在注册模块的时候,需要同步到发布平台,带上平台和模块的唯一标识,以及模块的名称,增强可读性。
### 3.1.2 获取权限
权限由统一管理平台管理,模块负责人可以编辑权限,其他人可以申请权限。
二方平台通过携带平台和模块的唯一标识,以及用户的唯一标识,从统一管理平台获取权限,依赖权限进行相应的操作。
### 3.1.3 提交发布单
移动侧的各个二方平台发布的内容基本是配置类的信息,配置的内容、格式、条件都不一样。
比如weex发布的内容包含平台、环境、规则、描述,和页面列表,如图:
![ef66f7a4e44e7ab652436d69b361fffb.jpeg](/content/images/2019/07/1562724365474.jpg)
而热修复平台发布的内容包括应用版本、补丁文件、描述、下发模式(规则)等:
![b7e7bc22ab57113da5382b12a2d46d2e.png](/content/images/2019/07/1562724925239.jpg)
首先想到的是将这些配置类内容抽象成内容、规则和描述。但是如果这么做的话,各个二方平台展示时各自需要重新解析,也不便于根据内容里的字段进行搜索。
所以,各个二方平台的发布页面由各个平台自己开发,提交发布单的时候,再将唯一标识符(包含平台、模块、发布单ID等)和发布单详情的url传给统一管理平台,统一管理平台来维护一张审批表,包含发布单唯一标识符、状态、申请人、发布单详情url等。
其中,状态包括待审批、审批通过、审批拒绝。发布单详情url用于审批人在统一管理平台审批时可以跳转查看审批内容详情。
### 3.1.4 获取发布单状态
各个二方平台有各自的发布单详情表,而审批状态统一从统一管理平台获取。二方平台通过审批状态,判断是否可以进行发布。
## 3.2 优化改进
### 3.2.1 权限申请入口
考虑到每次需要添加的权限的时候,都需要模块负责人去权限管理页面添加,对于负责人来说是一种不必要的时间浪费。于是增加权限申请的入口,不仅在统一管理平台可见,在各个二方平台也开发入口,通过再url后面携带平台、模块、角色等参数,跳转到统一管理平台的权限申请页面。申请后,模块负责人会收到通知(企业微信、钉钉或者其他形式),同意申请即可。既减少了模块负责人的操作成本,也减少了模块负责人与申请人的沟通成本。
### 3.2.2 审批通知与审批结果通知
申请人发起发布申请后,审批人会实时收到通知。而审批人通过/拒绝申请后,申请人也会实时收到通知。减少了二者的沟通成本。
### 3.2.3 允许关闭审批
可能有一些模块的特殊性(测试模块),或者环境的特殊性(有赞的网络环境分为Daily、QA、Pre、Prod),有些模块在某些环境需要关闭审批,这样更能提高效率。否则在测试环境,每次发布都要审批,着实比较麻烦。
# 四、总结
由此,所有的审批操作和权限操作都在统一管理平台进行。添加模块、提交发布单和发布、回滚等操作在各自的二方平台进行。统一管理平台以Dubbo的形式向二方平台提供统一标准接口:
– 接口一:在统一管理平台创建模块
– 接口二:获取到用户在发布平台的角色
– 接口三:在统一管理平台创建/撤回审批单
– 接口四:获取审批单的进度
统一管理平台的后台操作页面,主要是权限管理界面和审批界面。
![45bfcf8b1b5a222a7b6dd7793666b4c7.png](/content/images/2019/07/—-.jpg)
![ed6a4a3844a8204fa1a6d86d85bf8102.png](/content/images/2019/07/–.jpg)
由此就将发布的审批流程和权限管理进行了标准化。现有的二方平台,以及将来更多二方平台都可以通过统一管理平台提供的接口接入,在统一管理平台上进行权限和审批流程的管理。后续随着二方平台的复杂度变高,权限角色的增加,审批类型的增加都可以很方便地进行扩展和复用。
标准化意义在于降低成本,包括开发成本和使用成本。日常开发中需要更多思考,识别业务中哪些可以标准化哪些需要个性化,然后将可标准化的部分抽象出来做成服务,对于效率和扩展性来说都是更好的选择。