文/段楠
SOA是一種面向服務(wù)的分布式架構(gòu),將每個實(shí)現(xiàn)特定功能的工程拆分為服務(wù)層和表現(xiàn)層。服務(wù)層負(fù)責(zé)處理業(yè)務(wù)邏輯,對外提供服務(wù)接口。表現(xiàn)層負(fù)責(zé)處理與前端的交互,具體業(yè)務(wù)邏輯只需調(diào)用服務(wù)層發(fā)布的接口。
使用SOA架構(gòu)具有很多優(yōu)點(diǎn)??梢詫⑾到y(tǒng)拆分為多個獨(dú)立的模塊,模塊之間通過接口通信,降低了系統(tǒng)各個模塊之間的耦合度,可以通過接口方便地進(jìn)行各個模塊之間功能的調(diào)用。可以很方便地對系統(tǒng)進(jìn)行擴(kuò)展,需要擴(kuò)展系統(tǒng)功能時,只需新增一個子模塊,然后通過接口與原有模塊進(jìn)行交互即可??梢詫⒚總€模塊分配給相應(yīng)的開發(fā)人員進(jìn)行搭建,方便系統(tǒng)開發(fā)任務(wù)的分工。
目前較為流行的SOA架構(gòu)開發(fā)方式是使用Dubbo技術(shù)。在SOA架構(gòu)中,每個功能模塊都會發(fā)布服務(wù)或調(diào)用服務(wù),那么就需要有一個服務(wù)中心對各個服務(wù)進(jìn)行統(tǒng)一的資源調(diào)度與治理。Dubbo就是這個服務(wù)中心的管理工具。Dubbo對Spring有很好的支持,只需在Spring配置文件中進(jìn)行相關(guān)的配置即可使用。
Dubbo中主要有服務(wù)提供者、服務(wù)消費(fèi)者和注冊中心三個角色,還有一個監(jiān)控中心對每次服務(wù)調(diào)用進(jìn)行監(jiān)控與統(tǒng)計(jì)。服務(wù)提供者向注冊中心發(fā)布自己提供的服務(wù),服務(wù)消費(fèi)者向注冊中心訂閱自己所需的服務(wù),服務(wù)中心將服務(wù)提供者提供的服務(wù)及地址列表給服務(wù)消費(fèi)者,即實(shí)現(xiàn)了服務(wù)調(diào)度。
在項(xiàng)目中,服務(wù)層工程作為服務(wù)提供者,需要通過配置向注冊中心暴露服務(wù)的接口。表現(xiàn)層工程作為服務(wù)消費(fèi)者,需要通過配置從注冊中心引用服務(wù)接口。注冊中心推薦使用Zookeeper,負(fù)責(zé)服務(wù)的注冊與查找。
以B2C模式的圖書商城為例,介紹SOA架構(gòu)網(wǎng)站開發(fā)的設(shè)計(jì)思路。圖書商城項(xiàng)目分為后臺系統(tǒng)、前臺系統(tǒng)、搜索系統(tǒng)、登錄系統(tǒng)。每個子系統(tǒng)實(shí)現(xiàn)各自的功能,運(yùn)行在各自的服務(wù)器上,互相之間通過接口進(jìn)行功能調(diào)用,來實(shí)現(xiàn)整個網(wǎng)站的功能。
后臺系統(tǒng)提供給商家使用,具有圖書分類管理、圖書管理、訂單管理、投訴管理等功能。
圖書商城將不同類目的圖書進(jìn)行分類,使得用戶可以根據(jù)圖書分類進(jìn)行圖書的查找,管理員需要對圖書的分類進(jìn)行管理。后臺系統(tǒng)提供圖書分類的查詢、添加、修改、刪除功能,分類名稱不可重復(fù)。分類與圖書是一對多的關(guān)系,每個分類下具有多個圖書,每個圖書對應(yīng)一個分類。在添加圖書時需要對所屬分類進(jìn)行指定。
后臺系統(tǒng)提供圖書的查詢、添加、修改、刪除功能,每個圖書具有圖書名稱、作者、價格、圖書圖片、分類、詳細(xì)介紹的信息。使用FastDFS作為圖片服務(wù)器供圖書圖片的上傳下載。
訂單管理功能可對所有用戶的訂單進(jìn)行查詢,以及對訂單狀態(tài)的管理。
投訴管理功能可對用戶的投訴進(jìn)行查看及處理。
前臺系統(tǒng)提供給普通用戶使用,用戶可在前臺系統(tǒng)中進(jìn)行注冊、瀏覽圖書商品、查看購物車、查看訂單、投訴等操作。
用戶在未登錄時可以注冊、瀏覽圖書商品,在登錄之后才可以進(jìn)行更多的操作。
用戶可以查詢所有圖書或者按分類查詢圖書,在登陸之后,可以將圖書添加進(jìn)購物車或者直接下訂單購買。
用戶可以對購物車進(jìn)行查看,并可將購物車中的圖書進(jìn)行批量地購買或者刪除。
在用戶對圖書進(jìn)行購買操作之后,會生成相應(yīng)的訂單,訂單包含圖書的基本信息、購買數(shù)量、支付金額、訂單狀態(tài)。用戶可以支付訂單、退款、確認(rèn)收貨或者刪除訂單,對訂單進(jìn)行操作之后,訂單的狀態(tài)也會發(fā)生相應(yīng)的變化。
用戶對圖書或者服務(wù)不滿意可以使用投訴功能進(jìn)行相應(yīng)的反饋。
前臺系統(tǒng)相較于后臺系統(tǒng)會有更高的訪問量與并發(fā)量,涉及大量數(shù)據(jù)庫操作時會很耗費(fèi)時間。因此可以使用非關(guān)系型數(shù)據(jù)庫Redis作為業(yè)務(wù)層與數(shù)據(jù)層之間的緩存。Redis作為非關(guān)系型數(shù)據(jù)庫,比傳統(tǒng)的關(guān)系型數(shù)據(jù)庫效率要高出很多,處理大量數(shù)據(jù)時性能有明顯優(yōu)勢。業(yè)務(wù)層需要數(shù)據(jù)時首先訪問Redis,如果有數(shù)據(jù)就直接返回,如果沒有再向關(guān)系型數(shù)據(jù)庫中查找數(shù)據(jù),然后返回給業(yè)務(wù)層并向Redis中添加數(shù)據(jù)緩存。
搜索系統(tǒng)提供接口給前臺系統(tǒng),為用戶提供圖書查找的服務(wù)。搜索功能需要對用戶輸入的關(guān)鍵詞進(jìn)行復(fù)雜的查詢,使用傳統(tǒng)的關(guān)系型數(shù)據(jù)庫查詢方式效率極為低下,因此需要Solr技術(shù)對數(shù)據(jù)進(jìn)行快速索引。
Solr是一款實(shí)現(xiàn)快速搜索的搜索引擎系統(tǒng)。使用Solr可以高效地對全站的圖書信息通過關(guān)鍵詞進(jìn)行查找。在使用前需要為Solr配置中文解析器,并設(shè)置分詞方法與圖書信息的搜索域。然后將圖書信息導(dǎo)入到Solr索引庫中,就可以進(jìn)行快速搜索。
用戶在搜索框中輸入關(guān)鍵詞開始搜索,服務(wù)端在Solr索引庫中根據(jù)事先設(shè)置的分詞以及搜索域進(jìn)行查找,有圖書信息與之匹配將返回給瀏覽器顯示。
將登陸系統(tǒng)獨(dú)立出來可以為管理員和用戶提供一個統(tǒng)一的接口。用戶信息在數(shù)據(jù)庫中有一個字段來標(biāo)識用戶身份。輸入用戶名密碼之后,服務(wù)端會到數(shù)據(jù)庫中進(jìn)行比對,如果輸入錯誤,返回錯誤信息。如果輸入正確,從數(shù)據(jù)庫中得到用戶信息后,查看用戶身份字段的值,如果是普通用戶,跳轉(zhuǎn)到前臺網(wǎng)頁并向該服務(wù)器傳輸用戶信息保存到Session。如果是管理員用戶,跳轉(zhuǎn)到后臺網(wǎng)頁并向該服務(wù)器傳輸用戶信息保存到Session。
本文介紹了在Java平臺下進(jìn)行SOA架構(gòu)電商網(wǎng)站的開發(fā)的基本設(shè)計(jì)與思路,從基本原理到實(shí)現(xiàn)技術(shù)作了具體的闡述。以圖書商城為例給出了網(wǎng)站設(shè)計(jì)的大體方法,在SOA架構(gòu)下將系統(tǒng)劃分為多個子系統(tǒng),每個子系統(tǒng)實(shí)現(xiàn)自己的相應(yīng)功能,并且服務(wù)層與表現(xiàn)層分離實(shí)現(xiàn)松散的耦合,并對每個子系統(tǒng)的功能設(shè)計(jì)作了具體闡述。