如今網絡上都在講Spring Cloud
的各個組件,但當咱們本身也把Spring Cloud
引入進來的時候,卻發現第一個要解決的問題是:java
工程的模塊如何劃分
在以前我寫過一篇重構購物車的過程的文章,下面就以這個購物車工程,來講明當時我是如何思考和如何作的。後端
當時的購物車工程是基於Spring Cloud
搭建的,並對外暴露Resful
接口。那麼第一個要思考的問題是,調用方如何使用購物車的微服務接口呢。有一種方式是由服務提供方生成一個SDK
包,調用方引入SDK
直接使用。這種方式目前應該是主流的作法,我我的也比較推崇這種方式。api
所以,在工程裏,咱們應該有個API
工程,這個工程定義了全部的微服務接口,而後可使用一些構建工具,生成一個SDK
包。網絡
shopcart-api
這個API
工程只有兩樣東西,一個是微服務接口,另一個是DTO
對象。能夠用package
來區分。app
shopcart-api api //包名 dto //包名
API
包裏能夠用interface
定義出全部的微服務接口。dom
public interface ShopCartApi { @RequestMapping(value = "/addToCart", method = RequestMethod.POST) ResponseDTO addToCart(@RequestBody(required = false) AddToCartDTO request) throws Exception; //其餘接口 }
至於DTO
,是用於網絡傳輸的對象。當咱們想提供微服務接口的時候,首先要考慮的就是入參和出參。通常來講能夠用DTO
來表示的,全部DTO
對象都必須以DTO
結尾。這些DTO
會以SDK
包的形式,被調用方使用,調用方也必須將本身的業務數據封裝成DTO
入參,而後才能調用後端的微服務接口。ide
後面咱們只須要使用Maven
或者Gradle
,構建一個SDK
包出來便可。若是是使用Maven
,那麼組合使用微服務
mvn clean install mvn clean deploy
就能夠生成SDK包,而且上傳到公司的Maven私服上了。工具
server
工程用於存放controller
的,是實際對外的resful
微服務接口。性能
shopcart-server
server
工程必須依賴api工程,並去實現API
工程定義的微服務接口。
@RestController public class ShopCartController implements ShopCartApi { @Override public ResponseDTO addSkuToShopCart(@RequestBody AddToCartDTO request) throws Exception { return null; } }
這裏的ShopCartApi
就是以前在API
工程裏面定義的interface
。那麼server
工程裏的微服務接口能夠直接去實現複雜的業務邏輯嗎?仍是說再抽取一個模塊出來,專門用於實現業務邏輯呢?有一些公司,直接就在server
工程裏實現複雜的業務邏輯,而後用一個service
包,將業務邏輯servce
類放入進去。理由是,再抽取一個service
模塊用處不大呀,又無需用它來單獨build
一個包,供外部使用。其實這樣作也沒啥問題,可是一般來講,業務邏輯實現類,最好仍是單獨抽取成一個模塊,除了層次清晰一些以外,業務邏輯實現類還有另一些職責,就是【穩定】【靈活】【通用】【易於測試】,是須要精心設計的,建議別跟controller
混在一個模塊裏。
隨着業務不斷的增多,server
工程裏的controller
接口會不斷的增多和變化,可是通過精心設計的業務邏輯層,卻未必。
shopcart-service
如上所說,建議再創建一個service
工程,將核心的業務邏輯封裝起來。service
層對外暴露的對象是業務對象,統一以BO
結尾。這裏就會有個問題,server
工程調用完service
層的接口,獲取到BO
對象後,須要轉換成DTO
對象。不過如今已經有很是成熟性能又好的映射工具了。orika
就是其中的佼佼者。
server
工程依賴api
工程和service
工程。
我理解的domain
也屬於業務邏輯的一部分,我我的是不太喜歡再搞個domain
模塊的,直接將domain放置在service
模塊裏便可。
在Spring Cloud裏,能夠藉助feign
@FeignClient(value = "xxxxx",path = "/yyyyy") public interface ShopCartClient extends ShopCartApi { }
這裏的ShopCartApi
就是購物車工程中api模塊的接口類。想要調用購物車的接口,直接使用ShopCartClient
類便可。
也有些公司,使用領域驅動設計來劃分模塊,這塊我目前還不太熟悉,不過看起來挺高大上的,也但願網友在文章的評論裏,多多發表意見。