在了解SpringBoot項目拆分之前首先我們需要了解微服務架構
什么是微服務?
單個輕量級服務一般為一個單獨微服務,微服務講究的是 專注某個功能的實現,比如登錄系統只專注于用戶登錄方面功能的實現,講究的是職責單一,開箱即用,可以獨立運行。微服務架構系統是一個分布式的系統,按照業務進行劃分服務單元模塊,解決單個系統的不足,滿足越來越復雜的業務需求。
馬丁福勒(Martin Fowler):就目前而言,對于微服務業界并沒有一個統一的、標準的定義。但通常而言,微服務架構是一種架構模式或者說是架構風格,它提倡將單一應用程序劃分成一組小的服務。每個服務運行在其獨立的自己的進程中服務之間相互配合、相互協調,為用戶提供最終價值。服務之間采用輕量級通信。每個服務都圍繞具體業務進行構建,并能夠獨立部署到生產環境等。另外應盡量避免統一的、集中的服務管理機制。
通俗的來講:
微服務就是一個獨立的職責單一的服務應用程序。在 intellij idea 工具里面就是用maven開發的一個個獨立的module,具體就是使用springboot 開發的一個小的模塊,處理單一專業的業務邏輯,一個模塊只做一個事情。
微服務強調的是服務大小,關注的是某一個點,具體解決某一個問題/落地對應的一個服務應用,可以看做是idea 里面一個 module。
比如你去醫院:你的牙齒不舒服,那么你就去牙科。你的頭疼,那么你就去腦科。一個個的科室,就是一個微服務,一個功能就是一個服務。
微服務的優缺點是什么?
優點: 松耦合,聚焦單一業務功能,無關開發語言,團隊規模降低。在開發中,不需要了解多有業務,只專注于當前功能,便利集中,功能小而精。微服務一個功能受損,對其他功能影響并不是太大,可以快速定位問題。微服務只專注于當前業務邏輯代碼,不會和 html、css 或其他界面進行混合。可以靈活搭配技術,獨立性比較舒服。
缺點: 隨著服務數量增加,管理復雜,部署復雜,服務器需要增多,服務通信和調用壓力增大,運維工程師壓力增大,人力資源增多,系統依賴增強,數據一致性,性能監控
什么是微服務架構?
微服務架構 就是 對微服務進行管理整合應用的。微服務架構 依賴于 微服務,是在微服務基礎之上的。
例如:上面已經列舉了什么是微服務。在醫院里,每一個科室都是一個獨立的微服務,那么 這個醫院 就是 一個大型的微服務架構,就類似 院長 可以 對下面的 科室進行管理。微服務架構主要就是這種功能。
創建一個父項目
項目依賴咱們可以先不添加,項目創建完之后統一加入就好了
父項目pom文件
然后我們需要注意的是需要更改父項目的pom文件
在父級項目中的pom.xml文件使用的packaging配置一定為pom。父級的pom文件只作項目的子模塊的整合,在maven install時不會生成jar/war壓縮包。
然后將打包插件更改為 maven-compiler-plugin
<build>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>${JAVA.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugins>
<build>
創建子模塊
在指定項目路徑的時候需要注意,需要加入到父項目路徑下
因為子項目是需要我們啟動的項目所以我們需要更新子項目pom文件打包方式為jar
<name>demo-dao</name>
<packaging>jar</packaging>
<artifactId>demo-dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
<description>dao project</description>
由于父項目僅需要對子項目進行管理,所以可以直接刪除掉父項目的src目錄,保留pom文件即可
隨后我們分別創建 dao、model、service、common、admin 共5個子模塊,其中admin模塊作為我們的啟動項目,現在我們的目錄結構是這樣的
但現在父項目與子項目并無關系,子項目僅僅是在父項目目錄下而已,我們需要用maven將子項目交給父項目管理
父項目中引入子項目
子項目依賴父項目
在每個子項目都依賴父項目之后我們就可以在pom文件中查看到此時的父項目與子項目已經是相互依賴的關系了,如下圖
至此我們就可以添加pom文件相關的依賴了,多項目拆分的情況下由父項目管理所有子項目的jar包版本,而父項目中引入的依賴子項目中不需要重復引入也可直接使用,所以我們在引入依賴時如果這個jar包在其他項目也需要使用到的話就可以直接寫到父項目的pom文件中就可以了
以下是父項目的pom文件
<properties>
<java.version>1.8</java.version>
<lombok.version>1.18.20</lombok.version>
<druid.version>1.1.18</druid.version>
<MyBatis-plus.version>3.4.1</mybatis-plus.version>
<swagger2.version>2.9.2</swagger2.version>
<sqlserver.jdbc>7.2.2.jre8</sqlserver.jdbc>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<!-- ali數據源、mybatis-plus-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<!-- SQL server 數據庫驅動 -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>${sqlserver.jdbc}</version>
<scope>runtime</scope>
</dependency>
<!-- mybatis-plus 代碼生成器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-core</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
<!-- swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>1.9.0</version>
</dependency>
</dependencies>
這里我使用的是SQLSERVER數據庫,除了DAO層的項目,我們在common項目中也會對多數據源、主從庫提供工具類,避免重復引入所以將數據庫驅動一并放在父項目中
而DAO層作為數據訪問層肯定需要連接數據庫進行操作的,現在我們著重查看一下dao層的注意事項
DAO層依賴
<dependencies>
<dependency>
<groupId>com.youxue</groupId>
<artifactId>demo-model</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
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: true
project:
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接口就行了,如下:
隨后在service項目中創建對應的service以及impl:
service層中我們需要依賴DAO層項目以及Model項目,并且可能會使用到一些工具類,所以還需要添加依賴:
<dependencies>
<dependency>
<groupId>com.youxue</groupId>
<artifactId>demo-common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.youxue</groupId>
<artifactId>demo-dao</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.youxue</groupId>
<artifactId>demo-model</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
因為我們的啟動項目為Admin項目,所以我們所有的Controller都放在這個項目
而Admin項目作為啟動項目,接口調用的響應結果肯定需要依賴Model層以及Service層,所以我們把依賴加入進來
這里需要注意的是,Admin項目需要引入spring-boot-starter-Tomcat來提供訪問支持
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.youxue</groupId>
<artifactId>demo-model</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.youxue</groupId>
<artifactId>demo-service</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
重點來了!!!!
啟動項目(踩過的坑)
@SpringBoot注解,@MapperScan注解 的包掃描機制
大家肯定都知道,需要寫入對應的包路徑,此時我的Application是這樣的
是不是看起來有模有樣的,好像沒啥問題子項目相互依賴,各方面的引入也沒啥問題,然而啟動后:
啥玩意??? 數據庫url屬性沒有配置?咱們可是在DAO項目中配置的好好的,可是為啥這里仿佛沒有用?
其實是因為沒有加載到DAO層項目的yml文件,導致了啟動時無法識別到數據庫相關配置導致Spring拋出了這個異常,那么怎么解決呢?
其實非常簡單,我們都知道SpringBoot是支持多配置文件例如:application-dev.yml、application-prod.yml、application-local.yml
我們需要在Admin啟動項目的配置文件中引入DAO層項目的數據庫配置就行了
隨即項目啟動成功!是不是很棒,咱們來訪問一下Controller層的接口查看一下效果
訪問時是不是感覺與單一架構差不多?然后我們其實已經將DAO、Service、Controller整個三層架構拆分為三個子項目,甚至將Model、Common都拆分為獨立的子項目,作者當前公司就是拆分成這樣的,是不是很細?
原文鏈接:
https://mp.weixin.qq.com/s/_hpzQdfZWG3--CIiC44eCQ






