微服務(wù)實(shí)踐之行
使用maven進(jìn)行項(xiàng)目模塊拆分,遇到的一些坑,微服務(wù)框架層使用springboot。
使用user-server為例
一、服務(wù)分析
. 用戶模塊服務(wù)包含了對用戶信息的一系列操作,如登陸校驗(yàn), 修改/增加用戶等行為。因此涉及到了暴露給網(wǎng)關(guān)調(diào)用的接口層, 數(shù)據(jù)庫連接層dao, 以及具體的業(yè)務(wù)邏輯層。
二、拆分
. 將該模塊拆分為四個(gè)子模塊, 分別對應(yīng)的core, remote, dao, service.
- core: 包含的有springboot啟動(dòng)類以及一些配置類(數(shù)據(jù)庫配置或組件掃描注冊等)。
- remote: 包含的有接口和實(shí)現(xiàn)類,供網(wǎng)關(guān)進(jìn)行遠(yuǎn)程調(diào)用。實(shí)現(xiàn)類中調(diào)用了業(yè)務(wù)層的接口。
- dao: 包含model, 數(shù)據(jù)庫操作以及mybatis的xml文件
- service: 包含接口和實(shí)現(xiàn)類。具體的進(jìn)行業(yè)務(wù)操作。
三、 pom配置
根據(jù)場景需要分為項(xiàng)目根配置文件, 主要作用是依賴一些公共第三方的jar包以及使用<modules>將core, remote, dao, service四個(gè)模塊管理起來。
- 根pom配置關(guān)鍵代碼塊如下:
<groupId>cn.beardream</groupId>
<artifactId>user-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>user-server</name>
<modules>
<module>user-server-core</module>
<module>user-server-remote</module>
<module>user-server-dao</module>
<module>user-server-service</module>
</modules>
- core模塊配置關(guān)鍵代碼塊如下:
<artifactId>user-server-core</artifactId>
<packaging>jar</packaging>
<name>user-server-core</name>
<parent>
<groupId>cn.beardream</groupId>
<artifactId>user-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<!-- 需要掃描到的組件 -->
<dependency>
<groupId>cn.beardream</groupId>
<artifactId>user-server-remote</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>cn.beardream</groupId>
<artifactId>user-server-service</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>cn.beardream</groupId>
<artifactId>user-server-dao</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
- remote模塊關(guān)鍵配置
<artifactId>user-server-remote</artifactId>
<packaging>jar</packaging>
<name>user-server-remote</name>
<parent>
<groupId>cn.beardream</groupId>
<artifactId>user-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>cn.beardream</groupId>
<artifactId>user-server-service</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
- dao模塊關(guān)鍵配置
<artifactId>user-server-dao</artifactId>
<packaging>jar</packaging>
<name>user-server-dao</name>
<parent>
<groupId>cn.beardream</groupId>
<artifactId>user-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
- service模塊關(guān)鍵配置
<artifactId>user-server-service</artifactId>
<packaging>jar</packaging>
<name>user-server-service</name>
<parent>
<groupId>cn.beardream</groupId>
<artifactId>user-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>cn.beardream</groupId>
<artifactId>user-server-dao</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
由maven配置可以看的出來, 四個(gè)子模塊的parent都是user-server, user-server的pom配置modules包含了他們四個(gè)子模塊。子模塊中如果需要用到其他模塊的只需要用dependency依賴進(jìn)來即可。
四、如何將多個(gè)模塊打成一個(gè)可執(zhí)行jar包呢?
在前面我們構(gòu)建了四個(gè)子模塊以及一個(gè)父pom文件,但父pom文件的packaging其實(shí)是pom類型的,因此不能打包;正確的打包方式應(yīng)該在springApplication所在項(xiàng)目中的pom文件加上spring-boot-maven-plugin這個(gè)插件,并且在父pom文件上進(jìn)行配置。
- springApplication啟動(dòng)類所在模塊pom
<build>
<finalName>user-server-core</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.3.0.RELEASE</version>
</plugin>
</plugins>
</build>
- 父pom文件中配置
<build>
<plugins>
<plugin>
<!-- The plugin rewrites your manifest -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.3.0.RELEASE</version>
<configuration><!-- 指定該Main Class為全局的唯一入口 -->
<mainClass>cn.beardream.userserver.UserServerApplication</mainClass>
<layout>ZIP</layout>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal><!--可以把依賴的包都打包到生成的Jar包中-->
</goals>
<!--可以生成不含依賴包的不可執(zhí)行Jar包-->
<!-- configuration>
<classifier>exec</classifier>
</configuration> -->
</execution>
</executions>
</plugin>
</plugins>
</build>
至此
我們的微服務(wù)模塊劃分打包就已經(jīng)完成啦~
ps: package選擇pom和jar的不同情況:在該pom文件為一個(gè)需要被依賴的父pom文件時(shí)要選擇pom的打包方式,但具體的項(xiàng)目要選擇jar包的打包方式。
項(xiàng)目打包參考了該博客:http://blog.csdn.net/message_lx/article/details/54632947