Spring Boot 專案如何按模組進行拆分?

在瞭解SpringBoot專案拆分之前首先我們需要了解微服務架構

什麼是微服務?

單個輕量級服務一般為一個單獨微服務,微服務講究的是 專注某個功能的實現,比如登入系統只專注於使用者登入方面功能的實現,講究的是職責單一,開箱即用,可以獨立執行。微服務架構系統是一個分散式的系統,按照業務進行劃分服務單元模組,解決單個系統的不足,滿足越來越複雜的業務需求。

馬丁福勒(Martin Fowler):就目前而言,對於微服務業界並沒有一個統一的、標準的定義。但通常而言,微服務架構是一種架構模式或者說是架構風格,它提倡將單一應用程式劃分成一組小的服務。每個服務執行在其獨立的自己的程序中服務之間相互配合、相互協調,為使用者提供最終價值。服務之間採用輕量級通訊。每個服務都圍繞具體業務進行構建,並能夠獨立部署到生產環境等。另外應儘量避免統一的、集中的服務管理機制。

通俗的來講:

微服務就是一個獨立的職責單一的服務應用程式。在 intellij idea 工具裡面就是用maven開發的一個個獨立的module,具體就是使用springboot 開發的一個小的模組,處理單一專業的業務邏輯,一個模組只做一個事情。

微服務強調的是服務大小,關注的是某一個點,具體解決某一個問題/落地對應的一個服務應用,可以看做是idea 裡面一個 module。

比如你去醫院:你的牙齒不舒服,那麼你就去牙科。你的頭疼,那麼你就去腦科。一個個的科室,就是一個微服務,一個功能就是一個服務。

微服務的優缺點是什麼?

優點:

松耦合,聚焦單一業務功能,無關開發語言,團隊規模降低。在開發中,不需要了解多有業務,只專注於當前功能,便利集中,功能小而精。微服務一個功能受損,對其他功能影響並不是太大,可以快速定位問題。微服務只專注於當前業務邏輯程式碼,不會和 html、css 或其他介面進行混合。可以靈活搭配技術,獨立性比較舒服。

缺點:

隨著服務數量增加,管理複雜,部署複雜,伺服器需要增多,服務通訊和呼叫壓力增大,運維工程師壓力增大,人力資源增多,系統依賴增強,資料一致性,效能監控

什麼是微服務架構?

微服務架構 就是 對微服務進行管理整合應用的。微服務架構 依賴於 微服務,是在微服務基礎之上的。

例如:上面已經列舉了什麼是微服務。在醫院裡,每一個科室都是一個獨立的微服務,那麼 這個醫院 就是 一個大型的微服務架構,就類似 院長 可以 對下面的 科室進行管理。微服務架構主要就是這種功能。

建立一個父專案

專案依賴咱們可以先不新增,專案建立完之後統一加入就好了

Spring Boot 專案如何按模組進行拆分?

Spring Boot 專案如何按模組進行拆分?

父專案pom檔案

然後我們需要注意的是需要更改父專案的pom檔案

Spring Boot 專案如何按模組進行拆分?

在父級專案中的pom。xml檔案使用的packaging配置一定為pom。父級的pom檔案只作專案的子模組的整合,在

maven install

時不會生成

jar/war

壓縮包。

然後將打包外掛更改為

maven-compiler-plugin

org。apache。maven。plugins maven-compiler-plugin 3。1 ${java。version} ${java。version}

建立子模組

Spring Boot 專案如何按模組進行拆分?

Spring Boot 專案如何按模組進行拆分?

在指定專案路徑的時候需要注意,需要加入到父專案路徑下

因為子專案是需要我們啟動的專案所以我們需要更新子專案pom檔案打包方式為jar

demo-daojardemo-dao0。0。1-SNAPSHOTdao project

由於父專案僅需要對子專案進行管理,所以可以直接刪除掉父專案的src目錄,保留pom檔案即可

隨後我們分別建立 dao、model、service、common、admin 共5個子模組,其中admin模組作為我們的啟動專案,現在我們的目錄結構是這樣的

Spring Boot 專案如何按模組進行拆分?

但現在父專案與子專案並無關係,子專案僅僅是在父專案目錄下而已,我們需要用maven將子專案交給父專案管理

父專案中引入子專案

Spring Boot 專案如何按模組進行拆分?

子專案依賴父專案

Spring Boot 專案如何按模組進行拆分?

在每個子專案都依賴父專案之後我們就可以在pom檔案中檢視到此時的父專案與子專案已經是相互依賴的關係了,如下圖

Spring Boot 專案如何按模組進行拆分?

至此我們就可以新增pom檔案相關的依賴了,多專案拆分的情況下由父專案管理所有子專案的jar包版本,而父專案中引入的依賴子專案中不需要重複引入也可直接使用,所以我們在引入依賴時如果這個jar包在其他專案也需要使用到的話就可以直接寫到父專案的pom檔案中就可以了

以下是父專案的pom檔案

1。8 1。18。20 1。1。18 3。4。1 2。9。2 7。2。2。jre8 org。springframework。boot spring-boot-starter org。springframework。boot spring-boot-starter-test test org。springframework。boot spring-boot-starter-aop org。springframework。boot spring-boot-starter-web org。springframework。session spring-session-data-redis org。projectlombok lombok ${lombok。version} <!—— ali資料來源、mybatis-plus——> com。alibaba druid-spring-boot-starter ${druid。version} com。baomidou mybatis-plus-boot-starter ${mybatis-plus。version} <!—— SQL server 資料庫驅動 ——> com。microsoft。sqlserver mssql-jdbc ${sqlserver。jdbc} runtime <!—— mybatis-plus 程式碼生成器 ——> com。baomidou mybatis-plus-generator ${mybatis-plus。version} com。baomidou mybatis-plus-core ${mybatis-plus。version} org。apache。velocity velocity-engine-core 2。3 <!—— swagger2 ——> io。springfox springfox-swagger2 ${swagger2。version} io。springfox springfox-swagger-ui ${swagger2。version} com。github。xiaoymin swagger-bootstrap-ui 1。9。0

這裡我使用的是SQLSERVER資料庫,除了DAO層的專案,我們在common專案中也會對多資料來源、主從庫提供工具類,避免重複引入所以將資料庫驅動一併放在父專案中

而DAO層作為資料訪問層肯定需要連線資料庫進行操作的,現在我們著重檢視一下dao層的注意事項

DAO層依賴

com。youxue demo-model ${project。version} org。springframework。boot spring-boot-maven-plugin

DAO層專案中無非就是Mapper對映的介面以及Mapper。xml檔案,而資料庫驅動在父專案已經引入了,所以我們只需要引入Model專案即可

yml配置

spring: datasource: druid: username: username password: password driver-class-name: com。microsoft。sqlserver。jdbc。SQLServerDriver url: databaseUrl initial-size: 5 min-idle: 5 max-active: 20 aop: auto: true proxy-target-class: trueproject: version: ‘@project。version@’mybatis-plus: # resource目錄 classpath:/mapper/*Mapper。xml mapper-locations: classpath:/mapper/*Mapper。xml # 實體類 包掃描 type-aliases-package: com。youxue。demo。model global-config: db-config: db-type: sql_server #資料庫大寫下劃線轉換 #capital-mode: true configuration: # 資料庫關閉快取 cache-enabled: false # 開啟下劃線轉換駝峰命名 例 :(model String userName, SQL select user_name from userInfo) map-underscore-to-camel-case: true jdbc-type-for-null: ‘null’ # 開啟控制檯SQL列印 log-impl: org。apache。ibatis。logging。stdout。StdOutImpl

資料庫相關配置完成之後我們直接建立Mapper介面就行了,如下:

Spring Boot 專案如何按模組進行拆分?

隨後在service專案中建立對應的service以及impl:

Spring Boot 專案如何按模組進行拆分?

service層中我們需要依賴DAO層專案以及Model專案,並且可能會使用到一些工具類,所以還需要新增依賴:

com。youxue demo-common ${project。version} com。youxue demo-dao ${project。version} com。youxue demo-model ${project。version}

因為我們的啟動專案為Admin專案,所以我們所有的Controller都放在這個專案

Spring Boot 專案如何按模組進行拆分?

而Admin專案作為啟動專案,介面呼叫的響應結果肯定需要依賴Model層以及Service層,所以我們把依賴加入進來

這裡需要注意的是,Admin專案需要引入

spring-boot-starter-tomcat

來提供訪問支援

org。springframework。boot spring-boot-starter-tomcat provided com。youxue demo-model ${project。version} com。youxue demo-service ${project。version}

重點來了!!!!

啟動專案(踩過的坑)

@SpringBoot

註解,

@MapperScan

註解 的包掃描機制

大家肯定都知道,需要寫入對應的包路徑,此時我的Application是這樣的

Spring Boot 專案如何按模組進行拆分?

是不是看起來有模有樣的,好像沒啥問題子專案相互依賴,各方面的引入也沒啥問題,然而啟動後:

Spring Boot 專案如何按模組進行拆分?

啥玩意??? 資料庫url屬性沒有配置?咱們可是在DAO專案中配置的好好的,可是為啥這裡彷彿沒有用?

其實是因為沒有載入到DAO層專案的yml檔案,導致了啟動時無法識別到資料庫相關配置導致Spring丟擲了這個異常,那麼怎麼解決呢?

其實非常簡單,我們都知道SpringBoot是支援多配置檔案例如:

application-dev。yml

application-prod。yml

application-local。yml

我們需要在Admin啟動專案的配置檔案中引入DAO層專案的資料庫配置就行了

Spring Boot 專案如何按模組進行拆分?

Spring Boot 專案如何按模組進行拆分?

隨即專案啟動成功!是不是很棒,咱們來訪問一下Controller層的介面檢視一下效果

Spring Boot 專案如何按模組進行拆分?

訪問時是不是感覺與單一架構差不多?然後我們其實已經將DAO、Service、Controller整個三層架構拆分為三個子專案,甚至將Model、Common都拆分為獨立的子專案,作者當前公司就是拆分成這樣的,是不是很細?

原文連結:https://mp。weixin。qq。com/s/_hpzQdfZWG3——CIiC44eCQ