CVS開發框架

http://netkiller.github.io/journal/cvs.html

Mr. Neo Chen (陳景峯), netkiller, BG7NYT


中國廣東省深圳市龍華新區民治街道溪山美地
518131
+86 13113668890


版權聲明

轉載請與作者聯繫,轉載時請務必標明文章原始出處和作者信息及本聲明。

文檔出處:
http://netkiller.github.io
http://netkiller.sourceforge.net

微信掃瞄二維碼進入 Netkiller 微信訂閲號

QQ群:128659835 請註明“讀者”

2014-09-26

摘要

目錄

1. 什麼是CVS框架

CVS(Controller, View, Service) 是控製器、視圖、服務框架。

View 視圖層不用多說

Controller 控製器層,負責用戶業務邏輯

Service 服務層,服務端業務邏輯與數據存取操作

我提出的CVS其實是MVC去掉Mode其他保持不變, 將Mode替換為Service, 同時將以部分Controller邏輯放入 Service 實現業務邏輯共享。

2. 為什麼採用CVS模式開應用程序

目前軟件開發領域主流MVC模式,或者其他MTV,CURD等等,往往都是MVC不分離,即業務邏輯與資料庫操作不分家。這給帶來了很多數據安全問題。

通常DBA會提供一個資料庫訪問用戶,該用戶可以做“增”、“刪”、“查”、“改”操作,權限的顆粒度控制比較粗糙,例如對行的權限,列的權限控制就比那麼容易做。

以上談的是為什麼採用CVS模式開發的原因之一。

第二個原因是大型系統不可能使用一台伺服器,而是分散式模式,這就帶來了很多應用跨物理機的訪問,我們將很多業務邏輯以服務的方式提供集群節點調用。

這種模式同時我們的服段提供分散式部署,負載均衡與高可用需求。解決了性能問題、橫向擴展問題等等。

3. 何時採用CVS模式開發

立項之初決定採用CVS模式開發當然最好,如果沒有,可以中途新增功能採用CVS模式,然後逐步向CVS模式過度。

4. 何處採用CVS模式開發

5. 誰來做,以及分工問題

在我的團隊中,由於安全問題,我將開發團隊分為幾個部門,分出一部人專門負責Service的開發,這樣其他開發者無需關心資料庫解決以及數據存儲。只需要安裝前面的團隊提供的介面文檔開發即可。

另外這種開發模式有個好處,它利於多個項目同時開發,我們只需提前定義好介面的名稱、輸入參數與輸出參數,開發與調試每個團隊可以自行模擬介面的返回數據,提前開發功能模組。

6. 怎樣設計並實施CVS

下面是我設計的CVS框架,並在我的工作中得到廣泛應用,從反饋角度看,目前無論是安全性,還是性能,伸縮性,都非常滿意。

下面我們分別講解每個部門的功能與作用。

6.1. 入口部分

框架最頂層是物理防火牆,常同時硬件設備,這裡不多說。對於訪問者直接面對的是web伺服器與mq伺服器。

我提供json, soap, xml-rpm 通過web伺服器向訪問者提供服務,另一個通道是MQ消息隊列伺服器,你可以擴展前端介面並提供其他形式的介面。例如fifo,基于tcp/ip的ipc, unix socket等等。

6.2. 應用防火牆,用戶認證,訪問控制列表

應用防火牆是軟件層面防火牆,在我們沒有能力購買昂貴的硬件設備的時候,我們可以使用該功能,用來阻止或放行IP地址。如果你有硬件防火牆,我仍然建議你使用,可以防止網絡管理員配置上的疏忽。

用戶認證不必多說,我們提供很多種用戶認證渠道。

ACL 是控制Class 與 Method 的訪問權限,我通常會創建很多用戶,例如frontend針對前端,面向用戶,backend針對後台,面向企業員工等等,下面我舉一個例子:

'frontend' => array(
    'frontend/Exchange'=> array('getOne','',''),
    'frontend/Userinfo'=> array('getUserInfo','getMemberInfo',''),
    'frontend/Config'=> array('getWithdrawingConfig','getPlatFormConfig',''),
    'frontend/Keyloggers'=> array('insertSignupKeyloggers','deleteSignupKeyloggers'),
    'frontend/Allinpay'=> array('insertOrder','updateOrder','isFirstAccount'),
    'frontend/Members'=> array('getChineseNameMobile','changeMemberPassword','resetMemberPassword','getLoggingTime','insertMember','checkUserRealName'),
    'frontend/Balance_report'=>array('getdayreport','getmonthreport'),
	'frontend/Notice'=>array('send','registerVcode','passwordVcode'),
    'frontend/Pay'=>array('showPayList','pay'),
	'frontend/Accounts'=>array('isFirstAccount','isFirstAccountAngelFund'),
	'frontend/Exchange'=>array('getRate'),
    'frontend/Card'=>array('upload'),
),
'backend' => array(
    'backend/Keyloggers'         =>array('SelectSignupKeyloggers','updateSignupKeyloggers','SelectSignupKeyloggersAll'),
    'backend/Members'=> array('selectPasswordLog','downPasswordLog'),
    'backend/Balance_report'=>array('getdayreport','getmonthreport','getshow'),
),
'anonymous' => array(
    'News'=> array('getNews','getFirst','getTop10'),
    'RSS'=> array('','','')
)
'soap' => array(
          'Members'=> array('getAllByUsernameAndMobile','getAllByLimit',''),
          'Exchange'=> array('getOne','',''),
          'Soaplog'=> array('info','debug','warning','error'),
)
			

6.3. 消息摘要與證書

json 模式訪問服務需要驗證指紋摘要信息,一可以確認人份,二可以驗證數據完整性

我們還提供非對稱加密傳輸,通過公鑰與私鑰配對加密與解密。

綜上所述我們在安全方面基本都考慮到了,比較全面,可以說武裝到牙齒。

6.4. 日誌

記錄每一次訪問,包括IP來源地址,用戶名,訪問類方法以及訪問時間。

6.5. 資料庫抽象層

這裡也不必多說

7. 怎樣部署CVS

我們分開部署SSL與WEB伺服器,不要讓SSL加密與解密過程影響到Service的工作,這種做法通常叫SSL卸載。可以將SSL放在F5等負載均衡設備之上,也可以使用廉價的伺服器。

伺服器的負載均衡這裡也不多說。

                               +------------------------+
               .-------------> | JS, CSS, Javascript    |                  
              /                +------------------------+
             /                  
          +------+             +------+      +----------+
User ---> | HTML | ----------> | View | ---> | Template |
          +------+             +------+      +----------+	
             \                    ^
              \                   |
               \               +------------+            +---------+      +---------+      +----------+
                `--- Ajax ---> | Controller | ---------> | Service | ---> | Cache   | ---> | Database |
                               +------------+            +---------+      +---------+      +----------+