周宇航 邱雷 謝凡殊
摘要:隨著數(shù)據(jù)規(guī)模的越來越大,傳統(tǒng)的集中式系統(tǒng)越來越難以滿足需求,與此同時,分布式管理系統(tǒng)得到了廣泛的應(yīng)用。分布式系統(tǒng)相對單體應(yīng)用而言,可以支持更高的并發(fā)訪問量,并且可以根據(jù)業(yè)務(wù)極其靈活地調(diào)整節(jié)點數(shù)量,一個節(jié)點出現(xiàn)故障時也不會影響整個系統(tǒng)的運行。與集中式系統(tǒng)相比,分布式系統(tǒng)的性價比更高、處理能力更強、擴展性也更好。
關(guān)鍵詞:互動平臺;分布式服務(wù)器;MySQL;Spring;Android
中圖分類號:TP311.5? ? ? ? ?文獻(xiàn)標(biāo)識碼:A? ? ? ?文章編號:1009-3044(2018)35-0059-02
1 背景
目前,市場上各種應(yīng)用的互動平臺很多,但并沒有專門針對用戶個性化創(chuàng)作的互動交易平臺。該課題組設(shè)計實現(xiàn)了一個基于Android的創(chuàng)意者互動平臺,主要是為用戶和商戶搭建一個互動交易App環(huán)境。在互動平臺上,幫助用戶把自己的創(chuàng)意、設(shè)計提供給商戶;幫助商戶把創(chuàng)意融入DIY制作中,實體化用戶的創(chuàng)意。
1.1 創(chuàng)意互動平臺設(shè)計方案
創(chuàng)意互動平臺主要面向用戶為設(shè)計師、個體商家以及追求定制個性化商品的消費者。設(shè)計師可以在平臺里售賣自己的設(shè)計稿;而個體商家可以買下這些設(shè)計稿后,做定制或是批量定制生產(chǎn),將實體商品上架后供廣大消費者選購。
平臺實現(xiàn)的主要功能如下:1)用戶的登錄與注冊;2)設(shè)計師發(fā)布自己的設(shè)計稿并定價;3)商家購買已上架且未被選購的設(shè)計稿;4)商家將設(shè)計稿批量生產(chǎn)為實體商品并定價上架;5)用戶選購實體商品;6)用戶之間通過私信進(jìn)行聯(lián)系;7)平臺方舉辦活動或比賽,號召用戶參與,加強平臺與用戶之間的黏性;8)用戶之間互相關(guān)注;9)用戶在個人界面中修改自己的昵稱及個性簽名;10)用戶為自己喜歡的設(shè)計稿、實體商品點贊;11)用戶收藏自己喜歡的商家。
1.2 創(chuàng)意者互動平臺的優(yōu)點
該平臺給予了設(shè)計師和商家一個方便的聯(lián)系渠道,讓設(shè)計師能夠?qū)⒆约合胍纳唐纷鳛樵O(shè)計稿進(jìn)行售賣,并且讓商家可以通過用戶的點贊來選購更具人氣的設(shè)計稿進(jìn)行批量或是定制生產(chǎn)。平臺不但可以提高設(shè)計師設(shè)計稿的曝光率,也能讓商家更清楚地明白怎樣的設(shè)計稿是更具有市場的。這樣的交易平臺打破了以往商家供貨——消費者選購的單一模式,而是變成了消費者選擇自己心儀的設(shè)計稿——商家購買設(shè)計稿并做出實體商品供貨——消費者進(jìn)行選購的模式。
1.3 服務(wù)器需求
對于創(chuàng)意互動平臺來說,網(wǎng)絡(luò)服務(wù)是很重要的一環(huán),而網(wǎng)絡(luò)服務(wù)就離不開服務(wù)器的支持。服務(wù)器響應(yīng)速度不夠,網(wǎng)絡(luò)服務(wù)就慢。服務(wù)器的響應(yīng)速度可以通過提高單個服務(wù)器性能或者增加服務(wù)器數(shù)量實現(xiàn),當(dāng)然,更主要是從軟件層面優(yōu)化服務(wù)器端軟件結(jié)構(gòu)達(dá)到提高響應(yīng)速度的目的。
同時,在對服務(wù)器端做性能優(yōu)化的時候,還要考慮到服務(wù)器端程序的易維護性和可擴展性,編寫出健壯穩(wěn)定的服務(wù)器端代碼。
2 平臺基礎(chǔ)結(jié)構(gòu)設(shè)計
分布式資源共享服務(wù)器與傳統(tǒng)集中式系統(tǒng)的區(qū)別在于:資源和程序可以不位于一個服務(wù)器上,而是分散到多個服務(wù)器。分布式服務(wù)克服了傳統(tǒng)集中式系統(tǒng)會導(dǎo)致中心主機資源緊張與響應(yīng)瓶頸的缺陷,可以方便應(yīng)對突發(fā)流量高峰。
在高并發(fā)時,有很多的請求同時發(fā)送到服務(wù)器等待處理,會導(dǎo)致用戶長時間得不到響應(yīng),尤其在用戶請求的資源有數(shù)量限制時,用戶不能知道請求是否成功,甚至用戶請求到的資源數(shù)量超出實際數(shù)量,導(dǎo)致數(shù)據(jù)的一致性出錯。這時候就需要有一個消息隊列,有序的處理用戶的請求,并且在流量高峰時堆積用戶請求,防止業(yè)務(wù)服務(wù)器負(fù)載過高不能響應(yīng)。
服務(wù)器端和客戶端的交互采用了語言無關(guān)的Http協(xié)議和JSON數(shù)據(jù)格式,服務(wù)器端為客戶端提供RestAPI用于請求數(shù)據(jù),同時使用消息隊列和分布式服務(wù)解決高并發(fā)問題。通過這些定義良好的接口和中間件, 服務(wù)器可以方便地實現(xiàn)擴容和替換組件實現(xiàn)。
2.1 Rest API
項目采用C/S結(jié)構(gòu),Android客戶端通過Rest API向服務(wù)器請求數(shù)據(jù)。Rest API為客戶端提供了統(tǒng)一的訪問接口,方便添加其他客戶端或網(wǎng)頁應(yīng)用。
2.2Json數(shù)據(jù)交換格式
JSON(JavaScript Object Notation)是一種輕量級的數(shù)據(jù)交換格式。JSON采用完全獨立于語言的文本格式,這些特性使JSON成為理想的數(shù)據(jù)交換語言,易于閱讀和編寫,同時也易于機器解析和生成。
2.3 數(shù)據(jù)庫選擇和使用
MySQL是一個開源的關(guān)系型數(shù)據(jù)庫,也是最流行的關(guān)系型數(shù)據(jù)庫之一,因其速度、可靠性和適用性而備受關(guān)注。
2.4 消息隊列
消息隊列是一個容納被發(fā)送的等待閱讀的消息的區(qū)域,一旦一個消息被閱讀,這個消息將會被從隊列中移除。在該項目中,消息即客戶端的Http請求。
3 平臺的實現(xiàn)
3.1 服務(wù)器的主體框架實現(xiàn)
服務(wù)器端使用標(biāo)準(zhǔn)MVC設(shè)計模式。Controller層處理客戶端的網(wǎng)絡(luò)請求;Model層執(zhí)行數(shù)據(jù)庫的增刪改查并為Controller層提供接口;View層負(fù)責(zé)將Controller層返回的信息以一定的形式展現(xiàn)。在這個項目中,View層實際上是Android客戶端,Android客戶端解析服務(wù)器返回的JSON字符串并展示相應(yīng)的界面。
服務(wù)器程序的核心是SpringWebMvc框架。通過SpringWebMvc框架可以很簡單地配置handler mapping,然后可以專注于編寫處理網(wǎng)絡(luò)請求的Controller邏輯。同時SpringWebMvc框架將模型和視圖分離開,服務(wù)器端程序和視圖解耦,便于擴展新的客戶端模式。Spring的DI和AOP也極大地簡化了服務(wù)器端程序的開發(fā)過程。
3.2 服務(wù)器和客戶端數(shù)據(jù)交換的實現(xiàn)
在服務(wù)器端配置一個JSON消息轉(zhuǎn)換器, Controller層并不直接返回客戶端需要的數(shù)據(jù)模型, 而是返回一個Java對象,由消息轉(zhuǎn)換器將Java對象轉(zhuǎn)換成客戶端需要的信息格式。比如,客戶端向服務(wù)器請求JSON格式的數(shù)據(jù),服務(wù)器端便使用JSON消息轉(zhuǎn)換器將Java對象轉(zhuǎn)換成JSON字符串返回給客戶端;客戶端需要XML格式的數(shù)據(jù),服務(wù)器端便使用XML消息轉(zhuǎn)換器將Java對象轉(zhuǎn)換成xml返回給客戶端。Controller不必關(guān)心客戶端需要什么類型的數(shù)據(jù),只需要將數(shù)據(jù)以Java對象的形式返回即可,由消息轉(zhuǎn)換器將Java對象轉(zhuǎn)換成客戶端需要的格式。
3.3 服務(wù)器的數(shù)據(jù)庫實現(xiàn)
服務(wù)器使用MySQL數(shù)據(jù)庫,并通過在Spring中集成Hibernate框架訪問數(shù)據(jù)庫。通過操作Java對象實現(xiàn)數(shù)據(jù)庫的增刪改查,幾乎沒有直接編寫SQL語句,減少了數(shù)據(jù)庫訪問的出錯概率。
JDBC數(shù)據(jù)庫連接池使用c3p0,不在每一次訪問數(shù)據(jù)庫時創(chuàng)建新連接,而是通過c3p0連接池重用數(shù)據(jù)庫連接,避免了頻繁的數(shù)據(jù)庫連接初始化和釋放,極大地減少了系統(tǒng)的響應(yīng)時間。并且,根據(jù)預(yù)先的占用超時設(shè)定,可以強制回收被占用連接,避免數(shù)據(jù)庫連接操作中的資源泄露。
3.4 服務(wù)器的業(yè)務(wù)邏輯實現(xiàn)
服務(wù)器收到消息后,由Spring的前端控制器DispatcherServlet將請求轉(zhuǎn)發(fā)給相應(yīng)的Controller,Controller中的方法將業(yè)務(wù)邏輯委托給一個或多個服務(wù)對象進(jìn)行處理,并將處理完的信息,即模型數(shù)據(jù)發(fā)送回DispatcherServlet。
3.5 服務(wù)器的分布式實現(xiàn)
服務(wù)器分為業(yè)務(wù)服務(wù)器、數(shù)據(jù)庫服務(wù)器、Session服務(wù)器和文件服務(wù)器四個部分。業(yè)務(wù)服務(wù)器處理網(wǎng)絡(luò)請求;數(shù)據(jù)庫服務(wù)器存儲各項數(shù)據(jù);Session服務(wù)器存儲用戶會話;文件服務(wù)器使用CDN為用戶提供高速上傳和下載文件服務(wù)。
業(yè)務(wù)服務(wù)器將每個用戶的會話存儲在Session服務(wù)器中(Session服務(wù)器中運行一個Redis數(shù)據(jù)庫用于存儲用戶會話),在用戶的每次網(wǎng)絡(luò)請求中,通過Session服務(wù)器驗證用戶身份和權(quán)限。服務(wù)器Model層對數(shù)據(jù)庫的增刪改查操作則是使用數(shù)據(jù)庫服務(wù)器中運行的MySQL數(shù)據(jù)庫。文件服務(wù)器通過CDN不僅為用戶提供了高速上傳和下載服務(wù),也極大地降低了業(yè)務(wù)服務(wù)器壓力。
4 結(jié)束語
基于該文所配置的分布式服務(wù)器,成功地實現(xiàn)了一個基于Android的創(chuàng)意者互動平臺。該文從創(chuàng)意者互動平臺的需求分析,到服務(wù)器設(shè)計,再到實現(xiàn)做了詳細(xì)的描述,整體完成了平臺的分布式服務(wù)器結(jié)構(gòu)實現(xiàn)。服務(wù)器端嚴(yán)格按照MVC設(shè)計模式,多層次分離,主要功能之間解耦,為更新和擴展提供了良好的代碼基礎(chǔ)。服務(wù)器各個功能以組件的形式設(shè)計,每個組件都可以單獨替換,并且這些設(shè)計對客戶端透明,服務(wù)器端的組件替換和性能優(yōu)化不需要修改客戶端。使用語言無關(guān)的JSON數(shù)據(jù)交換格式,也使客戶端可以有多種不同平臺的實現(xiàn)。
參考文獻(xiàn):
[1] Craig Walls. Spring實戰(zhàn)[M].4版.北京: 人民郵電出版社, 2016.
[2] 李剛. 輕量級JavaEE企業(yè)應(yīng)用實戰(zhàn)[M].4版.北京: 電子工業(yè)出版社, 2014.
[3] Eric Freeman. HeadFirst設(shè)計模式:中文版[M].北京: 中國電力出版社, 2017.
[4] Kirk Knoernschild. Java應(yīng)用架構(gòu)設(shè)計:模塊化模式與OSGI[M].北京:機械工業(yè)出版社, 2016.
[5] Ben Forta. MySQL必知必會[M].北京:人民郵電出版社, 2009.
[通聯(lián)編輯:謝媛媛]