我的是一個抽獎的工程實踐項目,一個項目不管大小,設計需先行,所以本文是着重於大的架構風格,從各種視圖來描述改項目,最后從具體的工程結構的實現和技術采用作為對架構的印證。
一、軟件架構風格
它是對軟件整體從最大的顆粒度上描繪整個的結構與特征,它類似於建築的框架,是鋼構的還是水泥澆灌的,這影響整個工程的質量與實現。
本抽獎系統采用的是數據倉庫風格。在倉庫風格中,有兩種不同的構件:中央數據結構說明當前狀態,獨立構件在中央數據存貯上執行,倉庫與外構件間的相互作用在系統中會有大的變化。按控制策略的選取分類,可以產生兩個主要的子類。若輸人流中某類時間觸發進程執行的選擇,則倉庫是傳統型數據庫;另一方面,若中央數據結構的當前狀態觸發進程執行的選擇,則倉庫是黑板系統。
本抽獎系統自然是傳統的數據庫風格:
具體設計如下:
二、 系統概念原型:
本文打算以分解視圖、依賴視圖、泛化視圖、執行視圖、實現視圖(代碼目錄結構)、部署視圖、工作分配視圖描述該工程
1、分解視圖
分解是構建軟件架構模型的關鍵步驟,分解視圖也是描述軟件架構模型的關鍵視圖,一般分解視圖呈現為較為明晰的分解結構(breakdown structure)特點。分解視圖用軟件模塊勾划出系統結構,往往會通過不同抽象層級的軟件模塊形成層次化的結構。前述分解方法中已經明確呈現出了分解視圖的特征。
2、依賴視圖
依賴視圖展現了軟件模塊之間的依賴關系。比如一個軟件模塊A調用了另一個軟件模塊B,那么我們說軟件模塊A直接依賴軟件模塊B。如果一個軟件模塊依賴另一個軟件模塊產生的數據,那么這兩個軟件模塊也具有一定的依賴關系。 依賴視圖在項目計划中有比較典型的應用。比如它能幫助我們找到沒有依賴關系的軟件模塊或子系統,以便獨立開發和測試,同時進一步根據依賴關系確定開發和測試軟件模塊的先后次序。 依賴視圖在項目的變更和維護中也很有價值。比如它能有效幫助我們理清一個軟件模塊的變更對其他軟件模塊帶來影響范圍。
3、泛化視圖
泛化視圖展現了軟件模塊之間的一般化或具體化的關系,典型的例子就是面向對象分析和設計方法中類之間的繼承關系。值得注意的是,采用對象組合替代繼承關系,並不會改變類之間的泛化特征。因此泛化是指軟件模塊之間的一般化或具體化的關系,不能局限於繼承概念的應用。 泛化視圖有助於描述軟件的抽象層次,從而便於軟件的擴展和維護。比如通過對象組合或繼承很容易形成新的軟件模塊與原有的軟件架構兼容。
本系統組件之間比較獨立,沒有明顯的組合和繼承關系,不過用戶和發布者與抽獎引擎可能存在一定意義上的組合關系
4、執行視圖
執行視圖展示了系統運行時的時序結構特點,比如流程圖、時序圖等。執行視圖中的每一個執行實體,一般稱為組件(Component),都是不同於其他組件的執行實體。如果有相同或相似的執行實體那么就把它們合並成一個。 執行實體可以最終分解到軟件的基本元素和軟件的基本結構,因而與軟件代碼具有比較直接的映射關系。在設計與實現過程中,我們一般將執行視圖轉換為偽代碼之后,再進一步轉換為實現代碼。
5、實現視圖
實現視圖是描述軟件架構與源文件之間的映射關系。比如軟件架構的靜態結構以包圖或設計類圖的方式來描述,但是這些包和類都是在哪些目錄的哪些源文件中具體實現的呢?一般我們通過目錄和源文件的命名來對應軟件架構中的包、類等靜態結構單元,這樣典型的實現視圖就可以由軟件項目的源文件目錄樹來呈現。
本項目的目錄如下:
- api
api主要是user和distributor通過RPC調用的暴露的接口
- common
common主要是一些基礎的ORM類
- distributor
distributor是發布者模塊
- service
service是抽獎服務模塊,里面主要是抽獎邏輯,供給user和distributor遠程調用
- user
user是抽獎用戶模塊
- admin
管理者模塊
- ui
web界面
6、部署視圖
部署視圖是將執行實體和計算機資源建立映射關系。這里的執行實體的粒度要與所部署的計算機資源相匹配,比如以進程作為執行實體那么對應的計算機資源就是主機,這時應該描述進程對應主機所組成的網絡拓撲結構,這樣可以清晰地呈現進程間的網絡通信和部署環境的網絡結構特點。
7、工作分配視圖
工作分配視圖將系統分解成可獨立完成的工作任務,以便分配給各項目團隊和成員。工作分配視圖有利於跟蹤不同項目團隊和成員的工作任務的進度,也有利於在個項目團隊和成員之間合理地分配和調整項目資源,甚至在項目計划階段工作分配視圖對於進度規划、項目評估和經費預算都能起到有益的作用。
三、設計模式
本系統也用到了一些設計模式,比如對於不同的抽獎類型,抽獎的算法運用是采用策略模式,雖然還沒有完全設計好,但大致意思可以用以下的UML圖說明:
四、數據庫設計
數據庫設計的核心可用如下的邏輯視圖說明:
五、運行環境和技術選型說明
- 運行環境:在多個linux服務器上運行
- 語言:使用java,java對於web,高並發,分布式開發比較成熟,也有很多高可用的框架。
- 數據庫:基礎的采用mysql,高性能緩存采用Redis存儲。
- 框架:使用springboot開發各個模塊;使用Dubbo+Zookeeper開發分布式系統;shiro作為安全機制;elasticsearch作為搜索框架。
- 中間件:為了高並發場景,采用kafka MQ,它具有分布式特點,支持的並發量較高。
- 前端:使用vue等框架。
六、系統概念原型的核心工作機制
簡要說明一下運作內容:
- 抽獎活動的發布者:
查看抽獎活動,創建抽獎活動,發布活動,在抽獎活動的過程中,還可以修改活動規則,內容,獎品數量等; - 用戶:
瀏覽抽獎活動,參與抽獎活動,查看是否中獎,得到中獎通知,填寫個人信息等; - 管理者:
可以查看所有的信息,對不符合規定的抽獎行為,活動,予以警告或禁止。
參考鏈接:
http://c.biancheng.net/view/1378.html
https://github.com/mengning/ase/tree/master/se2020