最近工作之余在完善自己的项目,基础业务已经七七八八结束了,打算是时候将自己的SpringBoot单体项目改造为Cloud微服务了。在此之前我也是各种查阅各方资料,现在总结记录一下单体项目转微服务的大体操作方法。
第一步:将你的项目转变为拆分为多模块项目(可以不用特别细分)
这个可以理解为(将你的常量、工具类、配置等类与你的业务代码分离,并产生层级关系)
如图中最外层的xxx_Serve是最大父文件下文中会称之为A,我们接下来回在这个父文件下生成Cloud的多模块服务。
A的pom.xml(可以理解为上图倒数第三行的pom.xml)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.4</version>
</parent>
<groupId>com.justgame</groupId>
<artifactId>player-platform</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<modules>
<!-- 基础模块:提供相应工具类、常量及配置等 -->
<module>just-game-base</module>
<!-- 业务模块 -->
<module>just-game-module</module>
</modules>
<!-- 阿里云maven镜像 -->
<repositories>
<repository>
<id>aliyun</id>
<name>aliyun Repository</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<!-- jar版本 -->
<properties>
<java.version>1.8</java.version>
<!-- 此处省略 -->
</properties>
<dependencies>
<!-- 此处省略 -->
</dependencies>
<dependencyManagement>
<!-- 此处省略 -->
</dependencyManagement>
<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>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<skipTests>true</skipTests> <!--默认关掉单元测试 -->
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<!-- 此处指向你项目中的Resources文件地址 --!>
<directory>${project.basedir}/just-game-module/src/main/resources</directory>
<!-- <filtering>true</filtering>-->
</resource>
</resources>
</build>
我们在分离后的子模块中重新生成属于子模块的pom
我贴一下启动类模块下的pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.justgame</groupId>
<artifactId>player-platform</artifactId>
<version>1.0.0</version>
</parent>
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
<artifactId>just-game-module</artifactId>
<version>1.0.0</version>
<dependencies>
<!-- 此处省略 -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 必须加,不加会导致其他模块找不到Jar包 -->
<classifier>exec</classifier>
<!-- 指定该Main Class为全局的唯一入口 -->
<mainClass>com.justgame.project.module.ProjectApplication</mainClass>
<layout>ZIP</layout>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal><!--可以把依赖的包都打包到生成的Jar包中-->
</goals>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<!-- 必须配置,否则不能切换yml配置文件 -->
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</project>
这里需要注意的是:作为子模块,其pom文件(子pom中<parent>标签)需要指向A
另一个子模块pom文件大同小异不做展示!
2、在确保你的项目拆分完模块后依然能够启动的情况下,右键A文件夹,创建一个新的子模块
姑且命名格式定为【项目英简-cloud-core】 作为核心业务代码模块,创建好后如下图
3、此时查看A的pom.xml文件中有如下变动
idea自动添加了一个子模块【just-game-cloud-core】,下文称为core,同时删除A中的【just-game-base】、【just-game-module】子模块项。
紧接着我们首先需要将core文件夹下的src整个文件夹删除
4、首先修改core中pom.xml,将本属于A的子模块【base】、【module】转为core的子模块
修改后的core中的pom文件为:
现在还报红,没关系,紧接着我们修改图中报红的子模块的Pom文件,将其parent指向core,并在core的pom文件中添加
<packaging>pom</packaging>
含义为core的pom不执行代码,只是聚合工程及传递依赖。
core的子模块pom头如下:
然后我们使用鼠标将子模块【base】、【module】两个文件夹拖动至core目录下
此时再去查看core的pom文件已经不报红了!
5、将原A的pom依赖转移到core的pom中:
这里需注意:
A的pom文件只保留<properties>标签及其内容,<dependencies>相关内容全部转移
A的POM:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.4</version>
</parent>
<groupId>com.justgame</groupId>
<artifactId>player-platform</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<modules>
<module>just-game-cloud-core</module>
</modules>
<properties>
<spring-cloud.version>2020.0.5</spring-cloud.version>
<!-- 此处省略,但不代表为空 -->
</properties>
<!-- SpringCloud 版本控制 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 阿里云maven镜像 -->
<repositories>
<repository>
<id>aliyun</id>
<name>aliyun Repository</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
core的POM:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>player-platform</artifactId>
<groupId>com.justgame</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>just-game-cloud-core</artifactId>
<packaging>pom</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<!-- 阿里云maven镜像 -->
<repositories>
<repository>
<id>aliyun</id>
<name>aliyun Repository</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<dependencies>
<!-- 此处省略,但不代表为空 -->
</dependencies>
<dependencyManagement>
<dependencies>
<!-- 此处省略,但不代表为空 -->
</dependencies>
</dependencyManagement>
<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>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<skipTests>true</skipTests> <!--默认关掉单元测试 -->
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>${project.basedir}/just-game-module/src/main/resources</directory>
<!-- <filtering>true</filtering>-->
</resource>
</resources>
</build>
<modules>
<!-- 基础模块:提供相应工具类、常量及配置等 -->
<module>just-game-base</module>
<!-- 业务模块 -->
<module>just-game-module</module>
</modules>
</project>
到这里如果你依然可以maven install打包项目及运行起来,则已经成功转型为springcloud结构了,后续只需要继续向A添加微服务模块即可!
如果你想立马感受微服务,可以看【SpringBoot项目拆分为SpringCloud微服务 - 从0-1开始搭建微服务】