搭建微服务项目骨架:通过 Maven 多模块方式
友情提示 : 推荐使用谷歌浏览器来阅读本专栏,其他浏览器可能存在兼容性问题。
之前章节中,我们已经将开发小哈书所需的本地环境搭建 完毕了,包括 JDK 17、MySQL 8.0 等等。本小节开始,正式进入到项目搭建环节。和星球第一个项目 一样,依旧是采用 Maven 多模块的方式来管理微服务项目。
相关概念
在搭建项目之前,先了解一下相关概念。
什么是单体架构
单体架构是一种传统的软件架构模式,通常将整个应用作为一个单一的、独立部署的单元来开发、构建和部署。在单体架构中,所有的功能模块和业务逻辑都打包在同一个应用程序中,比如 weblog
项目,最终是打包成一个 Jar
包来部署。这包括业务逻辑、数据访问和数据存储等。整个应用程序通常部署在一个应用服务器上,与外部系统通过接口进行通信。单体架构开发简单,部署方便,适合流量不大的应用。但随着应用规模的增长,往往会遇到可扩展性差、维护困难、部署风险高等问题。
什么是微服务架构
微服务架构是一种将应用程序拆分为多个小型、自治的服务的架构模式。可以通过上图本项目的架构图来理解。每个服务都专注于实现一个特定的业务功能,并通过轻量级的通信机制(如 HTTP 或 RPC)与其他服务进行通信。微服务架构将整个应用程序拆分成多个松耦合的服务单元,每个服务单元都可以独立开发、测试、部署和扩展。微服务架构有助于提高灵活性、可扩展性和可维护性,适合大流量型应用。但也增加了部署和运维的复杂性,需要考虑服务间通信、服务注册与发现、服务监控等方面的问题。
Spring Cloud
Spring Cloud 是基于 Spring Boot 的微服务架构开发工具包,提供了一系列开发工具和库,用于快速构建、部署和管理分布式系统中的微服务应用。Spring Cloud提供了诸如服务发现、服务注册、负载均衡、断路器、配置管理、消息总线等功能,帮助开发人员解决了微服务架构中的常见问题,简化了微服务应用的开发和部署流程。
Spring Cloud Alibaba
Spring Cloud Alibaba 是 Spring Cloud 生态的一部分,提供了一系列基于阿里巴巴开源产品的分布式解决方案和工具,用于构建和管理基于 Spring Cloud 的微服务应用。Spring Cloud Alibaba 集成了阿里巴巴开源的服务,如 Nacos(服务注册与发现)、Sentinel(流量控制和熔断降级)、Dubbo(远程服务调用)、RocketMQ(消息队列)等,为开发人员提供了一站式的微服务解决方案。Spring Cloud Alibaba 与 Spring Cloud 兼容,并且提供了额外的功能和工具,帮助开发人员更轻松地构建、部署和管理微服务应用。
多模块项目
什么是多模块项目?
多模块项目是项目构建中的概念。拿 Maven 来说,多模块项目(Multi-Module Project)是其一个重要特性,它允许我们在一个项目中管理多个子模块。
在一个 Maven 多模块项目中,每个模块都是一个独立的项目,拥有自己的 POM 文件(Project Object Model,项目对象模型)。这些模块可以互相依赖,也可以被其他项目依赖。但是,所有的模块都会被统一管理,它们共享同一套构建系统和依赖管理。
Maven 多模块项目的结构大概是下面这样的:
my-app/ (父项目)
|- pom.xml
|- my-module1/ (子模块1)
| |- pom.xml
|- my-module2/ (子模块2)
|- pom.xml
| ... (实际企业级项目中,会分非常多的模块)
在这个例子中,my-app
是父项目,my-module1
和 my-module2
是它的子模块。每个模块都有自己的 pom.xml
文件。
为什么需要多模块项目?
主要有以下几个原因:
- 代码组织:在大型项目中,我们经常需要把代码分成多个模块,以便更好地组织代码。每个模块可以聚焦于一个特定的功能或领域,这样可以提高代码的可读性和可维护性。
- 依赖管理:Maven 多模块项目可以帮助我们更好地管理项目的依赖。在父项目的 POM 文件中,我们可以定义所有模块共享的依赖,这样可以避免重复的依赖定义,也方便我们管理和升级依赖。
- 构建和部署:Maven 多模块项目的另一个优点是它可以统一管理项目的构建和部署。我们只需要在父项目中执行 Maven 命令,就可以对所有模块进行构建和部署。这大大简化了开发者的工作。
IDEA 搭建微服务多模块工程骨架
创建父模块
打开 IDEA, 这里小哈使用的是 2024 版本。依次点击左上角菜单 File | New | Project , 开始创建项目:
填写相关选项,操作如下:
解释一下标注的地方:
- ①:选择
Maven Archetype
来创建一个Maven
项目;- ②:项目名称,小哈书的拼音;
- ③:项目创建的位置;
- ④:项目使用的
JDK
版本,本项目使用的是JDK 17
;- ⑤:IDEA 需要知道 Maven Archetype Catalog 的位置,以便从中获取可用的 Archetype 列表。这个 Catalog 文件通常包含了 Maven 官方仓库或其他远程仓库中可用的 Archetype 信息。选择
Internal
即可。- ⑥:通过使用 Archetype,你可以基于已有的项目模板创建一个新项目。这里选择
maven-archetype-quickstart
。- ⑦:填写 Group 组织名称,通常为公司域名倒写,如
com.quanxiaoha
;- ⑧:项目的唯一标识符;
- ⑨:项目版本号,默认就行;
然后,点击 Create 创建项目, 创建完成后,项目结构大致如下:
TIP : 如果生成了
/src
文件夹,将其删除掉,父模块仅需要保留一个pom.xml
文件,用于统一管理依赖、插件等。如下图所示:
修改父模块的 pom.xml
文件, 内容如下:
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.quanxiaoha</groupId>
<artifactId>xiaohashu</artifactId>
<version>${revision}</version>
<!-- 项目名称 -->
<name>${project.artifactId}</name>
<!-- 项目描述 -->
<description>小哈书(仿小红书),基于 Spring Cloud Alibaba 微服务架构</description>
<!-- 多模块项目需要配置打包方式为 pom -->
<packaging>pom</packaging>
<!-- 子模块管理 -->
<modules>
</modules>
<properties>
<!-- 项目版本号 -->
<revision>0.0.1-SNAPSHOT</revision>
<!-- JDK 版本 -->
<java.version>17</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<!-- 项目编码 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- Maven 相关版本号 -->
<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
<!-- 依赖包版本 -->
<lombok.version>1.18.30</lombok.version>
</properties>
<!-- 统一依赖管理 -->
<dependencyManagement>
<dependencies>
<!-- 避免编写那些冗余的 Java 样板式代码,如 get、set 等 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<!-- 统一插件管理 -->
<pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal> <!-- 将依赖的 Jar 一起打包 -->
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<!-- 添加华为云、阿里云 maven 中央仓库,提升依赖下载速度 -->
<repositories>
<repository>
<id>huaweicloud</id>
<name>huawei</name>
<url>https://mirrors.huaweicloud.com/repository/maven/</url>
</repository>
<repository>
<id>aliyunmaven</id>
<name>aliyun</name>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>
</project>
解释一波:
<groupId>
,<artifactId>
,<version>
: 分别指定了项目的 groupId 、artifactId 和 version,用于唯一标识项目和版本管理。<name>
,<description>
: 分别指定了项目的名称和描述。<packaging>
: 指定项目的打包方式,这里是pom
,表示该项目是一个多模块项目,不会产生可执行的 Jar 包。<properties>
: 定义了项目的属性,包括项目版本号、JDK 版本、项目编码和依赖包版本等。<dependencyManagement>
: 统一管理项目的依赖版本,这里定义了 lombok 的版本。<build>
: 定义了项目的构建配置,包括插件管理和插件配置。这里配置了 Spring Boot Maven 插件和 Maven 编译插件,指定了 Java 版本和编码方式,并且配置了 Lombok 的注解处理器。<repositories>
: 配置了项目的仓库,包括华为云和阿里云的 Maven 中央仓库,用于提升依赖下载速度。
Spring Cloud Alibaba 版本选择
接下来,我们将为项目添加微服务框架。Spring Cloud Alibaba 的版本很多,考虑到最新版本 2023.0.x 使用人数还不多,可能存在坑,这里小哈降低一个版本,选择 2022.0.x 版本。小伙伴们可访问 Spring Cloud Alibaba 官网:https://sca.aliyun.com , 点击导航栏中的 2022 版本,来查看对应的文档:
点击查看左侧栏中的版本发布声明 ,可以查看 Spring Boot
、Spring Cloud Alibaba
、Spring Cloud
,以及各组件的依赖关系:
参考官方文档,我们选择 Spring Cloud Alibaba
2022 最新的版本,即 2022.0.0.0
。在父模块的 pom.xml
中,添加三者的版本号,以及引入对应的依赖,内容如下:
<properties>
// 省略...
<!-- 依赖包版本 -->
<spring-boot.version>3.0.2</spring-boot.version>
<spring-cloud-alibaba.version>2022.0.0.0</spring-cloud-alibaba.version>
<spring-cloud.version>2022.0.0</spring-cloud.version>
// 省略...
</properties>
// 省略...
<!-- 统一依赖管理 -->
<dependencyManagement>
<dependencies>
<!-- Spring Boot 官方依赖管理 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Cloud Alibaba 官方依赖管理 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Cloud 官方依赖管理 -->
<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>
// 省略...
创建 auth 认证服务
接下来,我们来创建小哈书的第一个微服务 —— 认证服务:专门负责用户登录、注册、账号注销等后端功能。
在父项目右键 | New | Module... , 来创建一个子模块:
填写相关选项,操作如下:
解释一下红线标注的地方:
- 选择 Spring Boot 项目初始化器来创建项目;
- 将
Server URL
更改为阿里云的 Spring Boot 初始化器:http://start.aliyun.com ;- 填写项目名称:
xiaohashu-auth
,auth
表示认证的意思;Type
: 使用 Maven 来构建项目;Package name
: 包名称,修改为com.quanxiaoha.xiaohashu.auth
;JDK
和Java
版本均选择 17 ;
相关选项填写完毕后,点击 Next 按钮 , 进入到下一步:
按照前面说的 Spring Cloud Alibaba 官网指定的版本依赖关系,这里 Spring Boot 版本选择 3.0.2 , 顺便把
Spring Web
依赖勾选上。最后,点击 Create 按钮创建项目。
等待项目创建完成,结构如下,将一些不需要的文件、文件夹删除掉,如 /static
、.gitignore
、HELP.me
:
TIP : 使用阿里云
Spring Boot
初始化来创建的项目,会自动在你的项目中生成demos.web
包,默认创建了一些接口使用示例,有兴趣的小伙伴,可以看看。
修改 xiaohashu-auth
认证服务的 pom.xml
文件,内容如下:
<?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>
<!-- 指定父项目 -->
<parent>
<groupId>com.quanxiaoha</groupId>
<artifactId>xiaohashu</artifactId>
<version>${revision}</version>
</parent>
<!-- 指定打包方式 -->
<packaging>jar</packaging>
<artifactId>xiaohashu-auth</artifactId>
<name>${project.artifactId}</name>
<description>小哈书:认证服务(负责处理用户登录、注册、账号注销等)</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
接着,在父项目的 pom.xml
中的 <modules>
节点下,添加子模块, xiaohashu-auth
认证服务:
// 省略...
<!-- 子模块管理 -->
<modules>
<!-- 认证服务 -->
<module>xiaohashu-auth</module>
</modules>
// 省略...
添加完成后,点击右侧的 Reload 图标, 刷新一下 Maven 依赖,观察项目是否有爆红情况,正常情况下,应该都是正常的:
测试打包是否正常
接下来,我们测试一下多模块项目打包是否正常。对右侧栏中的父项目进行 clean package
, 观察控制台日志,确认一下项目打包是否正常:
启动认证服务
打包没问题后,再来测试一下认证服务是否能够正常运行。点击 XiaohashuAuthApplication
启动类的 main
方法左侧的运行按钮,来启动服务:
若看到控制台输出 Tomcat started on port(s): 8080
信息,则表示服务成功运行在了 8080
端口上。打开浏览器,访问地址 localhost:8080
,即可看到 Spring Boot
项目的页面提示信息了,如下图所示:
结语
本小结中,我们了解了什么是单体架构、微服务架构,以及 Spring Cloud 、Spring Cloud Alibaba 之间的关系。然后,上手搭建了一个 Maven 多模块项目,并引入了 Spring Cloud Alibaba 2022.0.x 依赖, 还创建了一个子模块 —— 认证服务,并成功运行了起来。但是,目前还只是简单的多模块的项目,还没实际使用到微服务,后续小节中,将一点一点引入 Spring Cloud Alibaba 相关组件,将整个微服务体系渐进式的搭建起来。