随着 Spring Boot、Spring Cloud 的流行,越来越多的公司和企业开始使用微服务分布式架构,大家也都在学习相关知识;在自己做项目的时候,面对庞大的项目文件和繁杂的逻辑关系,有些同学就不知如何部署自己的项目了,下面我将介绍通用型的微服务项目部署方式。
一、项目分析
在打包部署之前我们先来简单的分析一下项目结构,这里我拿出最近部署的一个项目作为例子,该项目使用的阿里的 Nacos 服务,没有使用 Eureka 服务注册中心,所以少了一个模块。
这个项目文件里包含了前端和后端的代码,还有一些文本文件;这里我们不关心与后端无关的,先列举出后端模块(图中可以看出文件夹右下角带有蓝色正方形的就是后端模块):
- business: 业务模块,提供主要的业务逻辑接口
- file: 文件模块,提供文件的上传下载接口
- gateway: 网关模块,请求的必经之路,负责拦截请求
- generator: 代码生成模块,负责生成重复性代码
- server: 一些实体类、工具类、枚举类等
- system: 系统模块,提供用户相关的接口
这些模块中只有部分需要打包,最简单的判别方法就是,有 主启动类 的模块需要打包,其余的不需要打包。
如上图所示,business 模块就需要打包,同样有启动类的模块还有:file、gateway、system。
所指本项目只有这四个模块需要打包。
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
二、打包项目
打包项目肯定是使用最流行的 maven 了,不过在执行 install 之前需要先修改配置文件,确保和下面的一样:
2.1、父 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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.lsu</groupId> <artifactId>online-course</artifactId> <packaging>pom</packaging> <version>1.0.0</version> <modules> <module>system</module> <module>gateway</module> <module>server</module> <module>business</module> <module>generator</module> <module>file</module> </modules> <name>online-course</name> <description>在线视频课程系统</description> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> ··· </properties> <dependencyManagement> <dependencies> ··· </dependencies> </dependencyManagement> <build> <plugins> <plugin> ··· </plugin> <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> </build> </project>
- 父 pom 中一定要指定
maven-compiler-plugin
和maven-surefire-plugin
插件。 <packaging>pom</packaging>
打包类型写 pom 包。
2.2、子 pom 文件
这里以 business 模块的 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>online-course</artifactId> <groupId>com.lsu</groupId> <version>1.0.0</version> </parent> <modelVersion>4.0.0</modelVersion> <packaging>jar</packaging> <artifactId>business</artifactId> <dependencies> ··· </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!-- 指定该 Main Class 为全局的唯一入口 --> <mainClass>com.lsu.business.BusinessMainApplication</mainClass> <layout>ZIP</layout> </configuration> <executions> <execution> <goals> <!-- 将依赖到的包都放进去 --> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
注意:
- 子 pom 文件中一定要指定
spring-boot-maven-plugin
插件和主启动类的 全类名 。 <packaging>jar</packaging>
打包类型写 Jar 包。
其中 <goal>repackage</goal>
,我写到了他会将依赖到的包都打进去,具体如下图:
他会将依赖到的包都放到 BOOT-INF
文件夹下面的 lib 中:
- 优点是后续不用担心依赖找不到的问题,高可移植性;
- 缺点是会导致 jar 包体积很大,例图中的包有 60M 大小,如果不将依赖放进去以 KB 为单位。