Spring Cloud工程模塊劃分

Spring Cloud工程模塊劃分


如今網絡上都在講Spring Cloud的各個組件,但當咱們本身也把Spring Cloud引入進來的時候,卻發現第一個要解決的問題是:java

工程的模塊如何劃分

在以前我寫過一篇重構購物車的過程的文章,下面就以這個購物車工程,來講明當時我是如何思考和如何作的。後端


工程要分幾個模塊


API模塊


當時的購物車工程是基於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工程


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接口會不斷的增多和變化,可是通過精心設計的業務邏輯層,卻未必。


service工程


shopcart-service

如上所說,建議再創建一個service工程,將核心的業務邏輯封裝起來。service層對外暴露的對象是業務對象,統一以BO結尾。這裏就會有個問題,server工程調用完service層的接口,獲取到BO對象後,須要轉換成DTO對象。不過如今已經有很是成熟性能又好的映射工具了。orika就是其中的佼佼者。


模塊之間的依賴


server工程依賴api工程和service工程。


須要再搞個domain模塊嗎


我理解的domain也屬於業務邏輯的一部分,我我的是不太喜歡再搞個domain模塊的,直接將domain放置在service模塊裏便可。


客戶端如何調用服務端


在Spring Cloud裏,能夠藉助feign

@FeignClient(value = "xxxxx",path = "/yyyyy")
public interface ShopCartClient extends ShopCartApi {
    
}

這裏的ShopCartApi就是購物車工程中api模塊的接口類。想要調用購物車的接口,直接使用ShopCartClient類便可。


使用領域驅動設計來劃分模塊


也有些公司,使用領域驅動設計來劃分模塊,這塊我目前還不太熟悉,不過看起來挺高大上的,也但願網友在文章的評論裏,多多發表意見。


原文連接


Spring Cloud工程模塊劃分

相關文章
相關標籤/搜索