当前位置: 首页 > news >正文

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

  1. idea2023.3.8官网地址:idea官网下载
  2. maven3.6:windwos安装多版本Maven(图文详细版)
  3. 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版本

image-20241104110340201

由于SpringBoot3以上系列,最低需要jdk17以上进行支持,但是目前企业里大多数项目还是使用jdk8(成熟稳定运行多年)且生态支持繁荣,所以我们本次示例使用SpringBoot2.X系列最后一个版本2.7.18进行示范。

确定好使用springboot2.7.18版本之后,那么我们查看SpringCloud对应的应该使用哪个版本进行匹配。

点击后滚轮鼠标下滑

image-20241111013729715

我们可以看到SpringBoot2.6.x、2.7.x对应的Cloud版本为2021.0.x

image-20241111013859937

这里我们在点击SpringCloud Alibaba,发现Spring官网并没有跟新版本号,我们需要去Alibaba的github官网查看最新版本号

image-20241111014413446

SpringCloud Alibaba的github官方地址:https://github.com/alibaba/spring-cloud-alibaba

可以知道SpringBoot2.7.x版本对应的 SpringCloud Alibaba版本为2021.x版本

image-20241111014734959


具体版本号和依赖获取

最终具体版本确定可以查看maven官方仓库确认,maven仓库官方地址:https://mvnrepository.com/

1.SpringBoot版本依赖坐标获取

进入maven仓库后搜索:spring boot starter parent

image-20241111015730430

进入后下滑找到2.7.18版本

image-20241111015810764

点击进入后可以获取pom文件依赖坐标

image-20241111015854352

最终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

image-20241111020129802

找到2021.0.x最后更新的小版本

image-20241111020225275

点击进入后可以获取pom文件依赖坐标

image-20241111020253826

最终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

image-20241111015100486

进入后找到2021.0.x最后更新版本的日期小版本进行选择

image-20241111015256612

点击进入后可以获取pom文件依赖坐标

image-20241111015401887

最终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新建工程

image-20241103212156330

根据自己需要填写项目名称,保存路径等

image-20241103212422048

选择已有的jdk,此处选择spring官方推荐使用BellSoft Liberica JDK

image-20241103212549850

点击创建后选择this windows当前窗口打开项目工程

配置本地maven库

image-20241103213352420

根目录模块下鼠标右键添加api模块

image-20241103213605677

创建模块api模块

image-20241103213930132

添加common通用模块

image-20241103225316208

添加gateway模块

image-20241111121718256

添加pojo模块

image-20241103225446068

添加模块完成后点击项目根目录模块的pom文件可以看到如下

image-20241111130308795

根目录模块的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文件

image-20241104011458680

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>

添加代码更新依赖后,会看到环境选择

image-20241111131429006

添加springbootSpringCloudSpringCloud Alibaba依赖管理,一般在中大型项目中会选择使用做版本依赖管理,具体作用如下

<dependencyManagement> 用于集中管理依赖的版本和其他配置信息,避免在多个模块中重复定义相同的依赖版本。具体作用如下:

  1. 集中管理依赖版本:在父 POM 中定义依赖版本,子模块直接继承,无需重复定义。
  2. 提供默认配置:为依赖提供默认的配置信息,如版本、范围、类型等。
  3. 避免版本冲突:确保整个项目的依赖版本一致,减少潜在的兼容性问题。

这样做的好处是,当需要更新依赖版本时,只需在父 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>

以上步骤完成后的效果

image-20241111135246797

各模块的依赖关系如下:

  • 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>

image-20241111175709540

然后给各模块添加逐级依赖关系,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安装各模块看是否有构建成功。

image-20241111180707014

基础模块完成没有问题后,下面我们进行服务模块的添加

添加jialiangkj-pet-auth-service和jialiangkj-pet-file-service模块(业务部分根据项目主要自行安排),步骤和上面类似不再演示。

image-20241111181048876

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>

最后更新依赖后,安装一下如下图

image-20241111202750659

依赖下载完毕后在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模块下的依赖,可以看到已经按层级添加成功

image-20241111203251882

在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);}
}

image-20241111205548167

新建一个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!";}
}

image-20241111211024634

在根目录工程点击maven的install安装各模块后,鼠标右键点击运行Application启动应用程序

image-20241111211139573

应用启动成功

image-20241111211625978

打开浏览器输入:localhost:8111/test/hello,可以看到已经正常返回Hello World

image-20241111211604771

按照上述步骤执行操作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

按上述同样步骤执行完毕后,启动应用如下

image-20241111212214777

由于应用服务名都叫application,所以启动后我们不太好区分,下面给启动应用进行设置改名

image-20241111212333677

进入后点击之前运行的应用修改名字并保存

image-20241111212624663

更改完毕后如果service服务窗口这块是空白的话,那么则进行springboot应用添加

image-20241111213003737

image-20241111213231991

image-20241111213837542

添加完毕后直接在这里启动和关闭应用即可

image-20241111213932579

打开浏览器输入:localhost:5001/test/hello,可以看到已经正常返回Hello World

image-20241111214025553

至此,我们已经完成了基础的微服务maven聚合工程搭建,如果要配合SpringCloud的gateway和SpringCloud Alibaba的nacos注册和配置中心等服务的话引入相关依赖即可,由于篇幅较长,将会在后续单独一篇文章进行引入说明。


http://www.mrgr.cn/news/70670.html

相关文章:

  • vue2 项目中使用echarts 渲染时视图模糊的解决办法
  • idea怎么打开两个窗口,运行两个项目
  • Cmakelist.txt之win-c-udp-client
  • Python 爬虫 (1)基础 | 目标网站
  • 云原生周刊:Kubernetes v1.32 要来了
  • 鸿蒙多线程开发——线程间数据通信对象02
  • 明日周刊-第27期
  • [CUDA] cuda程序编译注意事项
  • 解码潜意识:如何用Python构建梦境分析模型
  • C#入门 020 事件(类型成员)
  • (05/16) - 萨班斯-奥克斯利法案(SOX)--- 详解SOX法案
  • 【uiautomator】自动化测试camera【一】
  • 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同?
  • Scrapy搭配Selenium爬取豆瓣电影250排行榜动态网页数据
  • Linux中线程的基本概念与线程控制
  • 深⼊理解指针(5)[回调函数、qsort相关知识(qsort可用于各种类型变量的排序)】
  • YOLOv11融合CVPR[2020]自校准卷积SCConv模块及相关改进思路|YOLO改进最简教程
  • 前端知识点---字符串的8种拼接方法(Javascript)
  • 边缘检测的100种方法
  • PCL 点云拟合 Ransac拟合空间球体
  • 基于图的去中心化社会推荐过滤器
  • 麒麟服务器工作站SP1 arm环境qt5.6.3源码编译
  • 【大咖云集 | IEEE计算智能学会广州分会支持】第四届信息技术与当代体育国际学术会议(TCS 2024,12月13-15日)
  • 数据库基础(14) . MySQL存储过程
  • 嵌入式学习-C嘎嘎-Day01
  • 基于stm32的智能晾衣杆(开源)