搭建微服务项目骨架:通过 Maven 多模块方式

犬小哈 2024-05-02 约 3,477 字 大约 12 分钟 共 19 张图 1,714

友情提示

推荐您使用 Chrome 浏览器来阅读本实战专栏,其他浏览器可能存在兼容性问题。

之前章节中,我们已经将开发小哈书所需的本地环境搭建 完毕了,包括 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-module1my-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>

解释一波:

  1. <groupId>,<artifactId>,<version>: 分别指定了项目的 groupId 、artifactId 和 version,用于唯一标识项目和版本管理。
  2. <name>,<description>: 分别指定了项目的名称和描述。
  3. <packaging>: 指定项目的打包方式,这里是pom,表示该项目是一个多模块项目,不会产生可执行的 Jar 包。
  4. <properties>: 定义了项目的属性,包括项目版本号、JDK 版本、项目编码和依赖包版本等。
  5. <dependencyManagement>: 统一管理项目的依赖版本,这里定义了 lombok 的版本。
  6. <build>: 定义了项目的构建配置,包括插件管理和插件配置。这里配置了 Spring Boot Maven 插件和 Maven 编译插件,指定了 Java 版本和编码方式,并且配置了 Lombok 的注解处理器。
  7. <repositories>: 配置了项目的仓库,包括华为云和阿里云的 Maven 中央仓库,用于提升依赖下载速度。

Spring Cloud Alibaba 版本选择

接下来,我们将为项目添加微服务框架。Spring Cloud Alibaba 的版本很多,考虑到最新版本 2023.0.x 使用人数还不多,可能存在坑,这里小哈降低一个版本,选择 2022.0.x 版本。小伙伴们可访问 Spring Cloud Alibaba 官网:https://sca.aliyun.com , 点击导航栏中的 2022 版本,来查看对应的文档:

点击查看左侧栏中的版本发布声明 ,可以查看 Spring BootSpring Cloud AlibabaSpring 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-authauth 表示认证的意思;
  • Type : 使用 Maven 来构建项目;
  • Package name : 包名称,修改为 com.quanxiaoha.xiaohashu.auth
  • JDKJava 版本均选择 17 ;

相关选项填写完毕后,点击 Next 按钮 , 进入到下一步:

按照前面说的 Spring Cloud Alibaba 官网指定的版本依赖关系,这里 Spring Boot 版本选择 3.0.2 , 顺便把 Spring Web 依赖勾选上。最后,点击 Create 按钮创建项目。

等待项目创建完成,结构如下,将一些不需要的文件、文件夹删除掉,如 /static.gitignoreHELP.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 相关组件,将整个微服务体系渐进式的搭建起来。

本小节源码下载

https://t.zsxq.com/tRw9Y

最后编辑于 2024-05-03 10:53:15