沈進(jìn)波
摘要:面對(duì)傳統(tǒng)商業(yè)行業(yè)信息系統(tǒng)建設(shè)中出現(xiàn)的信息孤島問(wèn)題,本文采用SOA技術(shù)架構(gòu),利用對(duì)應(yīng)用層的二次分層架構(gòu)設(shè)計(jì),將復(fù)雜的中間應(yīng)用組件進(jìn)行松耦合處理,同時(shí)對(duì)不同分層的關(guān)鍵技術(shù)加以研究,有效實(shí)現(xiàn)信息系統(tǒng)的快速迭代和敏捷開(kāi)發(fā),解決多異構(gòu)系統(tǒng)的業(yè)務(wù)一體化整合中的關(guān)鍵問(wèn)題。
[關(guān)鍵詞]商業(yè)信息系統(tǒng)分層架構(gòu)異構(gòu)系統(tǒng)融合負(fù)載均衡SOA
1背景
商業(yè)零售業(yè)信息管理管理系統(tǒng)應(yīng)用超過(guò)20年,隨著各種零售業(yè)務(wù)的不斷出現(xiàn),信息系統(tǒng)也從單一的商品進(jìn)銷(xiāo)存管理系統(tǒng),逐步擴(kuò)展為功能細(xì)分的ERP進(jìn)銷(xiāo)存、CRM會(huì)員、SCM供應(yīng)鏈、WMS倉(cāng)儲(chǔ)、TMS物流配送等等幾十種獨(dú)立系統(tǒng)。近些年,隨著線上線下一體化業(yè)務(wù)的興起,又衍生出更多的線上運(yùn)維管理業(yè)務(wù)系統(tǒng)。這些異構(gòu)系統(tǒng)在提供各類(lèi)專(zhuān)業(yè)業(yè)務(wù)的同時(shí),也在企業(yè)內(nèi)形成了一個(gè)個(gè)系統(tǒng)孤島。
以滿足消費(fèi)者多種多樣的需求為目標(biāo),現(xiàn)在商業(yè)業(yè)務(wù)變得日趨復(fù)雜多變,亟需打通各個(gè)異構(gòu)系統(tǒng)之間的壁壘,使得各個(gè)系統(tǒng)可以靈活地按業(yè)務(wù)功能要求交互運(yùn)轉(zhuǎn)。技術(shù)的發(fā)展提供了可能,SOA技術(shù)架構(gòu)應(yīng)運(yùn)而生。為了適應(yīng)零售業(yè)業(yè)務(wù)的快速多變的需求,可以在復(fù)雜的系統(tǒng)之上,采用基于SOA技術(shù)架構(gòu)的中臺(tái)設(shè)計(jì),實(shí)現(xiàn)在各個(gè)系統(tǒng)間的破壁運(yùn)行,快速完成軟件開(kāi)發(fā)的落地工作,讓信息系統(tǒng)變得更好用。
2SOA技術(shù)架構(gòu)優(yōu)勢(shì)分析
2.1SOA技術(shù)架構(gòu)
SOA(service-orientedarchitecture),面向服務(wù)的體系結(jié)構(gòu),通過(guò)在中間層建立一系列的模塊化組件,可以把中間應(yīng)用程序的各種功能單元,按更細(xì)的維度進(jìn)行劃分,在接口中以契約的方式進(jìn)行聯(lián)系。利用這些標(biāo)準(zhǔn)接口的協(xié)議,構(gòu)建系統(tǒng)的各個(gè)服務(wù)之間,都使用統(tǒng)一的方式來(lái)聯(lián)系。SOA技術(shù)架構(gòu)自身具有多種新的特性,如架構(gòu)的松耦合、模塊的可復(fù)用、標(biāo)準(zhǔn)接口模式、外部訪問(wèn)支持、標(biāo)準(zhǔn)消息模式等。
2.2SOA技術(shù)架構(gòu)優(yōu)勢(shì)
SOA技術(shù)架構(gòu)利用新的業(yè)務(wù)和管理能力,實(shí)時(shí)集成。對(duì)數(shù)據(jù)和應(yīng)用采用集中式系統(tǒng),易于部署和管理,也易于技術(shù)功能調(diào)整,可以提高業(yè)務(wù)響應(yīng)速度,并保持系統(tǒng)的穩(wěn)定性。通過(guò)選用成熟的中間件,實(shí)現(xiàn)一個(gè)架構(gòu)支持多種應(yīng)用,降低成本(架構(gòu)和人員)。在與第三方的系統(tǒng)對(duì)接開(kāi)發(fā)上,API接口利用微服務(wù)平臺(tái)提供標(biāo)準(zhǔn)服務(wù),在與第三方對(duì)接的過(guò)程中再無(wú)后顧之憂。
SOA技術(shù)在多系統(tǒng)應(yīng)用中起到核心作用。技術(shù)架構(gòu)上,在傳統(tǒng)B/S的三層架構(gòu)內(nèi),增加一級(jí)基礎(chǔ)服務(wù)平臺(tái)層,將中間應(yīng)用層拆分成上下層架構(gòu),對(duì)原中間層的服務(wù)功能再次分層,拆分出更小的數(shù)據(jù)服務(wù)模塊。這些小模塊為新的中間層提供與數(shù)據(jù)庫(kù)層的業(yè)務(wù)交換訪問(wèn),而應(yīng)用層的開(kāi)發(fā)者就不需要再面對(duì)底層數(shù)據(jù)庫(kù)的約束,把全部設(shè)計(jì)意圖實(shí)現(xiàn)到業(yè)務(wù)功能上。在基礎(chǔ)服務(wù)平臺(tái)層上,比如出現(xiàn)增加數(shù)據(jù)庫(kù)類(lèi)型時(shí),可以通過(guò)快速上線一個(gè)新數(shù)據(jù)庫(kù)訪問(wèn)連接字的適配小模塊,即解決所有應(yīng)用層對(duì)新數(shù)據(jù)庫(kù)類(lèi)型的數(shù)據(jù)訪問(wèn)功能,這將極大提高中間服務(wù)層的開(kāi)發(fā)效率,業(yè)務(wù)功能調(diào)試也變得更簡(jiǎn)單。SOA技術(shù)四層架構(gòu)示意圖如圖1所示。
2.3技術(shù)架構(gòu)的擴(kuò)展性
如表1所示。
3業(yè)務(wù)架構(gòu)設(shè)計(jì)
3.1業(yè)務(wù)分割架構(gòu)
分割架構(gòu)主要是指業(yè)務(wù)拆分。根據(jù)具體的業(yè)務(wù)內(nèi)容和高內(nèi)聚、低耦合的原則,將復(fù)雜的業(yè)務(wù)進(jìn)行模塊化的劃分,單獨(dú)部署,接口化操作數(shù)據(jù),實(shí)現(xiàn)業(yè)務(wù)的橫向分割。細(xì)粒度分割復(fù)雜的業(yè)務(wù)系統(tǒng),可以降低業(yè)務(wù)系統(tǒng)的復(fù)雜度,按照模塊進(jìn)行開(kāi)發(fā)和維護(hù),降低整體系統(tǒng)的宕機(jī)時(shí)間。
一般來(lái)說(shuō),分割架構(gòu)需要開(kāi)發(fā)、業(yè)務(wù)為主,運(yùn)維、測(cè)試為輔,架構(gòu)師統(tǒng)一主導(dǎo)進(jìn)行,共同進(jìn)行系統(tǒng)劃分工作。
業(yè)務(wù)劃分因公司的業(yè)務(wù)不同而異,支持服務(wù)化的開(kāi)源技術(shù)框架也很多,常見(jiàn)的有Dubbo、Dubbox以及比較新的SpringBoot、SpringCloud等。
首先是不可避免。一般系統(tǒng)初期,公司為了業(yè)務(wù)盡快上線,大多將業(yè)務(wù)功能堆加在一起。隨著公司業(yè)務(wù)發(fā)展,系統(tǒng)拆分、系統(tǒng)重構(gòu)不可避免。
做好計(jì)劃,持久作戰(zhàn)。系統(tǒng)拆分、系統(tǒng)重構(gòu)時(shí)間相對(duì)較長(zhǎng),一定要提前做好計(jì)劃,避免出現(xiàn)項(xiàng)目持續(xù)時(shí)間久,項(xiàng)目疲憊的情況。
業(yè)務(wù)拆分要科學(xué)。業(yè)務(wù)的拆分一定要經(jīng)過(guò)架構(gòu)、開(kāi)發(fā)、業(yè)務(wù)、DBA等部門(mén)共同討論,共同制定出既適合當(dāng)下,又能夠適合未來(lái)一段時(shí)間內(nèi)(2~3年)的業(yè)務(wù)發(fā)展。
業(yè)務(wù)拆分要徹底。業(yè)務(wù)拆分不應(yīng)該只是系統(tǒng)或是程序工程的拆分,還應(yīng)該包括數(shù)據(jù)庫(kù)的拆分。我們之前就是拆分了程序,未徹底拆分?jǐn)?shù)據(jù)庫(kù),導(dǎo)致程序?qū)崿F(xiàn)服務(wù)化后,后端數(shù)據(jù)庫(kù)的壓力不斷增大。采用數(shù)據(jù)庫(kù)中間件實(shí)現(xiàn)后端數(shù)據(jù)庫(kù)的分庫(kù),但因?yàn)橹虚g件的一些限制,開(kāi)發(fā)又不得不修改一些跨庫(kù)查詢(xún)和跨庫(kù)事務(wù)的情況。所以業(yè)務(wù)拆分一定要徹底,不管是項(xiàng)目工程,還是數(shù)據(jù)庫(kù)。如圖2所示。
3.2 OAuth2.0開(kāi)放性授權(quán)
OAuth(開(kāi)放授權(quán))是一個(gè)開(kāi)放的標(biāo)準(zhǔn)。允許用戶提供一個(gè)令牌,而不是用戶名和密碼來(lái)訪問(wèn)他們存放在特定服務(wù)提供者的數(shù)據(jù)。每一個(gè)令牌授權(quán)一個(gè)特定的網(wǎng)站,在特定的時(shí)段內(nèi)訪問(wèn)特定的資源。這樣,OAuth允許用戶授權(quán)第三方網(wǎng)站訪問(wèn)他們存儲(chǔ)在另外的服務(wù)提供者上的信息,而不需要分享他們的訪問(wèn)許可或他們數(shù)據(jù)的所有內(nèi)容。
3.3異步事務(wù)訪問(wèn)
使用異步事務(wù)替代同步事務(wù)。在業(yè)務(wù)處理過(guò)程中,將大的同步事務(wù),根據(jù)業(yè)務(wù)特征拆分成多個(gè)異步執(zhí)行的事務(wù),分布式處理提高處理業(yè)務(wù)的效能。如圖3所示。
4分層架構(gòu)設(shè)計(jì)
系統(tǒng)在做分層架構(gòu)后,一般情況下要主要包括前端接入層、中間應(yīng)用層、公共服務(wù)層、數(shù)據(jù)存儲(chǔ)層四個(gè)層次,其中接入層包括CDN、DNS轉(zhuǎn)發(fā)、負(fù)載均衡、靜態(tài)資源層等。信用負(fù)載均衡的系統(tǒng)分層架構(gòu)圖如圖4所示。
4.1業(yè)務(wù)應(yīng)用層設(shè)計(jì)
業(yè)務(wù)應(yīng)用層比較大的一塊是做服務(wù)化,這會(huì)在下面的分割架構(gòu)進(jìn)行詳細(xì)說(shuō)明。這里主要說(shuō)明簡(jiǎn)單的業(yè)務(wù)拆分和應(yīng)用集群的部署方式。
高內(nèi)聚、低耦合是業(yè)務(wù)應(yīng)用層實(shí)現(xiàn)目標(biāo),業(yè)務(wù)拆分是解耦的重要利器之一。一般根據(jù)公司業(yè)務(wù)系統(tǒng)的特點(diǎn)和關(guān)聯(lián)進(jìn)行拆分,對(duì)公共業(yè)務(wù)系統(tǒng)進(jìn)行抽取形成公共業(yè)務(wù)應(yīng)用,對(duì)所有業(yè)務(wù)系統(tǒng)進(jìn)行接口化服務(wù)。各個(gè)業(yè)務(wù)系統(tǒng)之間獨(dú)立部署,降低耦合度,減少了業(yè)務(wù)系統(tǒng)之間的依賴(lài)和影響,提高整個(gè)系統(tǒng)的利用率。
因?yàn)橛星懊娴呢?fù)載均衡和反向代理層,所有后端的應(yīng)用服務(wù)器可以橫向部署多臺(tái),實(shí)現(xiàn)高可用也起到用戶訪問(wèn)分流,增加吞吐、提高并發(fā)量。實(shí)際應(yīng)用部署中主要以Java應(yīng)用居多,且多部署在Tomcat中,以此為例,在應(yīng)用服務(wù)器部署時(shí),主要考慮以下幾個(gè)問(wèn)題或是建議:
統(tǒng)一JDK和Tomcat版本。主要是為了方便管理,另外也方便做自動(dòng)化運(yùn)維部署。其中統(tǒng)一部署中的操作系統(tǒng)優(yōu)化、安全加固,Tomcat優(yōu)化。我們?cè)谧鯰omcat自動(dòng)部署的時(shí)候,采用的是根據(jù)系統(tǒng)配置自動(dòng)優(yōu)化的方式和安全加固策略進(jìn)行。另外就是自動(dòng)備份和日志的自動(dòng)切割,都在統(tǒng)一部署腳本中體現(xiàn)。這樣所有部署下來(lái),安裝位置、部署方式等都是一一致的,方便統(tǒng)一管理,統(tǒng)一備份和升級(jí)。
動(dòng)態(tài)頁(yè)面靜態(tài)化。這個(gè)根據(jù)訪問(wèn)量選擇系統(tǒng)進(jìn)行,提高頁(yè)面的訪問(wèn)速度。
4.2公共服務(wù)層設(shè)計(jì)
公共服務(wù)層將上層業(yè)務(wù)層公共用到的一些緩存、消息隊(duì)列、session、文件圖片、統(tǒng)一調(diào)度、定時(shí)任務(wù)等抽取出來(lái),作為單獨(dú)的服務(wù)進(jìn)行部署,為業(yè)務(wù)層提供緩存、消息隊(duì)列以及圖片等服務(wù)。
緩存主要是指的緩存數(shù)據(jù)。應(yīng)用服務(wù)器通過(guò)緩存服務(wù)器查詢(xún)常用數(shù)據(jù),提高系統(tǒng)的查詢(xún)速度。消息隊(duì)列主要針對(duì)高并發(fā)的寫(xiě),采用異步調(diào)用消息隊(duì)列,進(jìn)行數(shù)據(jù)的臨時(shí)存儲(chǔ),提高系統(tǒng)的并發(fā)量和系統(tǒng)效率。
數(shù)據(jù)緩存以及session存儲(chǔ)主要是Redis。Redis的集群部署方式在數(shù)據(jù)存儲(chǔ)層會(huì)詳細(xì)說(shuō)明。
消息隊(duì)列的主要中間件有ActiveMQ和RabbitMQ等,二者都提供master-slave或是集群的部署方式。Kafka主要在搭建日志分析平臺(tái)時(shí)用到過(guò)。對(duì)于ActiveMQ和RabbitMQ,二者并沒(méi)有太大的區(qū)別,都在生產(chǎn)用過(guò),也沒(méi)遇到太大問(wèn)題。在技術(shù)選擇中,還是選擇開(kāi)發(fā)和運(yùn)維最熟悉的為好,再具體點(diǎn),建議以開(kāi)發(fā)最熟悉的為標(biāo)準(zhǔn)。
文件圖片服務(wù)器,如果公司的數(shù)據(jù)比較敏感且有較高的保密性,加上核心生產(chǎn)系統(tǒng)只能內(nèi)部使用的話,建議搭建內(nèi)部分布式文件服務(wù)器、圖片服務(wù)器,使用FastDFS進(jìn)行構(gòu)建分布式集群文件服務(wù)器的。如果對(duì)外提供服務(wù),建議采用購(gòu)買(mǎi)云服務(wù),方便運(yùn)維管理,而且云服務(wù)自身的特性,也比較容易增加文件或圖片的加載速度。
公共服務(wù)層的架構(gòu)和部署一般來(lái)說(shuō)都提供了主從和集群兩種高可用方式,并且都實(shí)現(xiàn)分布式部署。由于公共服務(wù)的重要性,所有業(yè)務(wù)都在調(diào)用,所以在實(shí)際生產(chǎn)部署的時(shí)候,一定要采用高可用的方式進(jìn)行部署,并且要有可伸縮性和可擴(kuò)展性。結(jié)合我們公司實(shí)際情況,在進(jìn)行公共服務(wù)部署時(shí),除了采用主從或是Cluster的方式進(jìn)行部署。
為了快速的響應(yīng)即時(shí)擴(kuò)容的需要,還增加了一鍵擴(kuò)展的腳本,實(shí)現(xiàn)對(duì)集群中服務(wù)器的快速擴(kuò)展。分布式擴(kuò)展方式中的常用算法主要是一致性hash的方式。
4.3數(shù)據(jù)存儲(chǔ)層設(shè)計(jì)
數(shù)據(jù)存儲(chǔ)層主要分為關(guān)系型數(shù)據(jù)庫(kù)和NoSQL數(shù)據(jù)庫(kù)。主要從高可用集群包括負(fù)載均衡、讀寫(xiě)分離、分庫(kù)分表等幾個(gè)方面。
NoSQL數(shù)據(jù)庫(kù)主要采用Redis為主。Redis常用的高可用方案有哨兵模式和Cluster。使用Redis除了上面講的做共享session存儲(chǔ)之外,最大的應(yīng)用就是緩存常用數(shù)據(jù)。大應(yīng)用建議生產(chǎn)環(huán)境中分集群部署。
關(guān)于非關(guān)系型數(shù)據(jù)庫(kù),除了高可用、監(jiān)控之外平常工作中還面臨很大的一“個(gè)工作就是分庫(kù)和分片,如何方便快速擴(kuò)展,這很有用。對(duì)于Redis的使用,建議在一開(kāi)始規(guī)劃時(shí)就考慮好擴(kuò)展問(wèn)題避免以后的遷移或是在線擴(kuò)展等。這跟關(guān)系型數(shù)據(jù)庫(kù)的分庫(kù)分表有異曲同工之妙。Redis的分庫(kù)分片和擴(kuò)展對(duì)系統(tǒng)架構(gòu)來(lái)說(shuō)很重要,尤其業(yè)務(wù)的高速發(fā)展期,越來(lái)越多的數(shù)據(jù)緩存在Redis中,如果沒(méi)有做好規(guī)劃,將會(huì)很被動(dòng)。
Redis包含三種集群策略:
主從復(fù)制:在主從復(fù)制模式中,首先會(huì)有主數(shù)據(jù)庫(kù)(master)和從數(shù)據(jù)庫(kù)(slave)的定義。主數(shù)據(jù)庫(kù)是活動(dòng)業(yè)務(wù)應(yīng)用,隨時(shí)進(jìn)行讀寫(xiě),讀寫(xiě)的數(shù)據(jù)會(huì)按時(shí)序的規(guī)則,把變化內(nèi)容同步進(jìn)入從數(shù)據(jù)庫(kù)。一個(gè)master可以擁有多個(gè)slave,但是一個(gè)slave只能對(duì)應(yīng)一個(gè)maste。
哨兵:哨兵的作用是監(jiān)控redis系統(tǒng)的運(yùn)行狀況,他的功能包括:監(jiān)控主從數(shù)據(jù)庫(kù)是否正常運(yùn)行;master出現(xiàn)故障時(shí),自動(dòng)將slave轉(zhuǎn)化為master;多哨兵配置的時(shí)候,哨兵之間也會(huì)自動(dòng)監(jiān)控;多個(gè)哨兵可以監(jiān)控同一個(gè)redis。
集群:使用集群,將采用多主數(shù)據(jù)庫(kù)形式,需要同時(shí)打開(kāi)每個(gè)數(shù)據(jù)庫(kù)的cluster-enable配置。每個(gè)集群組中,如果要保持穩(wěn)定運(yùn)行,應(yīng)不低于三個(gè)以上主數(shù)據(jù)庫(kù)配置。
集群示意圖如圖5所示。
5結(jié)束語(yǔ)
利用SOA架構(gòu)里的公共服務(wù)層設(shè)計(jì),很好地解決中臺(tái)系統(tǒng)的開(kāi)發(fā)復(fù)雜度問(wèn)題,將系統(tǒng)架構(gòu)變得松耦合,有利于信息系統(tǒng)相對(duì)于業(yè)務(wù)發(fā)展的隨需應(yīng)變,使得快速迭代開(kāi)發(fā)模式在多異構(gòu)系統(tǒng)上得以實(shí)現(xiàn)。應(yīng)用企業(yè)還可以在新架構(gòu)基礎(chǔ)之上,逐步對(duì)原有舊系統(tǒng)進(jìn)行抽取式更換,通過(guò)全新定義一套業(yè)務(wù)對(duì)接模型,并開(kāi)始向不同軟件提供商提供服務(wù),使得異構(gòu)系統(tǒng)的信息孤島逐漸消除,為企業(yè)信息化應(yīng)用提供更快捷的服務(wù)。
參考文獻(xiàn)
[1]李永紅.SOA在軟件工程開(kāi)發(fā)中的應(yīng)用[J].電子技術(shù)與軟件工程,2017(07):38-41.
[2]倪楓.SOA敏捷架構(gòu)的TOGAF層次化迭代建模[J]上海理工大學(xué)學(xué)報(bào),2018(15):133-135.
[3]劉家興,計(jì)算機(jī)輔助信息分析的技術(shù)框架及其發(fā)展趨勢(shì)[J].中國(guó)新通信,2018(09):22-25.
[4]張婷,張?chǎng)?,張新剛,基于CPN的OAuth協(xié)議建模與分析[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2018(03):57-60.
[5]馮瑞青,張激,趙俊才.異構(gòu)處理器多操作系統(tǒng)協(xié)同技術(shù)研究[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2018(12):177-180.
[6]叢紅藝.Linux平臺(tái)Tomcat的安全加固[J].網(wǎng)絡(luò)安全和信息化,2017(12):73-75.
[7]丁志均,楊青等.異構(gòu)Redis集群大規(guī)模評(píng)論數(shù)據(jù)存儲(chǔ)負(fù)載均衡設(shè)計(jì)[J].華東師范大學(xué)學(xué)報(bào),2017(08):119-122.
[8]王瑋.Linux服務(wù)器安全防護(hù)部署[J].計(jì)算機(jī)產(chǎn)品與流通,2018(17):25-28.