1. 程式人生 > >java多使用者商城系統架構之第一篇——總的介紹

java多使用者商城系統架構之第一篇——總的介紹

本系列文章主要是針對Java商城相關架構演化的介紹,不講解具體業務、技術等。

最近公司要搞商城,讓我多方諮詢,最後看了很多,要不就是程式碼、表字段註釋不全,要不就是bug多,要麼就是文件缺少,最後決定自己開發一套商城。

下面是開發的一些心得體會,權且記錄下來,給自己做個記錄把。

之前一直都是在從事電商相關和網際網路金融開發,處理過億級資料量,所以被目前這家公司看重。

由於Java是開源的,最近幾年Hadoop等開源產品越來越成熟,而且是基於Java的,所以最終選擇Java最後後臺開發語言,現在前端是自己的前端工程師寫的js,後期準備改成前端是PHP,中間是Go語言,後臺伺服器是

Java,因為PHP寫前端很厲害,不過這個也是後期了。

控制層:這幾年springMVC發展的非常火,而且開發效率比較高,struts系列已經完全沒落了,所以現階段選擇SrpingMVC。

檢視層:網上已經有非常多的測試過JSP、freemarkder、velocity等,結果效能:velocity>freemarker>jsp,開發速度:velocity>freemarker>jsp

資料庫設計:

    1、關鍵的一個是絕對不能有外來鍵強關聯我看到類似用hibernate產品的一些公司,全部都是強關聯,那你以後想刪除一些資料,那真是噩夢的,這個還不用說,查詢效能方面影響也是巨大的。

   2、分庫分表,這個必須要支援的,做網際網路資料量是非常的巨大的,如果開始就不能支援分庫分表,那麼後期會至少花上千萬去做這事,最好一個例子就是噹噹網,當年很多事單庫的,到現在也沒有實現分庫分表,它們只能使用一些分割槽表架構,分割槽表本身就存在很大問題,比如擴充套件性、資料量過億都是問題!!!!

  3、分散式圖片伺服器:我看到有些公司圖片還是上傳到專案根目錄的,這個真是噩夢,測試圖片就有15個G,你怎麼玩???

資料庫選擇:

最好還是myslq,

   1、輕量

   2、開源(阿里的alisql就是MySQL改個名字)

   3、功能能滿足電商需求

搜尋:選擇lucene較好,原因是他封裝的較好。

許可權:對於電商來說不應該設計的過於複雜,我認為主要就兩張表就夠了,一個是角色Role表,一個是資源Resources表,然後使用者和角色通過中間表關聯下就OK了,角色裡面有資源,很簡單的邏輯。

SpringSecurity和Apache Shiro都是基於RBAC的,但是兩者的R是不一樣的,Security是Role,Shiro是Resource,所以Security不能細粒度的控制權限,這裡就不推薦大家使用了,建議有些公司使用這個做許可權的換成Shiro或者自定義一套,也是非常簡單的。其實網際網路專案並不需要太多的許可權校驗,因為每個專案模組都是獨立的,這個就減去一塊許可權校驗,剩下來才是真正的角色許可權邏輯。

注:這裡不推薦使用是因為我主要就是角色控制,其實這些許可權框架主要是授權,如果你專案沒有授權需要,那不如不用,用了反而增加開發成本。

快取:

1、資料快取

   目前使用Redis,我看到有的公司使用的是memcache,這個10年前,就這屌樣,功能非常的簡陋不說,主要一個問題是會有死快取,就是快取怎麼也清空不了,這個你想想就知道多悲劇了,商家修改了價格,怎麼也改不了,最後只能關閉機器重啟。還有的公司使用的還是hibernate提供的ehcache,這個大家自行了解即可,關鍵是他做叢集有問題,搞電商不可能是單機的,剛上線至少是2臺伺服器。

2、圖片、檔案等快取

   訪問圖片下載、頁面下載也是非常耗費頻寬的,那麼怎麼解決?

   圖片、檔案(css、js、html靜態頁面)都需要做CDN快取來解決,類似京東、淘寶都是通過替換檔案的方式,比如你第一次訪問了,這個檔案在你們本機電腦設定的時間是永久儲存方式,不過期的,那麼要替換css、js怎麼玩?換一個檔名呀,看著噁心不?但是訪問速度確實非常快的。。。

靜態化:一般模版語言都可以實現靜態化,可以實現全站60%都是靜態頁面,資料從叢集Redis快取中讀取。

服務化:目前使用dubbo,雖然阿里開源的產品程式碼質量被人詬病,但是阿里的東西經受住高併發、大流量的考驗,即時老外的東西再好,也沒有這樣的場景去考驗,雖然權衡後選擇dubbo。

分散式圖片伺服器:這個也是非常重要的環節,目前我們測試系統都有15個G的圖片了!!!!線上估計會是以T計算的,肯定是需要獨立的圖片伺服器的。目前推薦使用FastDFS,這個還不錯——圖片、壓縮包之類的檔案都可以上傳。

叢集、分散式:前面的分庫分表、服務化、圖片伺服器都是為叢集、負載、分散式做準備的,業務層用dubbo做分散式服務。

負載均衡:使用Nginx來做高可用負載,給予CDN切換方式做高可用,一般公司市值30億美金的都能滿足。在以後的話就用F5吧。。。。。收費的嘛,你懂得。。。

下面整理下整個架構吧:

    展示層/控制層:springMVC

    持久層:本團隊開發的mybatis增強版本(程式設計師幾乎不需要寫SQL、配置等)

    資料庫MySQL/Oracle,支援主從複製、讀寫分離、多機備份、支援分庫分表

    快取機制:redis,CDN圖片快取,也是支援熱備份、高併發

    靜態化機制:velocity/freemarker等模版語言

    分散式圖片伺服器:FastDFS

    搜尋引擎: Lucene 

    伺服器:Linux

    中介軟體:tomcat、nginx,還有其他N多的支援叢集部署的安裝間接軟體,就不一一列舉了

    圖片伺服器:通過分散式檔案系統FastDFS

    叢集方案:多機tomcat,seesion統一管理,圖片統一管理。這些需要一套解決方案。

    伺服器要求:linux/windows,8G記憶體,空間200G以上

   最後對於JAVA領域商城的開發,其實在PHP、.NET語言中,已經有非常多的成熟同類產品了,比如shopnc、ecshop等等等,但是PHP的邏輯都是寫在前臺檔案中,這個就跟JAVA中的邏輯都是寫在了JSP中一樣,這樣雖然便於開發,但是安全性、擴充套件性方面都不行,後期二次開發、維護也不方便。另外.NET語言大家都是知道的,它是不開源的,這個我覺得不敢用的,哪天你遇到致命bug了,沒法從底層排查,這也是為什麼銀行、金融、電商很多行業不用這個語言原因了。

  還有外行的人被推薦使用apache ofbiz,這個框架就是個大雜燴,大家不過分神話它。

  另外對於JAVA開發方面,其實如果有好的架構,JAVA程式設計師只寫邏輯,前端只寫前端,資料庫DBA只關注DBA,這樣的話,開發起來會非常的方便。我們團隊目前也是花了很長時間,也借鑑了很多成熟的框架,研發了一套適合商城開發的一套架構。等到以後有機會可以開源出來給大家。