SpringCloud微服务聚合工程创建指南
前言
在微服务开发中,Spring Boot、Spring Cloud 和 Spring Cloud Alibaba 是三个非常重要的框架和技术栈。然而,许多开发者在使用这些框架时,经常会遇到版本兼容性的问题。本文将详细解释这三者的版本选择和对应关系,将这三者整合初始化新建一个maven聚合工程,帮助开发者更好地理解和使用这些框架。
文章目录
- 前言
- 1 准备工作
- 2 关于版本问题
- 3 Idea新建Maven工程
- 4 Spring依赖引入
概述
- Spring Boot:是一个快速开发微服务的框架,它简化了基于 Spring 的应用开发,提供了许多自动配置的功能。
- Spring Cloud:是基于 Spring Boot 实现的一套微服务解决方案,包括服务注册与发现、配置管理、断路器、智能路由、微代理、控制总线等。
- Spring Cloud Alibaba:是 Spring Cloud 的一个扩展,集成了阿里巴巴的多个开源组件,如 Nacos、Sentinel、RocketMQ 等,提供了更加丰富的微服务解决方案。
1 准备工作
在开始创建聚合工程之前,确保你已经安装和拥有了下列环境
环境说明:windows11、idea2023.3.8,maven3.6.3、openjdk8
- idea2023.3.8官网地址:idea官网下载
- maven3.6:windwos安装多版本Maven(图文详细版)
- openjdk8:OracleJDK与OpenJDK的区别(附带win11下多版本jdk安装)
注意:示例工程只展示基础常用的模块,可以根据项目自行需要添加对应模块,理解思路和过程就行。
jialiangkj-pet-common: 通用模块,项目中常用的一些工具类和公共类等。
jialiangkj-pet-pojo: 实体类模块,存放实体类对象,例如: BO、VO等对象。
jialiangkj-pet-api: web接口的公用依赖
jialiangkj-pet-gateway: 微服务网关
jialiangkj-pet-auth-service: 鉴权中心
jialiangkj-pet-file-service: 文件资源服务
本文将按照以下环境进行创建工程
- SpringBoot2.7.18
- SpringCloud2021.0.9
- SpringCloud Alibaba2021.0.6.1
如果想了解单体架构如何创建项目工程的请查看:Springboot创建Mave聚合工程(可灵活创建任意版本)
2 关于版本问题
正确的版本选择对于项目的稳定性和性能至关重要。不合适的版本组合可能会导致各种问题,如依赖冲突、功能缺失等。因此,了解各版本之间的对应关系是非常必要的。
Spring Boot、Spring Cloud 和 Spring Cloud Alibaba 版本对应关系
大多数开发者都是直接按照网上的步骤和教程使用版本,但很多人并不清楚这三个版本的对应关系,接下来将从官网入手查看版本对应关系。
浏览器打开springboot官网:https://spring.io/projects/spring-boot#learn,查看可选择的GA版本
由于SpringBoot3
以上系列,最低需要jdk17
以上进行支持,但是目前企业里大多数项目还是使用jdk8
(成熟稳定运行多年)且生态支持繁荣,所以我们本次示例使用SpringBoot2.X
系列最后一个版本2.7.18
进行示范。
确定好使用springboot2.7.18版本之后,那么我们查看SpringCloud对应的应该使用哪个版本进行匹配。
点击后滚轮鼠标下滑
我们可以看到SpringBoot2.6.x、2.7.x对应的Cloud版本为2021.0.x
这里我们在点击SpringCloud Alibaba,发现Spring官网并没有跟新版本号,我们需要去Alibaba的github官网查看最新版本号
SpringCloud Alibaba的github官方地址:https://github.com/alibaba/spring-cloud-alibaba
可以知道SpringBoot2.7.x版本对应的 SpringCloud Alibaba版本为2021.x版本
具体版本号和依赖获取
最终具体版本确定可以查看maven官方仓库确认,maven仓库官方地址:https://mvnrepository.com/
1.SpringBoot版本依赖坐标获取
进入maven仓库后搜索:spring boot starter parent
进入后下滑找到2.7.18版本
点击进入后可以获取pom文件依赖坐标
最终SpringBoot2.7.18 对应版本依赖坐标如下
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.18</version><type>pom</type>
</dependency>
2.SpringBoot版本依赖坐标获取
进入maven仓库后搜索:spring-cloud-dependencies
找到2021.0.x最后更新的小版本
点击进入后可以获取pom文件依赖坐标
最终SpringCloud2021.0.9 对应版本依赖坐标如下
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2021.0.9</version><type>pom</type><scope>import</scope>
</dependency>
3.SpringBoot版本依赖坐标获取
进入maven仓库后搜索:spring-cloud-alibaba-dependencies
进入后找到2021.0.x最后更新版本的日期小版本进行选择
点击进入后可以获取pom文件依赖坐标
最终SpringCloud Alibaba 对应版本依赖坐标如下
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-alibaba-dependencies -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2021.0.6.1</version><type>pom</type>
</dependency>
至此我们需要的三个SpringBoot2.7.18、SpringCloud2021.0.9 和 SpringCloud Alibaba2021.0.6.1的版本对应关系和相关安装依赖已经完成。
3 Idea新建Maven工程
spring官方模版新建时无法选择旧版本创建
因为我们要创建springboot2.7.18版本,所以不选择上述创建方式,思路是先创建maven聚合工程,然后再引入springboot低版本的依赖
打开idea新建工程
根据自己需要填写项目名称,保存路径等
选择已有的jdk,此处选择spring官方推荐使用BellSoft Liberica JDK
点击创建后选择this windows当前窗口打开项目工程
配置本地maven库
根目录模块下鼠标右键添加api模块
创建模块api模块
添加common通用模块
添加gateway模块
添加pojo模块
添加模块完成后点击项目根目录模块的pom文件可以看到如下
根目录模块的pom文件加入项目名称、项目地址、项目描述
<name>jialiangkj-pet-dev</name>
<url>htttp: gitte、github</url>
<description>佳良宠物商城后台</description>
加入输出为UTF-8编码模式,删除项目创建时多余的内容
<properties><java.version>1.8</java.version><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
加入一些聚合工程描述说明
<!--1. 聚合工程里可以分为顶级项目(顶级工程、父工程)与子工程,这两者的关系其实就是父子继承的关系子工程在maven里称之为模块(module),模块之间是平级,是可以相互依赖的。2. 子模块可以使用顶级工程里所有的资源(依赖),子模块之间如果要使用资源,必须构建依赖(构建关系)3. 一个顶级工程是可以由多个不同的子工程共同组合而成。-->
完成以上步骤后pom文件
4 Spring依赖引入
在根目录下的pom文件加入环境配置,local、dev、prod分别对应本地环境、开发环境、生成环境,这里默认是开发环境,任意在pom文件下添加即可
可用于配置application在不同环境时的启动选择和对应的日志级别(可根据自己需要增加或减少配置环境)
<profiles><profile><id>local</id><properties><!-- 环境标识,需要与配置文件的名称相对应 --><profiles.active>local</profiles.active><logging.level>info</logging.level></properties></profile><profile><id>dev</id><properties><!-- 环境标识,需要与配置文件的名称相对应 --><profiles.active>dev</profiles.active><logging.level>info</logging.level></properties><activation><!-- 默认环境 --><activeByDefault>true</activeByDefault></activation></profile><profile><id>prod</id><properties><profiles.active>prod</profiles.active><logging.level>warn</logging.level></properties></profile></profiles>
添加代码更新依赖后,会看到环境选择
添加springboot、SpringCloud、SpringCloud Alibaba依赖管理,一般在中大型项目中会选择使用做版本依赖管理,具体作用如下
<dependencyManagement>
用于集中管理依赖的版本和其他配置信息,避免在多个模块中重复定义相同的依赖版本。具体作用如下:
- 集中管理依赖版本:在父 POM 中定义依赖版本,子模块直接继承,无需重复定义。
- 提供默认配置:为依赖提供默认的配置信息,如版本、范围、类型等。
- 避免版本冲突:确保整个项目的依赖版本一致,减少潜在的兼容性问题。
这样做的好处是,当需要更新依赖版本时,只需在父 POM 中修改一次,所有子模块都会自动使用新的版本,确保项目各子模块版本依赖一致。
添加版本号变量值,自己的软件版本号此处我写1.0.0,值随意自己用,添加springboot依赖项
<properties><jialiangkj-pet-dev.version>1.0.0</jialiangkj-pet-dev.version><spring-boot.version>2.7.18</spring-boot.version><spring-cloud.version>2021.0.9</spring-cloud.version><spring-cloud-alibaba.version>2021.0.6.1</spring-cloud-alibaba.version><maven-plugins.version>3.6.1</maven-plugins.version><java.version>1.8</java.version><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencyManagement><dependencies><!-- SpringBoot的依赖配置--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!-- SpringCloud 依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- SpringCloud 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></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>${maven-plugins.version}</version><configuration><source>${java.version}</source><target>${java.version}</target><encoding>${project.build.sourceEncoding}</encoding></configuration></plugin></plugins><resources><resource><directory>src/main/resources</directory><!-- 关闭过滤 --><filtering>false</filtering></resource><resource><directory>src/main/resources</directory><!-- 引入所有 匹配文件进行过滤 --><includes><include>application*</include><include>bootstrap*</include><include>banner*</include></includes><!-- 启用过滤 即该资源中的变量将会被过滤器中的值替换 --><filtering>true</filtering></resource></resources>
</build>
以上步骤完成后的效果
各模块的依赖关系如下:
jialiangkj-pet-common
无依赖jialiangkj-pet-pojo
依赖jialiangkj-pet-common
jialiangkj-pet-api
依赖jialiangkj-pet-pojo
jialiangkj-pet-gateway
依赖jialiangkj-pet-pojo
jialiangkj-pet-auth-service
依赖jialiangkj-pet-api
jialiangkj-pet-file-service
依赖jialiangkj-pet-api
在common的pom文件里添加springboot-web的依赖
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>
然后给各模块添加逐级依赖关系,common,按照此依赖关系分别在pom文件里进行添加依赖关系
pojo模块
<dependencies><dependency><groupId>cn.com.jialiangkj</groupId><artifactId>jialiangkj-pet-common</artifactId><version>1.0-SNAPSHOT</version><scope>compile</scope></dependency>
</dependencies>
api模块
<dependencies><dependency><groupId>cn.com.jialiangkj</groupId><artifactId>jialiangkj-pet-pojo</artifactId><version>1.0-SNAPSHOT</version><scope>compile</scope></dependency>
</dependencies>
gateway模块
<dependencies><dependency><groupId>cn.com.jialiangkj</groupId><artifactId>jialiangkj-pet-pojo</artifactId><version>1.0-SNAPSHOT</version><scope>compile</scope></dependency>
</dependencies>
分别添加对应的依赖,记得添加坐标后点一下右上角的maven更新不然会无效,然后点击install安装各模块看是否有构建成功。
基础模块完成没有问题后,下面我们进行服务模块的添加
添加jialiangkj-pet-auth-service和jialiangkj-pet-file-service模块(业务部分根据项目主要自行安排),步骤和上面类似不再演示。
auth-service模块添加依赖
<dependencies><dependency><groupId>cn.com.jialiangkj</groupId><artifactId>jialiangkj-pet-api</artifactId><version>1.0-SNAPSHOT</version><scope>compile</scope></dependency>
</dependencies>
file-service模块添加依赖
<dependencies><dependency><groupId>cn.com.jialiangkj</groupId><artifactId>jialiangkj-pet-api</artifactId><version>1.0-SNAPSHOT</version><scope>compile</scope></dependency>
</dependencies>
最后更新依赖后,安装一下如下图
依赖下载完毕后在auth和file模块新建application.yml、application-local.yml、application-dev.yml、application-prod.yml
auth模块application.yml配置如下
server:port: 8111tomcat:uri-encoding: utf-8max-swallow-size: -1spring:application:name: auth-service
查看auth模块下的依赖,可以看到已经按层级添加成功
在auth模块下添加cn.com.jialiangkj.auth包,在其下添加springboot启动应用
package cn.com.jialiangkj.auth;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class);}
}
新建一个controller包,存放http请求的控制器,在其下新添加一个名为TestController的控制器类
添加如下测试代码
package cn.com.jialiangkj.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/test")
public class TestController {@GetMapping("/hello")public String hello(){return "Hello World!";}
}
在根目录工程点击maven的install安装各模块后,鼠标右键点击运行Application启动应用程序
应用启动成功
打开浏览器输入:localhost:8111/test/hello,可以看到已经正常返回Hello World
按照上述步骤执行操作file模块application.yml、application-local.yml、application-dev.yml、application-prod.yml
file模块application.yml配置如下
server:port: 5001tomcat:uri-encoding: utf-8max-swallow-size: -1spring:application:name: file-service
按上述同样步骤执行完毕后,启动应用如下
由于应用服务名都叫application,所以启动后我们不太好区分,下面给启动应用进行设置改名
进入后点击之前运行的应用修改名字并保存
更改完毕后如果service服务窗口这块是空白的话,那么则进行springboot应用添加
添加完毕后直接在这里启动和关闭应用即可
打开浏览器输入:localhost:5001/test/hello,可以看到已经正常返回Hello World
至此,我们已经完成了基础的微服务maven聚合工程搭建,如果要配合SpringCloud的gateway和SpringCloud Alibaba的nacos注册和配置中心等服务的话引入相关依赖即可,由于篇幅较长,将会在后续单独一篇文章进行引入说明。