共计 5196 个字符,预计需要花费 13 分钟才能阅读完成。
导语
腾讯乐享,是腾讯推出的一站式企业社区,提供在线课堂、考试、学习地图、直播、文档、问卷调研等多项应用服务。
腾讯乐享从 0 开始对接企业微信开放平台能力,作为企业微信第三方利用上线曾经 4 年了。现在腾讯乐享也要成为服务方容许其余 Saas 产品以第三方利用身份接入,那曾积攒的教训该如何传授给行将接入利用的开发者呢?
腾讯乐享第三方利用开放平台曾经上线一段时间了,第一期接入的利用包含珊瑚积分、腾讯问卷、制作云,这三个自身都曾经是成熟产品,也都有各自的凋谢接口,所以问题就在于如何把单方平台的凋谢接口连接起来实现买通。其中腾讯云 iPaas 为咱们对接珊瑚积分平台与制作云,腾讯问卷由单方平台一起开发中转站服务。
在这个过程中,咱们发现了团队内外的开发共事都在反复着对接乐享开放平台的能力,且对接过程因为大家的了解、实现不统一会遇到各种问题,那些年咱们对接企业微信踩过的坑正在蔓延。这时候公司外部各种推文都提到 CloudBase 云开发,通过理解后发现这正适宜用于搭建第三方利用开发框架,如果所有利用接入都应用对立框架,那无论开发效率、还是前期保护都有极大的劣势。
问题预研
一个第三方利用的接入,须要做什么?
- 承受回调: 公司对利用的受权 / 勾销受权告诉、公司的通讯录变更告诉、调用凭证的 ticket 推送等,都是由乐享服务方被动推送给利用方,须要利用方提供 cgi 来接管回调事件。尤其 ticket 是换取接口调用凭证的重要字段,所以实现接管回调 cgi 是开始开发的第一步;
- 接口调用: 接口调用看似就是 SDK 能解决的问题,但 saas 的接口调用并没有这么简略。接口有利用维度和企业维度,所需的凭证都不一样,而且凭证不能频繁获取,须要缓存,企业凭证的缓存还受企业受权 / 勾销受权事件影响,这些逻辑都是 SDK 不能满足的;
- 通讯录同步: 拉接口,写 DB,仿佛有手就能写好的业务逻辑,其实也是很考查开发者基本功的。同步过程是否平滑,同步脚本是否中断重跑或续跑,脏数据如何清理等,没有踩过足够的坑就很容易脱漏这些细节;
- 登录受权: 规范的 OAuth 协定接入,坑不多,但还是波及到身份校验、受权跳转、受权回调、token 生成下发等一系列性能的开发,反复又没挑战的工作往往使人疲乏。
以上几点提到的仅仅是对接开放平台所须要做的,以 Web 利用的角度来看,除了须要选定一个服务端语言来开发,还要思考整体架构,数据库、缓存、对象存储等根底组件,划分 VPC,部署利用等。因而,即使领有再成熟的开放平台,对很多开发团队而言都是存在肯定门槛的。而开发框架就是为了升高这个门槛,吸引更多有想法的开发团队简略疾速地实现本人的利用。在我最后的构想里,开发者只须要实现利用自身的页面和接口,无需关怀这个利用是如何与乐享后盾交互的,借助云开发 CloudBase 的能力一键部署,就能成为乐享的第三方利用,为成千上万个企业提供服务。而这个构想,当初也初具雏形了。
框架实现
1、数据库
CloudBase 自带非关系型数据库,用法相似于 MongoDB,因而咱们能够通过 cloudbaserc.json 配置为利用初始化时创立如下数据表;
- companies: 公司表,用于记录从乐享受权以后利用的公司信息,也是作为 saas 利用必备的一个表。
- departments、users、department_user: 通讯录必备的三个表,记录用户与部门以及两头的关联关系。这里的 department_user 两头表其实非必须,因为 cloudbase 提供的是非关系型数据库,每个用户的部门信息齐全能够记录在 users 表中,但最初的设计还是像 MySQL 那样创立了两头表,为一个更远的指标埋下小伏笔,前面会解释。
- lx_suite_callback_logs: 记录从乐享回调过去的日志,不便定位问题;
- lx_suites: 次要用来记录以后无效 ticket、利用拜访乐享接口的 token、各个企业拜访乐享接口的 token 等,其实相当于一个缓存应用,因为 CloudBase 目前还没有间接挂载 redis 的能力,因而先借用数据库做缓存,因为读写这个表的都是框架自带的根底云函数,开发者无需关注,因而后续有更优雅的计划也能够随时降级革新。
其实这个开发框架的理念,最重要就是把面向乐享接口开发的模式,转化成面向数据库开发。常说 web 利用开发就是基于数据库的增删改查,这就是框架带来的劣势。
2、接管回调
框架实现了云函数 <span>base_suite_callback</span>
,这个云函数负责监听 ticket 变更、企业开明 / 敞开利用的告诉,数据会落到<span>companies</span>
、<span>lx_suites</span>
、<span>lx_suite_callback_logs</span>
表中。这个云函数也是整个框架最重要的入口,一旦不可服务或响应超时将会带来重大的影响,因而也会做好实例预热,防止因为冷启动而导致企业受权信息失落。
3、接口调用
乐享平台具备十多个利用模块,领有上百个利用接口和十多个通讯录接口,所有接口都封装在 <span>base_lx_apis</span>
下,提供函数阐明,让开发者简略地调用乐享的能力。
除了接口封装外,云函数还实现 access_token 的缓存、刷新机制,因为要应用到存储服务,这是简略 SDK 无奈满足的。
还须要特地关注的是乐享提供的接口受权模式是<span>client credentials</span>
,实用于服务端对服务端申请,如果间接让客户申请接口,将会产生重大的破绽,企业数据会受到歹意篡改、透露等危险。利用 CloudBase 提供的云函数权限设置,能够禁止客户端间接调用,客户端必须先调用开发者的云函数,通过服务端调用能力拜访,保障了利用的安全性。在框架的示例代码中,也提供了代码 demo 疏导开发者正确应用。
4、通讯录同步
框架提供全量同步的云函数<span>base_sync_contact</span>
,可通过定时工作或客户端调用触发。
全量同步通讯录的过程,很容易因为代码逻辑、脚本中断等起因导致数据错乱的问题。
在这里我引入了通讯录版本的概念,每次同步,对于 <span>deprtments</span>
表和 <span>department_user</span>
表都只会追加数据,而不会批改数据,等全量同步完结,确保数据统一,才会更新以后公司的通讯录版本,删除表中其余版本的数据,保障每一时刻的通讯录数据都是可用的。
5、登录受权
身份校验逻辑次要放在客户端代码 Vue 外面,以路由中间件的模式判断以后用户登录状态的公司 ID,若缺失或与 url 上的公司 ID 不符,则重定向到指定公司所在的乐享受权页面。这些代码逻辑都是乐享积攒的贵重教训,开发者间接应用可防止各种 B 端登录态错乱的状况。
6、成果体验
基于以上根底能力的封装,要在这个框架上开发利用曾经足够简略了。
咱们也尝试开发一个第三方学习素材治理平台,只须要 3 步:
(1)新建数据表;
(2)实现素材治理相干的云函数逻辑,外面会调用到 <span>base_lx_apis</span>
云函数来调用乐享接口,也会应用到对象存储的 API;
(3)Vue 外面退出相干路由页面。
这就跟开发任何的 Web 利用一样,开发者不会因为不晓得如何买通乐享而停步不前。学习老本从学习乐享接口、学习 Saas 利用开发转嫁到学习 CloudBase 的应用上。
一键部署
一键部署是 CloudBase Framework 提供的能力,通过简略的操作,代码就能在云开发环境跑起来了。但要乐享被动向云开发环境回调事件,还须要在乐享这边配置云开发环境对应的接管回调 cgi;配置 cgi 后,还要先让乐享推送 ticket 能力让公司受权利用;登录受权也波及到可信回调域名配置;利用入口也须要配置链接。开发者要看着阐明文档,从云开发复制链接到乐享页面上一个个配置,而后每个性能调试验证以确保没手抖复制错,过程参考下图:
为了解决人工初始化配置的问题,针对这个场景,在乐享侧提供了利用初始化配置的接口。云开发环境能够间接应用 suite_id+suite_secret 去初始化指定字段的配置,包含回调 cgi、登录受权可信域名、入口地址,配置实现后还会触发乐享被动向利用推送 ticket,以确保之后企业能间接受权应用。这个初始化接口的调用放到了 CloudBase 一键部署的 postDeploy 钩子中,无需人工操作且确保配置胜利才部署胜利,大大降低了框架的应用门槛。
目前一键部署流程如图所示:
整个一键部署流程也还有几个环节能够优化的;
并不是必须到 github 上点击一键部署,后续能够间接把部署按钮放在乐享的公司治理后盾,让公开的开发者间接从乐享跳转到腾讯云进行部署配置。
基于第 1 点的优化,如果云开发部署页容许通过 url 或表单传递配置参数,那乐享侧能够间接带上,省去开发者复制粘贴的功夫。
第 4、5 步下载自定义私钥并注入云函数中,目前云开发还没法间接通过 cloudbaserc.json 去配置,后续能反对就更好了。
能力扩大
框架设计的初衷是为了让开发者疾速从零开始搭建一个乐享第三方利用。但随着实现过程的思考和了解,我认为这个框架的应用场景不应局限于此,它还应该服务于其余成熟利用和平台的对接。
有凋谢接口的利用或平台之间对接,往往因为接口不适配而陷入僵局,谁都不违心批改本人的接口去适配对方。最初的解决办法只能是其中一方退让去从零搭建一个两头服务,看着单方的接口文档去做开发。
如果乐享能提供这套框架,那框架又能提供什么呢?
对外受权
下面提及的登录受权,是指乐享对部署这个框架的服务(简称 A 服务)进行受权。但如果是两个平台对接,还须要 A 服务对第三方平台受权。只管开发者曾经不须要实现服务 A 被受权登录的过程了,但我感觉还能够再做点什么,让二次开发更简略,例如封装好对外受权的 OAuth、smal 协定。
回调告诉传递
乐享回调除了事后实现的逻辑外,保留可配置的 hook,让开发者配置自定义云函数或者音讯队列。开发者通过云函数或音讯队列再去解决的时候,就不须要放心音讯是否伪造、是否过期、是否重放等问题。
数据直写业务数据库
框架曾经实现了从乐享拉接口把通讯录数据写入云开发环境的数据库中了,但对云开发环境外的业务齐全没有意义(即使 VPC 买通,来到了云开发环境也没有 SDK 去读写数据库,本人实现也太难了)。于是框架应该具备从乐享拉接口把通讯录数据写入指定数据库中,而且不应该只反对 MongoDB 这样的非关系型数据库,也要反对最罕用的 mysql,因而通讯录的表设计保留了 <span>department_user</span>
两头表。框架应容许配置 mysql 连贯,让数据能够直写业务数据库。
私有化部署
作为 Saas 产品,私有化部署是永恒的话题。产品自身要私有化就曾经不容易,往往要思考服务降级的伎俩来满足私有化,更不会思考第三方利用这种可开可关的性能了。但如果是基于 cloudbase 开发的第三方利用,那企业一键部署带走又何乐而不为呢?
低代码开发
如果说第三方利用开发框架是一个起步,那下一个指标可能就是低代码开发平台。无论采纳哪个形式开发,目前对每个根底能力的封装都是必须的、可复用的,走出了第一步,能力为下一个指标带来可能性。
总结
从开发企业微信第三方利用,到开发开放平台给第三方利用接入,身份替换给了我很多教训。cloudbase 的呈现正好让我好好思考总结,把一些设计理念能实现进去,也欢送大家与我一起交换探讨。
PS:从设计这个框架开始,我命名了这个我的项目为“乐享再待业打算”。想着哪天退休了,我就以乐享服务商的身份用这个框架为乐享做各种外包我的项目。乐享永不退,做到八十岁。
附录
Github 代码仓库:
https://github.com/TencentLexiang/cloudbase-template
产品介绍
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为开发者提供高可用、主动弹性扩缩的后端云服务,蕴含计算、存储、托管等 serverless 化能力,可用于云端一体化开发多种端利用(小程序,公众号,Web 利用,Flutter 客户端等),帮忙开发者对立构建和治理后端服务和云资源,防止了利用开发过程中繁琐的服务器搭建及运维,开发者能够专一于业务逻辑的实现,开发门槛更低,效率更高。
开明云开发:https://console.cloud.tencent.com/tcb?tdl_anchor=techsite
产品文档:https://cloud.tencent.com/product/tcb?from=12763
技术文档:https://cloudbase.net?from=10004
技术交换群、最新资讯关注微信公众号【腾讯云开发 CloudBase】