微服务实践之行
使用maven进行项目模块拆分,遇到的一些坑,微服务框架层使用springboot。
使用user-server为例
一、服务分析
. 用户模块服务包含了对用户信息的一系列操作,如登陆校验, 修改/增加用户等行为。因此涉及到了暴露给网关调用的接口层, 数据库连接层dao, 以及具体的业务逻辑层。
二、拆分
. 将该模块拆分为四个子模块, 分别对应的core, remote, dao, service.
- core: 包含的有springboot启动类以及一些配置类(数据库配置或组件扫描注册等)。
- remote: 包含的有接口和实现类,供网关进行远程调用。实现类中调用了业务层的接口。
- dao: 包含model, 数据库操作以及mybatis的xml文件
- service: 包含接口和实现类。具体的进行业务操作。
三、 pom配置
根据场景需要分为项目根配置文件, 主要作用是依赖一些公共第三方的jar包以及使用<modules>将core, remote, dao, service四个模块管理起来。
- 根pom配置关键代码块如下:
<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模块配置关键代码块如下:
<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模块关键配置
<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模块关键配置
<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模块关键配置
<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配置可以看的出来, 四个子模块的parent都是user-server, user-server的pom配置modules包含了他们四个子模块。子模块中如果需要用到其他模块的只需要用dependency依赖进来即可。
四、如何将多个模块打成一个可执行jar包呢?
在前面我们构建了四个子模块以及一个父pom文件,但父pom文件的packaging其实是pom类型的,因此不能打包;正确的打包方式应该在springApplication所在项目中的pom文件加上spring-boot-maven-plugin这个插件,并且在父pom文件上进行配置。
- springApplication启动类所在模块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>
<!--可以生成不含依赖包的不可执行Jar包-->
<!-- configuration>
<classifier>exec</classifier>
</configuration> -->
</execution>
</executions>
</plugin>
</plugins>
</build>
至此
我们的微服务模块划分打包就已经完成啦~
ps: package选择pom和jar的不同情况:在该pom文件为一个需要被依赖的父pom文件时要选择pom的打包方式,但具体的项目要选择jar包的打包方式。
项目打包参考了该博客:http://blog.csdn.net/message_lx/article/details/54632947