項目源碼地址 github.com/tsingson/go…html
文字有點長, 儘可能寫得簡單明瞭前端
文章歸納內容都寫上了, 因爲文檔進一步細化並補充更多需求後, 須要拆分爲設計文檔/接口文檔/測試文檔/評審文檔.....等等, 這裏再也不持續更新.java
後續補充變動, 請訪問 項目源碼地址mysql
因爲帶一個朋友學習 golang 開發, 因此, 這個項目正在重寫, 基本上, 本文提到的內容會所有變動, 主要變動以下:react
因爲是 step by step 給朋友演示開發過程, 因此, 大約分紅三個步驟開發:linux
架構變動以下:android
具體變動, 見 項目源碼地址git
go-ums 開發目標是一個開源項目, 核心由 golang 開發, 提供用戶管理(user-management-subsystem) / AAA 鑑權/受權/計賬 / 多業務會話共享與管理等, 以支持分佈式部署及雲部署爲主要目標github
這是一個從零開始的小項目, 持續漸進golang
在 reading-go 夜讀 相關 issue 討論中, 有個 gin 的練手項目, 有點意思.
這是一個相似的項目, 不一樣的地方是, 這個項目是以文檔開始的.
更多項目關聯文檔, 請訪問 github.com/tsingson/go… , 在 readme 中列示並持續添加中
先有文檔, 再寫代碼. 在文檔簡單說明一些個人設計套路
注: 這裏的設計, Design, 不限於架構設計, 程序設計, 也包含我的在攝影/印刷/書籍/海報中找出問題/解決問題的一些"套路".
先文檔, 後實施, 也是曾經做 SA/SE 的習慣了吧. 當年曾戲稱本身是 Simple Editor , 哈, 懷念那8年, 大鬍子, yaho BB, black more, 北京香山, 上海文廣,三角洲島.......
稍後在持續更新中一一道來, 看看橫向之間的有趣關聯.
不談業務需求, 與業務場景中的人兒們,再好的技術也難以落地變現.
這就是原始需求的收集/整理/清理/梳理, 是開發貫串始終的目標與仲裁準則:
從一個簡單而典型的業務場景開始, 來
這個開源項目是從 goim 在開源社區交流討論後, 在 reading-go 討論中偶然開始的
從業多年, 我的幾乎不在網絡上談論我的在 iT 技術職業經歷, 尤爲是項目細節, 這裏, 算是換個方式來公開談談吧
因此, 這裏也從 goim 做爲起點
不少朋友, 在閱讀 goim 源碼時, 都會感受到, 就算是 im 業務完整實施, 須要與用戶管理結合:
因此, 咱們能夠從上面描述到的, (不能省掉的) 基本業務功能開始
來, 來, 來 ...GO!
( 省略)
稍後補充示意圖
(簡化)
(簡化)
(省略)
(省略)
注, 如下按開發進度做了分組.
分組的意思, 就是排優先級, 排優先級便是排重要/緊急程度(按 SWOT Analysis 方式), 以決定前後處理順序.
用戶相關操做
用戶相關操做
參照 1.2.1 小節, 很容易做一個簡單設計
用戶對象名稱 account
- 用戶ID, 與 goim 配合, 就用 int64 吧, 一個全局惟一的正整數
- email , (簡化), 都是字符串, email 格式也不驗證, 其中 email 字符串長不得少於5個字符( >=5 ) ,
- password, (簡化) 都是字符串, 密碼不得少於6個字符( >= 6), 字符爲 a..zA..Z0..9$%-
- access tokdn 通告令牌, 也用字符串代替吧, 字符串長度 >=32 字符
- 用戶角色, 分別爲 非會員, 會員
- 用戶狀態, 分別爲註冊未激活, 已激活, 禁用, 已刪除
- 用戶建立時間, 簡單點, 用 int64 或 UTC timestamp
- 用戶信息變動時間, 簡單點, 用 int64 或 UTC timestamp
操做結果(狀態)定義
- transaction ID 事務惟一標識
- 狀態碼, 整數, 操做成功返回 200 / 操做失敗返回 500 / 請求接受並在處理中返回202
- 操做結果文本信息, 少於255字符, 操做成功, 文本信息, 要求標記業務操做名稱, 如 register ), 操做失敗, 返回失敗緣由( 文本信息 )
注: transaction ID 事務惟一標識, 支持異步操做, 以支持分佈式或集羣, 以及操做失敗時, 進行操做重試( 這樣可讓服務端處理上次操做失敗的數據, 例如進行清理, 或繼續使用, 以及在日誌中進行檢查/審計)
原型實現的約束與限制:
- 爲了快速實現原型, 用戶密碼直接存儲, 不加密
- 用戶ID , 直接用用戶建立的 utc 時間截( 納秒 )
簡化操做結果(狀態定義), 這裏先按 golang 實現習慣方式, 操做結果修改成 go 的 error 返回( 即 error = nil 或 != nil ) 注: 這個地方, 只是針對 go 的簡化
(簡化)
- 用戶註冊 register ------> 調用 exists 檢查是否重複註冊, 若是不是, 建立用戶ID 並保存用戶信信息, 返回用戶數據( 不返回密碼), 返回操做結果狀態碼
- 檢查用戶是否重複存在 exists, 返回操做結果
- 用戶登陸 login ------> 以 email + pwd 登陸, 登陸成功, 建立並返回 access token, 返回操做結果狀態碼
- 用戶登出 logout -----> 清除 access token , 返回操做結果狀態碼
- 用戶認證 auth -------> 輸入用戶ID 或 token , 調用 verify 檢查 會話中的token 是否合法, 若是 token 合法則返回成功, 返回操做結果狀態碼
- 用戶令牌驗證 verify --------> 檢查 token 是否存在, 而且是否相等, 返回操做結果狀態碼
業務流程描述: 客戶端 ----------> 服務端, 進行用戶註冊, 發送註冊數據, 由服務器端返回註冊成功(獲取用戶ID ) 或失敗信息
大白話:
接口就是兩個網元之間, 進行交互/通信的網絡協議/控制通訊命令(信令)/以約定格式傳輸相關數據(數據封裝)的簡稱
例如 web 瀏覽器與 web 服務器這兩個網元之間, 通常採用 HTTP 協議, 信令是 GET / POST / PUT / PATCH / DELETE ...., 數據封裝一般是以 MIME 來指定, 好比下面用到的 "application/json; charset=utf-8"
設計實現如下接口
接口設計, 事實是描述一下業務數據的輸入/輸出, 以及須要對接的兩端業務主體的業務過程(業務上如何進行交流與處理) 這裏簡化掉了, 並細化得很"編程化"了
關於 RESTful 接口, 相關推薦規範, 請自行查詢
這裏先簡要說明一下:
RESTful 一般是 HTTP + json 實現的接口, 其中
相似 /api/v1/account 這樣的 URI 就是一個接口, 其中 /api/v1 前綴只是輔助管理
在下面咱們示例實現的用戶註冊接口, 能夠定義爲 /api/v1/register 或者 /xxx/yyyy 這樣你喜歡的方式
HTTP 的 method 就是操做方式, 例如:
- GET:讀取(Read)
- POST:新建(Create)
- PUT:更新(Update)
- PATCH:更新(Update),一般是部分更新
- DELETE:刪除(Delete)
數據編碼(序列化/反序列化) 是 "application/json; charset=utf-8」 標的 JSON 格式
少許操做關聯數據, 能夠在 HTTP header 中傳遞, 好比 transactionID/ token / cookie , 這些關聯數據, 通常用來協助狀態跟蹤
對照 2.3.1 , 用戶註冊的接口, 能夠設計以下
--------->input請求
請求資源
POST 請求如下網址 http://localhost:3001/api/v1/register
request header
Context-Type: "application/json; charset=utf-8"
TransactionID: "201001419845668864"
複製代碼
request body
{
"email": "test@email.com",
"password": "201001419845668864"
}
複製代碼
--------->output返回
response header
Context-Type: "application/json; charset=utf-8"
TransactionID: "201001419845668864"
複製代碼
操做成功, 返回 http 狀態碼 200, 返回數據以下
response body
{
"email": "test@email.com",
"password": "201001419845668864"
}
複製代碼
操做失敗, 返回狀態碼 500, 返回數據以下
**
{
"transactionID":"201001419845668864"
"code": 500,
"msg": "用戶Email已經被其餘用戶使用, 請選擇其餘email從新註冊"
}
複製代碼
其餘部分, 稍後補充.........
先簡化爲如下架構做爲驗證原型開發
client ( 多個) <----> gateWay( HA熱備, 支持路由/分流等) <-----> AAA (本地緩存, 多個部署)<-------> UMS ( 雙機熱備)
其中:
稍後補充.........
因爲需求緣由, 咱們須要考慮達成如下目標:
因此, 先拍腦殼隨意定義一下要實現目標, 以下所示. 接下來, 再評估哪些真正須要, 優先級, 以及具體實現方案
稍後補充說明部分
用戶模型與操做的 golang 實現
(說明省略)
(說明省略)
(說明省略)
測試用例以下
見 /pkg/service 下測試代碼
見 /pkg/web 下各測試代碼
見 /cmd/cli 下代碼
稍後補充..........
稍後補充.............
省略 ...
_
_
網名 tsingson (三明智, 江湖人稱3爺)
原 ustarcom IPTV/OTT 事業部播控產品線技術架構溼/解決方案工程溼角色(8年), 自由職業者,
喜歡音樂(口琴,是第三/四/五屆廣東國際口琴嘉年華的主策劃人之一), 攝影與越野,
喜歡 golang 語言 (商用項目中主要用 postgres + golang )
_
題圖: 2018/12/24 香港黑白攝影展前, 與深圳影友在香港街頭
_
tsingson 寫於中國深圳
小羅號口琴音樂中心, 2019/05/11