EasyPass的后端框架
EasyPass采用golang作为后端语言。作为近今年比较火爆的语言,golang以它的高并发和开发快吸引了一大批优秀的开发者,EasyPass也正是看中了它的简洁、高效和高性能。后端存储EasyPass采用mongo,mongo是nosql的佼佼者,支持各种复杂的查询,特别是4.0支持了事务后,发展迅猛。
EasyPass的后端主要负责加密数据的存储,架构也是相对简单,如下所示:
网关层负责借口的限流和鉴权,业务层是具体业务逻辑,底层存储是用的mongodb。
EasyPass的表结构
用户的每一个密码对于mongodb里的一条数据,具体的数据结构如下所示:
{
"id": "数据的ID",
"account": "数据所有者的帐号",
“encrypted_data": "加密的数据",
"version": "数据的版本号",
"last_modify_time": "最后修改时间",
"is_deleted": false, // 是否被删除
}
其中,encrypted_data即为加密的数据,解密后是个json字符串,它保存了用户的一条账户密码数据。version是数据的版本号,每次用户修改主密码,这个值都会加一。
EasyPass后端保证用户数据不丢失
为了保证用户数据的不丢失,EasyPass后端有两大设计:1、数据软删除;2、数据回滚技术;3、异地多活技术。
数据软删除
根据数据的表结构,数据的删除其实就是把is_deleted字段设置为true,如果用户不小心删除了密码,可以给EasyPass发邮件,技术人员可以帮用户恢复密码。
数据回滚技术
用户信息的表结构如下所示:
{
"account": "用户帐号",
"version": "版本号",
... // 其它字段
}
其中,版本号对应了用户数据的版本号。因此每次取数据的过程如下:
修改主密码的过程如下:
数据回滚的过程如下:
由此可知,用户主密码的历史数据都是保留的,如果忘记密码,用户可以给EasyPass发邮件,将主密码回滚到以前的某个版本。值得注意的是,数据回滚后,新主密码下创建的密码信息就会失效(但是数据库中任会保留),因此用户在回滚请求数据的时候需要谨慎。
异地多活技术
传统的单数据中心部署是不可靠的,因为如果硬盘损坏会带来不可挽回的损失,EasyPass致力于保护用户数据的100%可靠,引进了异地多活技术。目前EasyPass有华东和美西两个节点,两地数据异步同步、互为主备。这不仅使得用户数据不丢失,还使得无论用户在国内还是国外,都能流畅自如地使用EasyPass。
EasyPass的原理是每次用户增加或者修改数据后,都会启动一个异步任务。异步任务会快速地将用户数据向其它数据中心转发,异步任务的表结构如下:
{
"id": "任务ID",
"account": "用户帐号",
"method": "接口名称",
"req": "请求数据",
"user_info": "用户信息",
...
}
异步任务的原理是模拟用户请求去依次调用其它数据中心节点的接口,从而实现了用户数据的异地同步。
广告时间(哈哈,允许我推广一下我的密码管理工具)
简单专业的密码管理EasyPass
官网地址:https://www.easypass.tech
官方邮箱:easypass.inc@gmail.com
有疑问加站长微信联系(非本文作者)