友情提示 : 推荐使用谷歌浏览器来阅读本专栏,其他浏览器可能存在兼容性问题。
之前章节中,我们已经将开发小哈书所需的本地环境搭建 完毕了,包括 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 文件, 内容如下:
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">
解释一波:
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 中,添加三者的版本号,以及引入对应的依赖,内容如下:
// 省略...
// 省略...
// 省略...
// 省略...
// 省略...
创建 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 文件,内容如下:
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
接着,在父项目的 pom.xml 中的
// 省略...
// 省略...
添加完成后,点击右侧的 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