隨著快的業(yè)務(wù)的快速發(fā)展,我們逐步按照業(yè)務(wù)垂直劃分,抽象出基礎(chǔ)服務(wù)層。 一 服務(wù)化目標(biāo)
二 dubbo架構(gòu)dubbo來作為服務(wù)化中間件,dubbo作為一個RPC框架,大致的原理如下圖
三 工程分類總體來說,服務(wù)化工程類型分為兩種 standalong工程 以獨(dú)立的應(yīng)用形式提供遠(yuǎn)程服務(wù),不依賴web容器,這是比較標(biāo)準(zhǔn)的服務(wù)提供形式,有3個子工程: api
core
impl
web工程 已有的web應(yīng)用暴露服務(wù),最好對原有的工程結(jié)構(gòu)無侵入,只是再增加2個子工程: api
impl 描述:業(yè)務(wù)域的遠(yuǎn)程服務(wù)實(shí)現(xiàn),負(fù)責(zé)服務(wù)啟動停止,內(nèi)部業(yè)務(wù)組裝,參數(shù)轉(zhuǎn)換 無論是否服務(wù)化,某個業(yè)務(wù)域內(nèi)部的數(shù)據(jù)和行為是不變的,服務(wù)化只是將業(yè)務(wù)域內(nèi)的邏輯做一些裁剪或聚合,然后供外部調(diào)用。業(yè)務(wù)域的內(nèi)部模型和提供的外部服務(wù)要劃分一個邊界,各自專注于自己的職責(zé)。以下是服務(wù)角色和子工程的對應(yīng)關(guān)系:
四 standalong工程依賴關(guān)系 服務(wù)內(nèi)部工程間的依賴都通過本地jar依賴,impl依賴api和core,沒有其他依賴關(guān)系,嚴(yán)禁core依賴api。關(guān)系如下:
工程結(jié)構(gòu) 淺藍(lán)色是目錄,淺綠色是文件。assembly.xml不能修改,dubbo.properties和dubbo-provider.xml都可以修改,dubbo.properties描述服務(wù)公共配置,如注冊中心,超時等;dubbo-provider.xml通過spring描述具體服務(wù)信息
部署結(jié)構(gòu) standalong型的應(yīng)用啟動停止都必須有對應(yīng)的腳本,這些腳本文件不需要每個standalong型應(yīng)用自己寫,只需要工程結(jié)構(gòu)遵循規(guī)范,執(zhí)行mvn package/install后,會在target自動輸出最后的部署包,部署包結(jié)構(gòu)如下圖: 淺藍(lán)色是目錄,淺綠色是文件。 lib目錄:存放依賴的jar包,工程里java代碼都會輸出為jar包到lib里 start.sh:啟動服務(wù) restart.sh:重啟服務(wù) stop.sh:停止服務(wù) server.sh:命令入口,如server.sh start dump.sh:dump應(yīng)用的線程棧,內(nèi)存,GC;供排查問題用
五 web工程依賴關(guān)系 web應(yīng)用大致分為兩層:biz和web,實(shí)際上biz可能由內(nèi)部多個工程組成,這里biz只是一個抽象概念。impl依賴api和biz,web依賴impl和biz,沒有其他依賴關(guān)系,嚴(yán)禁biz依賴api。關(guān)系如下:
工程結(jié)構(gòu)和部署結(jié)構(gòu) web應(yīng)用的服務(wù)只需要配置在spring配置文件里,服務(wù)的啟動停止依賴web容器的啟動停止。所以web工程的服務(wù)化不需要調(diào)整原有工程結(jié)構(gòu),只是要增加兩個子工程:api和impl。 這樣做是希望某個已存在的web應(yīng)用要做服務(wù)化,不會對原有工程發(fā)生改動。 六 svn目錄結(jié)構(gòu)對應(yīng)工程結(jié)構(gòu),svn目錄也做相應(yīng)的劃分,每個業(yè)務(wù)域是個大目錄,然后該目錄內(nèi)部又分為3個目錄:api,core,impl。以會員為例,svn目錄結(jié)構(gòu)為,以會員為例: user trunk api core impl branch
七 一些注意事項(xiàng)
以會員為例,假設(shè)core里存在UserService;有方法addUser(UserDO user);現(xiàn)在要將addUser(UserDO user)作為服務(wù)開放出去,則在api里加入UserRemoteService,UserRemoteService有對應(yīng)的方法: addUser(UserDTO user),該方法內(nèi)部操作數(shù)據(jù)通過UserService.addUser實(shí)現(xiàn)。大概代碼如下: UserRemoteService{ private UserService userService; public void addUser(UserDTO userDTO){ UserDO userDO=***Converter.convert(userDTO); userService.addUser(userDO); } } |
|