童二寶 彭戰(zhàn)軍
摘 ?要: aiBuy商城是一個(gè)基于J2EE的綜合性B2C電商平臺(tái),用戶可以在商城內(nèi)瀏覽和購(gòu)買商品。aiBuy商城采用分布式集群技術(shù),整合SSM框架來(lái)實(shí)現(xiàn)。使用Nginx作為圖片服務(wù)器、搭建Solr集群作為搜索服務(wù)器、Redis做緩存、ActiveMQ做消息中間件、Dubbo做服務(wù)中間件,SSO來(lái)實(shí)現(xiàn)單點(diǎn)登錄。aiBuy商城可以解決高并發(fā)、高可用和高性能等諸多問(wèn)題。經(jīng)過(guò)測(cè)試,該系統(tǒng)可以基本滿足用戶購(gòu)物需求。
關(guān)鍵詞: J2EE;分布式集群;SSM;Redis;高并發(fā)
中圖分類號(hào): TP391 ? ?文獻(xiàn)標(biāo)識(shí)碼: A ? ?DOI:10.3969/j.issn.1003-6970.2019.08.029
本文著錄格式:童二寶,彭戰(zhàn)軍. 基于分布式集群技術(shù)的SSM購(gòu)物商城系統(tǒng)設(shè)計(jì)[J]. 軟件,2019,40(8):123126
【Abstract】: aiBuy Mall is a comprehensive B2C e-commerce platform based on J2EE, users can browse and purchase goods in the mall. aiBuy Mall adopts distributed cluster technology and integrates SSM framework to achieve. Use Nginx as the image server, build the Solr cluster as the search server, Redis as the cache, ActiveMQ as the message middleware, HttpClient as the service middleware, and SSO to implement single sign-on. aiBuy Mall can solve many problems such as high concurrency, high availability and high performance. After testing, the system can basically meet the user's shopping needs.
【Key words】: J2EE; Distributed Cluster; SSM; Redis; High Concurrency
0 ?引言
隨著生活水平的提高,網(wǎng)上購(gòu)物逐漸成為當(dāng)下人們追求潮流的方式之一。購(gòu)物大潮導(dǎo)致的直接問(wèn)題就是購(gòu)物網(wǎng)站系統(tǒng)的崩潰,這是由于服務(wù)器在高并發(fā)情況下承受的負(fù)載壓力過(guò)大,導(dǎo)致出現(xiàn)宕機(jī)現(xiàn)象。在如此環(huán)境下,設(shè)計(jì)可以承受高并發(fā)的電商平臺(tái)就顯得十分重要。
J2EE(Java2 Platform Enterprise Edition)[1]是SUN公司使用Java技術(shù)開發(fā)的一套企業(yè)級(jí)應(yīng)用規(guī)范,它是為了簡(jiǎn)化企業(yè)應(yīng)用開發(fā)、管理和部署。J2EE采用了MVC分層設(shè)計(jì)模式[2],降低了組件之間的耦合度,大大減輕了客戶端和服務(wù)端的壓力。MVC包括了三大層:Model層(模型層)、View層(視圖層)、Controller層(控制層)。該系統(tǒng)以當(dāng)前較為流行的輕量級(jí)SSM[3-5]框架(SpringMVC、Spring和MyBatis)為核心框架,摒棄了原始的SSH框架(Struts2、Spring和Hibernate),提高了開發(fā)效率,簡(jiǎn)化了程序開發(fā)步驟。在MVC基礎(chǔ)上,再添加服務(wù)層(Service層)以及數(shù)據(jù)訪問(wèn)層(Dao層),Controller層負(fù)責(zé)接收和處理來(lái)自View層的請(qǐng)求轉(zhuǎn)發(fā),Service層負(fù)責(zé)業(yè)務(wù)邏輯處理,Dao層負(fù)責(zé)與數(shù)據(jù)庫(kù)交互,實(shí)現(xiàn)持久化操作。將SSM框架與目前火熱的分布式集群技術(shù)整合在一起,可以將各個(gè)功能模塊獨(dú)立出來(lái),降低模塊之間的耦合性,方便進(jìn)行分布式部署,就有望設(shè)計(jì)出一個(gè)可使用的大型網(wǎng)上購(gòu)物平臺(tái)。
1 ?系統(tǒng)介紹
采用分布式系統(tǒng)架構(gòu)的aiBuy商城系統(tǒng)的模塊劃分主要由以下幾部分組成:后臺(tái)管理模塊、前臺(tái)管理模塊、訂單生成模塊、商品搜索模塊、登錄(注冊(cè))模塊以及訂單支付模塊等。后臺(tái)管理模塊主要完成對(duì)商品的管理(包含商品的增加)刪除、修改、查詢),以及用戶信息管理等;前臺(tái)系統(tǒng)包含商城的首頁(yè)顯示、用戶的注冊(cè)、登錄以及商品瀏覽等;訂單生成模塊主要是提供下單、訂單查詢、訂單修改以及訂單提交等服務(wù);商品搜索模塊即提供商品的搜索功能,方便用戶;登錄(注冊(cè))模塊實(shí)現(xiàn)用戶的注冊(cè)和登錄操作;訂單支付模塊提供支付服務(wù)。典型的分布式架構(gòu)如圖1所示。
2 ?系統(tǒng)設(shè)計(jì)
2.1 ?開發(fā)環(huán)境
操作系統(tǒng):Windows 7;數(shù)據(jù)庫(kù)服務(wù)器:MySQL 5.7,Redis 3.0.0;Web服務(wù)器:Tomcat 8.0,Nginx 1.8.0;開發(fā)工具:MyEclipse(自帶Maven 3.3.3插件);版本控制工具:SVN 1.8.0;JDK版本:JDK1.8.0。配置:主頻2.0 GHZ以上;內(nèi)存:4G以上;硬盤:100G以上。
2.2 ?相關(guān)技術(shù)
系統(tǒng)后端是通過(guò)整合J2EE和SSM輕量級(jí)框架來(lái)實(shí)現(xiàn),前端用戶界面采用EasyUI[6-7]框架實(shí)現(xiàn)。前后端是通過(guò)RESTful[8]架構(gòu)來(lái)實(shí)現(xiàn)分離的。
(1)Spring框架。Spring為現(xiàn)代基于Java的在任何類型的部署平臺(tái)上的企業(yè)應(yīng)用程序提供了全面的編程和配置模型。Spring的一個(gè)關(guān)鍵要素是應(yīng)用程序級(jí)別的基礎(chǔ)架構(gòu)支持:Spring專注于企業(yè)應(yīng)用程序的“管道”,以便團(tuán)隊(duì)可以專注于應(yīng)用程序級(jí)業(yè)務(wù)邏輯,而無(wú)需與特定部署環(huán)境建立不必要的聯(lián)系。Spring框架包含兩大理念:IoC(控制反轉(zhuǎn))和AOP(面向切面編程),這兩個(gè)理念大大簡(jiǎn)化了Java的開發(fā)。
(2)SpringMVC框架。SpringMVC是Spring的一部分,SpringMVC旨在運(yùn)用MVC架構(gòu)的思想,來(lái)實(shí)現(xiàn)Web MVC設(shè)計(jì)模式,將Web層進(jìn)行解耦,簡(jiǎn)化日常的Web開發(fā)。MVC的模式圖如圖2所示。
(3)MyBatis框架。MyBatis是一款持久層框架,MyBatis相對(duì)于Hibernate,最明顯的優(yōu)勢(shì)是避免了幾乎所有的JDBC代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集,只需要簡(jiǎn)單的XML或者注解配置就可以實(shí)現(xiàn)持久化。
(4)Redis數(shù)據(jù)庫(kù)。Redis數(shù)據(jù)庫(kù)是一個(gè)Nosql數(shù)據(jù)庫(kù),是以Key-Value鍵值對(duì)的方式保存數(shù)據(jù),主要應(yīng)用于數(shù)據(jù)緩存、高并發(fā)下負(fù)載均衡和Session共享。aiBuy商城使用的是Redis的集群版,啟動(dòng)了6個(gè)Redis實(shí)例,三主三從,這樣做的目的是在宕機(jī)情況下,最大可能地保證數(shù)據(jù)正確性和安全性。
(5)Nginx服務(wù)器。Nginx是一款開源的HTTP服務(wù)器和反向代理服務(wù)器,在aiBuy商城中,Nginx主要是作為圖片服務(wù)器、反向代理服務(wù)器以及負(fù)載均衡服務(wù)器使用。
(6)Solr集群。Solr是Apache下的一個(gè)開源 ?項(xiàng)目,它是基于Lucene的全文搜索服務(wù)器。Solr的集群版使用的是基于Solr和Zookeeper的集群方案SolrCloud,其中Zookeeper是作為集群的信息中心。SolrCloud有諸多優(yōu)點(diǎn),如:集中式的配置信息、自動(dòng)容錯(cuò)、查詢時(shí)自動(dòng)負(fù)載均衡等。
2.3 ?系統(tǒng)功能模塊設(shè)計(jì)
整個(gè)系統(tǒng)的設(shè)計(jì)采用分布式系統(tǒng)架構(gòu)實(shí)現(xiàn),即把系統(tǒng)按照不同的模塊拆分成多個(gè)子系統(tǒng),各個(gè)子系統(tǒng)之間通過(guò)調(diào)用接口來(lái)通信,增加或者刪除某個(gè)模塊不會(huì)對(duì)其它模塊產(chǎn)生影響,可以實(shí)現(xiàn)靈活的分布式部署。系統(tǒng)的架構(gòu)設(shè)計(jì)如圖3所示,服務(wù)層按照?qǐng)?zhí)行模塊的不同,分別提供不同的接口服務(wù),如商品服務(wù)、登錄服務(wù)、訂單服務(wù)以及支付服務(wù)等,這樣做的好處是降低了各個(gè)服務(wù)之間的耦合,當(dāng)要增加一個(gè)服務(wù)模塊時(shí),可以直接添加,不會(huì)對(duì)其它模塊產(chǎn)生影響;而用戶所要做的就是直接調(diào)用這些服務(wù)來(lái)完成購(gòu)物操作,這個(gè)過(guò)程的實(shí)現(xiàn)要依靠RPC遠(yuǎn)程調(diào)用服務(wù),這里選擇Dubbo來(lái)實(shí)現(xiàn)。這些服務(wù)是以接口的形式表現(xiàn),這些接口都統(tǒng)一采用RESTful格式。持久層的工作主要是對(duì)數(shù)據(jù)庫(kù)的數(shù)據(jù)進(jìn)行操作(增刪改查),系統(tǒng)采用Mysql數(shù)據(jù)庫(kù)集群和讀寫分離(MyCat實(shí)現(xiàn))來(lái)減輕數(shù)據(jù)庫(kù)的壓力,集群和讀寫分離均在Linux[9]環(huán)境下進(jìn)行配置和運(yùn)行,使用的是CentOS[10]版本。使用Redis集群來(lái)作為緩存,也可以大大減輕數(shù)據(jù)庫(kù)的壓力。
2.4 ?數(shù)據(jù)庫(kù)表結(jié)構(gòu)設(shè)計(jì)
根據(jù)設(shè)計(jì)需求系統(tǒng)所需要的表有商品表、商品內(nèi)容表、商品類目標(biāo)、商品描述表、商品規(guī)格參數(shù)表、訂單表、用戶表等11個(gè)表。這些表均對(duì)應(yīng)于程序中的實(shí)體類,以下列舉商品表相關(guān)信息,如表1所示:
3 ?系統(tǒng)實(shí)現(xiàn)
由于系統(tǒng)的模塊和功能較多,以下只介紹其中一些模塊的設(shè)計(jì)和實(shí)現(xiàn)。
3.1 ?后臺(tái)管理模塊
后臺(tái)管理模塊主要涉及的是對(duì)商品的信息進(jìn)行管理,即對(duì)商品和商品規(guī)格進(jìn)行CRUD(增刪改查)操作以及對(duì)用戶訂單進(jìn)行處理。在設(shè)計(jì)商品表和商品規(guī)格表時(shí),已經(jīng)為不同的商品設(shè)置了不同的id,因此在對(duì)商品進(jìn)行增刪改查時(shí),只需要將指定商品的id設(shè)置到SQL語(yǔ)句中,在Dao層中對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,就可以實(shí)現(xiàn)這一目的。以下程序段的功能是根據(jù)商品id查詢商品信息并返回。
public Item getItemById (long id) {
ItemExample ex = new ItemExample();
Criteria cri = ex.createCriteria();
cri.andIdEqualTo (id);
List
if(list!=null && list.size() > 0){
Item item = list.get (0);
return item;
}
return itemMapper.selectByPrimaryKey (id);
}
3.2 ?購(gòu)物車模塊
在購(gòu)物車模塊設(shè)計(jì)中,首先要考慮的問(wèn)題是用戶在登錄和未登錄兩種情況下將商品加入購(gòu)物車(購(gòu)物車在程序中是一個(gè)類),后臺(tái)應(yīng)該怎樣保存商品信息。在用戶將商品加入到購(gòu)物車時(shí),通過(guò)在程序中加入攔截器來(lái)判斷用戶是否登錄,如果已登錄,則直接將購(gòu)物車放入Redis緩存中;未登錄則將購(gòu)物車放入cookie[11]中,待登錄后再放入Redis緩存中,這樣的設(shè)計(jì)類似于京東商城,可以確保用戶在登錄和未登錄情況下,均可以將商品加入購(gòu)物車,購(gòu)物車的設(shè)計(jì)框架如圖4所示。
3.3 ?支付模塊
支付模塊使用的是阿里巴巴旗下的Alipay(支付寶)技術(shù)實(shí)現(xiàn),為了測(cè)試方便,整個(gè)支付操作是在支付寶的沙箱環(huán)境下進(jìn)行,上線時(shí)會(huì)用真實(shí)環(huán)境。沙箱環(huán)境下可以不用提供真實(shí)的商戶appid(用于識(shí)別商戶的唯一ID)、商戶公鑰、私鑰等參數(shù),支付寶的沙箱環(huán)境可以模擬出這些數(shù)據(jù)供使用。沙箱環(huán)境也會(huì)提供相關(guān)的Demo供測(cè)試,在把支付程序整合到整個(gè)項(xiàng)目中時(shí),把支付作為一個(gè)單獨(dú)的服務(wù),并對(duì)外提供調(diào)用接口。當(dāng)用戶在商城中提交訂單并點(diǎn)擊支付時(shí),程序會(huì)調(diào)用支付服務(wù)接口,并把訂單號(hào)、訂單名稱、付款金額、商品描述等信息作為參數(shù)傳遞給支付服務(wù)程序,用戶在支付時(shí),可以選擇PC支付也可以使用移動(dòng)端掃碼支付,且支付速度很快。以下是程序跳轉(zhuǎn)到支付寶界面進(jìn)行支付的部分代碼,程序的首要任務(wù)是要根據(jù)傳遞過(guò)來(lái)的訂單號(hào)來(lái)獲得訂單信息,即獲得Order這個(gè)訂單對(duì)象。
@RequestMapping (value = “/goAlipay”, produces = “text/html; charset = UTF-8”)
@ResponseBody
public String goAlipay (String orderId, HttpServletRequest request, HttpServletRequest response) throws Exception {
Orders order = orderService.getOrderById (orderId);
Product product = productService. getProductById (order.getProductId());
4 ?結(jié)論
本文通過(guò)流行的SSM(SpringMVC、Spring和MyBatis)框架實(shí)現(xiàn)了一個(gè)網(wǎng)上商城系統(tǒng)設(shè)計(jì),該系統(tǒng)實(shí)現(xiàn)了基本的網(wǎng)上購(gòu)物操作,具有一定的實(shí)用價(jià)值。在系統(tǒng)設(shè)計(jì)上,采用了分布式架構(gòu)設(shè)計(jì),使得相互獨(dú)立的模塊能夠緊密聯(lián)系在一起,降低了系統(tǒng)之間的耦合性,提高了程序運(yùn)行效率。經(jīng)測(cè)試,系統(tǒng)能夠穩(wěn)定運(yùn)行,各個(gè)功能模塊的設(shè)計(jì)都很成功,達(dá)到了預(yù)期目的且系統(tǒng)的可擴(kuò)展性很強(qiáng),方便后續(xù)的改良和完善。
參考文獻(xiàn)
[1] 唐權(quán). SSM框架在JavaEE教學(xué)中的應(yīng)用與實(shí)踐[J]. 福建電腦, 2017(12): 93-94.
[2] 王金朔, 孫延輝. 基于SSM和Java的網(wǎng)上訂餐系統(tǒng)設(shè)計(jì)[J]. 信息通信, 2018, 190(10): 104-105.
[3] 錢春陽(yáng). 基于SSM的“互聯(lián)網(wǎng)+”數(shù)據(jù)銀行的設(shè)計(jì)與實(shí)現(xiàn)[J]. 電腦知識(shí)與技術(shù), 2018, 14(18): 70-72.
[4] 龔夢(mèng)星, 劉波, 黃天天, et al. 基于SSM框架與嵌入式系統(tǒng)的農(nóng)村應(yīng)急廣播系統(tǒng)設(shè)計(jì)[J]. 軟件, 2017(5): 51-56. .
[5] 吉豪杰. 大數(shù)據(jù)時(shí)代下基于SSM框架的高校畢業(yè)生檔案管理系統(tǒng)的研發(fā)設(shè)計(jì)[J]. 軟件, 2018, 39(11): 159-166.
[6] 謝孝淼. 基于JAVA技術(shù)的B2C電子商城網(wǎng)站系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J]. 信息通信, 2016(2).
[7] 戈家龍, 吳紅亞, 楊保華. 基于SSM的前后端分離電商網(wǎng)站的設(shè)計(jì)與實(shí)踐[J]. 電腦知識(shí)與技術(shù), 2018, 14(13): 282-283.
[8] 王寬, 李紅信. 基于SSM的同城電商平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)[J]. 電腦知識(shí)與技術(shù), 2018, 14(17) : 301-302.
[9] 文靜, 杜柯柯, 達(dá)文姣. 基于SSM的網(wǎng)上商城的開發(fā)與設(shè)計(jì)[J]. 電腦知識(shí)與技術(shù): 學(xué)術(shù)交流, 2018, 14(3): 86-87.
[10] 江志剛. 基于SSM框架的網(wǎng)上題目錄入答題系統(tǒng)設(shè)計(jì)[J]. 無(wú)線互聯(lián)科技, 2017(20): 62-63.
[11] 龍文佳, 肖敏, 劉義. 基于分布式集群架構(gòu)下的SSM電商購(gòu)物平臺(tái)設(shè)計(jì)[J]. 電腦編程技巧與維護(hù), 2019, 403(01): 45-47.