平台架构用户系统
為什么要做用戶系統(tǒng)
幾乎每個(gè)應(yīng)用都會(huì)用到用戶系統(tǒng)。如果能夠進(jìn)行通用化,自然是一種很快意的事了。然而到目前為止我還沒(méi)有找到一個(gè)讓我滿意的類似的東西。不是說(shuō)它們不夠好,而在于它們不能滿足管理和部署上的可伸縮性、靈活性及與現(xiàn)有應(yīng)用的可集成性上,所以只好自己做了一個(gè)。
用戶系統(tǒng)的組成
用戶系統(tǒng)在設(shè)計(jì)上是有三部分組成的,用戶基礎(chǔ)信息管理、用戶庫(kù)管理、用戶組管理。大家可能會(huì)對(duì)“用戶庫(kù)”和“用戶組”感到疑惑,覺(jué)得不應(yīng)該同時(shí)出現(xiàn)這兩個(gè)東西,或者只用一個(gè)就可以了。然而這是為了滿足“可伸縮、靈活”特征而特意設(shè)計(jì)的。下面分別就這三部分做一個(gè)說(shuō)明。
用戶基礎(chǔ)信息,沒(méi)有特別的,為了實(shí)現(xiàn)單點(diǎn)登錄,以使各種不同的應(yīng)用進(jìn)行統(tǒng)一的用戶登錄驗(yàn)證,我們只提供簡(jiǎn)單的登錄名、密碼、昵稱等信息。這些信息存儲(chǔ)在中心庫(kù)上。我們可以指定管理員來(lái)對(duì)整個(gè)用戶數(shù)據(jù)進(jìn)行管理,這對(duì)一般的應(yīng)用來(lái)講就可以了,但當(dāng)一個(gè)大型的企業(yè),每個(gè)部門都可以對(duì)自己部門進(jìn)行獨(dú)立的人員管理,這時(shí)就需要擴(kuò)展我們的設(shè)計(jì)。
為此我提供了用戶庫(kù),總部可以創(chuàng)建用戶庫(kù),然后對(duì)用戶庫(kù)進(jìn)行授權(quán),讓各部門管理各自的用戶庫(kù),這樣就實(shí)現(xiàn)了用戶管理的獨(dú)立性和伸縮性。用戶庫(kù)只能用于新建、編輯、刪除用戶,不能做其它的事情。用戶庫(kù)(實(shí)際上是一個(gè)表)的存儲(chǔ)也位于中心庫(kù)上。需要注意的一點(diǎn)是,用戶庫(kù)是屬于平臺(tái)管理的范疇,不屬于某一特定的應(yīng)用。
用戶組只是多個(gè)不同用戶或用戶組的集合,用戶組中的用戶可以來(lái)源于任何一個(gè)用戶庫(kù)。它只能添加或移除用戶,而不能“新建”和“刪除”用戶。這一點(diǎn)非常重要,否則用戶系統(tǒng)的管理會(huì)非常的混亂。用戶組的一個(gè)重要應(yīng)用是建立一個(gè)“穩(wěn)定的授權(quán)模型”,以簡(jiǎn)化管理員的工作。
用戶組的復(fù)雜性和伸縮性遠(yuǎn)遠(yuǎn)超出了用戶庫(kù)的設(shè)計(jì)。主要有兩點(diǎn):
l用戶庫(kù)中的數(shù)據(jù)不需要分布式存儲(chǔ),而用戶組卻需要。用戶組可以有平臺(tái)級(jí)的管理范疇,同時(shí)每個(gè)應(yīng)用系統(tǒng)又都可以管理各自的用戶組數(shù)據(jù)。全部將這些數(shù)據(jù)進(jìn)行集中存儲(chǔ)是不科學(xué)的,會(huì)給中心帶來(lái)不必要的數(shù)據(jù)庫(kù)維護(hù)任務(wù),最好的做法就是各應(yīng)用存儲(chǔ)在各應(yīng)用自己的系統(tǒng)庫(kù)中,這就要求用戶組的存儲(chǔ)是分布式的。
l用戶庫(kù)之間是平等的,而用戶組之間的關(guān)系是交叉的。用戶庫(kù)沒(méi)有父級(jí)用戶庫(kù)的概念,大家都是平等的。而一個(gè)用戶組可能屬于多個(gè)用戶組。
設(shè)計(jì)要點(diǎn)
用戶系統(tǒng)的設(shè)計(jì)總體上貫徹平臺(tái)架構(gòu)中講到的“應(yīng)用與WS分離”及“WS與數(shù)據(jù)庫(kù)分離”兩條宗旨。用戶組的分布式存儲(chǔ)便是一個(gè)很好的應(yīng)用,我們只有一個(gè)用戶組相關(guān)的WS便可以操作分布在不同位置上的數(shù)據(jù)庫(kù)。
其實(shí)用戶組WS和用戶庫(kù)WS是用的同一個(gè)WS,這就是我要給大家講的容器系統(tǒng)。“容器”系統(tǒng)是抽象后的概念,我定義它可以管理三種結(jié)構(gòu)的數(shù)據(jù)形態(tài)。
一、一維結(jié)構(gòu)。容器之間是平等的,沒(méi)有包含與被包含之分,如用戶庫(kù)系統(tǒng)。
二、樹(shù)結(jié)構(gòu)。每個(gè)容器可以有一個(gè)或零個(gè)父容器,如各種分類信息。
三、多父結(jié)構(gòu)。每個(gè)容器可以有多個(gè)或一個(gè)或零個(gè)父容器,但不能形成循環(huán),如用戶組系統(tǒng)。
為了使用容器系統(tǒng),我們必須要遵守一定的規(guī)范。
一、用容器系統(tǒng)提供的模板數(shù)據(jù)表進(jìn)行應(yīng)用數(shù)據(jù)表的創(chuàng)建,這里對(duì)用戶庫(kù)系統(tǒng)為每個(gè)創(chuàng)建的數(shù)據(jù)表名稱冠以“UserLib”前輟,為每個(gè)用戶組系統(tǒng)創(chuàng)建的數(shù)據(jù)表名稱冠以“UserGroup”。
二、使用平臺(tái)規(guī)范的自定義DBInfoSoapHeader,進(jìn)行數(shù)據(jù)庫(kù)信息的傳遞,這個(gè)類中除了包含數(shù)據(jù)庫(kù)連接信息之外還提供了表名稱前輟字段。這樣才能在中心數(shù)據(jù)庫(kù)中即能訪問(wèn)用戶庫(kù)數(shù)據(jù)又能訪問(wèn)用戶組數(shù)據(jù)。當(dāng)然對(duì)用戶組來(lái)講應(yīng)用系統(tǒng)庫(kù)中也存在著用戶組數(shù)據(jù)。
用戶系統(tǒng)中另一個(gè)共用的設(shè)計(jì)是有效時(shí)間,它允許限制用戶及用戶組在某一時(shí)間段內(nèi)的可用性。有效時(shí)間模塊用一個(gè)WS來(lái)表示,但他不直接被客戶端使用,而是作為父類被其它類繼承。這是因?yàn)橛行r(shí)間在意義上不能是一個(gè)獨(dú)立系統(tǒng),另外一個(gè)重要原因在于提高系統(tǒng)的性能,以減少不必要的WS服務(wù)之間的訪問(wèn)開(kāi)銷,及提供事務(wù)處理功能。
我們?cè)谶M(jìn)行用戶管理時(shí),會(huì)經(jīng)常用到“刪除用戶”的功能,但這個(gè)功能在用戶系統(tǒng)中會(huì)有些麻煩。用戶系統(tǒng)是服務(wù)于多個(gè)應(yīng)用的,當(dāng)刪除一個(gè)用戶時(shí),與用戶關(guān)聯(lián)的應(yīng)用數(shù)據(jù)會(huì)形成“孤兒”!如何防止此問(wèn)題的發(fā)生呢?
數(shù)據(jù)依賴系統(tǒng)是解決此問(wèn)題的專用模塊。用戶系統(tǒng)是不了解應(yīng)用的業(yè)務(wù)邏輯的,這件事情只能由應(yīng)用自己去處理關(guān)聯(lián)的數(shù)據(jù)。不同的應(yīng)用將關(guān)聯(lián)關(guān)系注冊(cè)到數(shù)據(jù)依賴系統(tǒng)中,在進(jìn)行用戶刪除時(shí),用戶系統(tǒng)查詢數(shù)據(jù)依賴系統(tǒng)中與用戶關(guān)聯(lián)的注冊(cè)。如果存在注冊(cè),則調(diào)用所注冊(cè)的處理單元,等到所有的處理單元都成功處理才能將此用戶進(jìn)行刪除;如果沒(méi)有注冊(cè),則直接進(jìn)行用戶的刪除。不過(guò)因?yàn)闀r(shí)間關(guān)系,目前數(shù)據(jù)依賴系統(tǒng)并沒(méi)有實(shí)現(xiàn)!只能將不需要的用戶先暫時(shí)禁用了。
這里只是講了用戶系統(tǒng)的技術(shù)點(diǎn),要讓用戶系統(tǒng)更方便的使用還要涉及到平臺(tái)中的其它內(nèi)容,如數(shù)據(jù)庫(kù)冗余系統(tǒng),WS地址服務(wù)系統(tǒng)等。
注意的問(wèn)題
一、用戶信息的擴(kuò)展。
在平臺(tái)用戶系統(tǒng)中,用戶信息是以保證用戶能夠?qū)崿F(xiàn)統(tǒng)一用戶驗(yàn)證而設(shè)計(jì)的,這同時(shí)也說(shuō)明他不能全面的說(shuō)明用戶的基本情況,尤其是一些專業(yè)領(lǐng)域的系統(tǒng)。如銀行及保險(xiǎn)中的用戶家屬信息,社交網(wǎng)站中的興趣愛(ài)好等。對(duì)于這些信息需要由外部應(yīng)用自身來(lái)擴(kuò)展。為了有好的用戶體驗(yàn)及提供很好的集成性,用戶系統(tǒng)提供一個(gè)“用戶詳細(xì)信息”的事件供應(yīng)用來(lái)實(shí)現(xiàn)。
二、基于.NET的使用。如果應(yīng)用使用.Net進(jìn)行開(kāi)發(fā),那么用戶只需要使用CommonWare.Dll文件就可以了。這里面已經(jīng)封裝了很好的客戶端相關(guān)的實(shí)現(xiàn)。它體現(xiàn)了“應(yīng)用與WS分離”的設(shè)計(jì)理念。
三、基于跨平臺(tái)的使用。如果應(yīng)用不是使用.Net進(jìn)行開(kāi)發(fā),那么只好進(jìn)行WS的直接調(diào)用了。
相關(guān)文章
平臺(tái)”我的編程人生à產(chǎn)品à“項(xiàng)目
平臺(tái)架構(gòu)——體系結(jié)構(gòu)
總結(jié)
- 上一篇: ASP.NET Core 获取主机名时的
- 下一篇: Android常见崩溃或闪退的问题描述及