版權 © 2014 http://netkiller.github.io
版權聲明
轉載請與作者聯繫,轉載時請務必標明文章原始出處和作者信息及本聲明。
|
|
|
微信掃瞄二維碼進入 Netkiller 微信訂閲號 QQ群:128659835 請註明“讀者” |
2014-09-26
CVS(Controller, View, Service) 是控製器、視圖、服務框架。
View 視圖層不用多說
Controller 控製器層,負責用戶業務邏輯
Service 服務層,服務端業務邏輯與數據存取操作
我提出的CVS其實是MVC去掉Mode其他保持不變, 將Mode替換為Service, 同時將以部分Controller邏輯放入 Service 實現業務邏輯共享。
目前軟件開發領域主流MVC模式,或者其他MTV,CURD等等,往往都是MVC不分離,即業務邏輯與資料庫操作不分家。這給帶來了很多數據安全問題。
通常DBA會提供一個資料庫訪問用戶,該用戶可以做“增”、“刪”、“查”、“改”操作,權限的顆粒度控制比較粗糙,例如對行的權限,列的權限控制就比那麼容易做。
以上談的是為什麼採用CVS模式開發的原因之一。
第二個原因是大型系統不可能使用一台伺服器,而是分散式模式,這就帶來了很多應用跨物理機的訪問,我們將很多業務邏輯以服務的方式提供集群節點調用。
這種模式同時我們的服段提供分散式部署,負載均衡與高可用需求。解決了性能問題、橫向擴展問題等等。
立項之初決定採用CVS模式開發當然最好,如果沒有,可以中途新增功能採用CVS模式,然後逐步向CVS模式過度。
在我的團隊中,由於安全問題,我將開發團隊分為幾個部門,分出一部人專門負責Service的開發,這樣其他開發者無需關心資料庫解決以及數據存儲。只需要安裝前面的團隊提供的介面文檔開發即可。
另外這種開發模式有個好處,它利於多個項目同時開發,我們只需提前定義好介面的名稱、輸入參數與輸出參數,開發與調試每個團隊可以自行模擬介面的返回數據,提前開發功能模組。
下面是我設計的CVS框架,並在我的工作中得到廣泛應用,從反饋角度看,目前無論是安全性,還是性能,伸縮性,都非常滿意。
下面我們分別講解每個部門的功能與作用。
框架最頂層是物理防火牆,常同時硬件設備,這裡不多說。對於訪問者直接面對的是web伺服器與mq伺服器。
我提供json, soap, xml-rpm 通過web伺服器向訪問者提供服務,另一個通道是MQ消息隊列伺服器,你可以擴展前端介面並提供其他形式的介面。例如fifo,基于tcp/ip的ipc, unix socket等等。
應用防火牆是軟件層面防火牆,在我們沒有能力購買昂貴的硬件設備的時候,我們可以使用該功能,用來阻止或放行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'), )
json 模式訪問服務需要驗證指紋摘要信息,一可以確認人份,二可以驗證數據完整性
我們還提供非對稱加密傳輸,通過公鑰與私鑰配對加密與解密。
綜上所述我們在安全方面基本都考慮到了,比較全面,可以說武裝到牙齒。
記錄每一次訪問,包括IP來源地址,用戶名,訪問類方法以及訪問時間。
這裡也不必多說
我們分開部署SSL與WEB伺服器,不要讓SSL加密與解密過程影響到Service的工作,這種做法通常叫SSL卸載。可以將SSL放在F5等負載均衡設備之上,也可以使用廉價的伺服器。
伺服器的負載均衡這裡也不多說。
+------------------------+ .-------------> | JS, CSS, Javascript | / +------------------------+ / +------+ +------+ +----------+ User ---> | HTML | ----------> | View | ---> | Template | +------+ +------+ +----------+ \ ^ \ | \ +------------+ +---------+ +---------+ +----------+ `--- Ajax ---> | Controller | ---------> | Service | ---> | Cache | ---> | Database | +------------+ +---------+ +---------+ +----------+