[toc]
Spring Cloud Alibaba笔记-版本2.2.8
介绍
SpringCloud 是什么?
Spring Cloud 本身并不是一个开箱即用的框架,它是一套微服务规范。它集合了一整套解决微服务问题的工具集,从而让用户不需要关心技术整合的问题。
Spring Cloud 共有两代实现。
- Spring Cloud Netflix 是 Spring Cloud 的第一代实现,主要由 Eureka、Ribbon、Feign、Hystrix 等组件组成。
- Spring Cloud Alibaba 是 Spring Cloud 的第二代实现,主要由 Nacos、Sentinel、Seata 等组件组成。
Spring Cloud Alibaba 是什么?
Spring Cloud Alibaba 是阿里巴巴结合自身丰富的微服务实践,在Spring Cloud的基础上推出的微服务开发的一站式解决方案。
它提供了一套简单易用的编程模型,使我们能在 Spring Cloud的基础上轻松地实现微服务系统的构建。
自 Spring Cloud Netflix 进入停更维护后,Spring Cloud Alibaba 逐渐代替它成为主流的微服务框架。
Spring Cloud Alibaba 与 Spring Cloud Netflix 的区别?
它们都是在Spring Cloud的基础上进行了扩展,但是它们在组件上的选择还是比较大的。
| 组件上的区别 | SpringCloud | SpringCloudAlibaba |
|---|---|---|
| 注册中心 | Eureka、Consul | Nacos |
| 配置中心 | SpringCloud Config | Nacos |
| 网关 | SpringCloud Zuul | SpringCloud Gateway |
| 负载均衡 | Ribbon | Loadbalancer |
| 熔断降级 | Hystrix | Sentinel |
| 服务调用 | Feign | OpenFeign |
下图是微服务架构图 
三者依赖版本说明
注意:在使用SpringCloudAlibaba搭建微服务工程的时候,要注意SpringCloudAlibaba,SpringCloud,SpringBoot三者的版本。不要各自使用最新的版本,否则会出现版本不兼容导致的各个问题。
目前三者之间推荐的版本搭配
| Spring Cloud Alibaba Version | Spring Cloud Version | Spring Boot Version |
|---|---|---|
| 2.2.8.RELEASE | Spring Cloud Hoxton.SR12 | 2.3.12.RELEASE |
目前SpringCloudAlibaba 2.2.8 版本中各个微服务组件的版本搭配
| Spring Cloud Alibaba Version | Sentinel Version | Nacos Version | RocketMQ Version | Seata Version |
|---|---|---|---|---|
| 2.2.8.RELEASE | 1.8.4 | 2.1.0 | 4.9.3 | 1.5.1 |
SpringCloudAlibaba 微服务项目的搭建
搭建 SpringCloudAlibaba 微服务项目,该项目采用的架构模式为模块化单体架构。
整个工程采用maven的父子工程的方式进行搭建。并让maven的父子工程形成继承和聚合的关系。具体参考maven笔记。
开发工具使用的是IDEA
创建一个空的maven父工程
① 先创建一个空的maven父工程
由于是空的父工程,可以不使用maven的模板骨架来创建。直接创建一个空的java工程,构建工具选择maven即可。

② 删除父工程中不必要的文件和目录,只保留pom.xml和.gitignore文件

注意事项
- .idea目录是IDEA默认生成的项目配置目录,可忽略。
- .gitignore文件是git版本控制忽略文件,可根据需要自定义。注意需要将.idea目录添加到.gitignore文件中,避免将.idea目录提交到代码远程仓库中。
- pom.xml文件是maven项目的配置文件,需要根据项目需求进行配置。
为什么要让父工程是空的?
父工程的主要作用是为后续的子工程提供Maven依赖的统一管理,起到版本管理器的作用。
例如我们可以通过父工程,让各个子工程的maven依赖的版本都是一样。并且由于我们不需要在父工程中编写代码,因此父工程可以是空的。
③ 修改父工程的pom文件
目前三者之间推荐的版本搭配
| Spring Cloud Alibaba Version | Spring Cloud Version | Spring Boot Version |
|---|---|---|
| 2.2.8.RELEASE | Spring Cloud Hoxton.SR12 | 2.3.12.RELEASE |
修改要点
- 设置父工程的相关信息
- 添加packaging元素,设置父工程的打包方式为pom
- 父工程的dependencies依赖会被子工程继承
- 父工程的dependencyManagement依赖是可选的依赖,子工程可以选择继承或不继承。
- 父工程添加spring-boot-maven-plugin插件来打包整个项目。
完整的父工程pom文件如下
<?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>
<!-- 父工程元数据-->
<groupId>com.shuyx</groupId>
<artifactId>shuyx-admin-services</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 父工程名称和描述 -->
<name>shuyx-admin-services</name>
<description>this is shuyx admin services system</description>
<!--父工程的打包方式设置为pom-->
<packaging>pom</packaging>
<!--父工程 dependencies 依赖,此处配置公共依赖。会被子工程继承。-->
<dependencies>
<!-- 省略 -->
</dependencies>
<!--父工程统一对依赖进行管理,子工程的依赖都用父工程的-->
<!--父工程 dependencyManagement 依赖,此处为可选依赖。子工程可以选择继承或不继承。 -->
<dependencyManagement>
<dependencies>
<!-- Spring Boot 版本 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Cloud 版本 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR12</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Cloud Alibaba 版本 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.8.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 管理插件版本(子模块可直接引用,无需重复写version) -->
<build>
<pluginManagement> <!-- pluginManagement:仅声明版本,不实际执行插件 -->
<plugins>
<!-- 1. 编译插件:指定Java版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>8</source> <!-- 源码版本 -->
<target>8</target> <!-- 编译目标版本 -->
</configuration>
</plugin>
<!-- 2. Spring Boot打包插件(用于可执行模块) -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.12.RELEASE</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>创建子工程
在微服务项目中,一般是根据系统中的服务来拆分出子工程。每个子工程都是一个独立的功能模块,一个独立的服务。
① 在当前父工程下,创建一个模块。这个模块就是子工程。



例如图中的shuyx-user子工程。每个子工程都是一个Spring Boot工程。选择导入基本的Spring Web依赖即可。
注意此处springboot的版本可以随便选,后面修改为与父工程的版本一致即可。
② 删除子工程中不必要的目录文件。例如maven等文件

注意1:子工程只保留src目录和pom文件,其他目录文件都删除。
注意2:由于父工程是一个不具有业务功能的"空"工程(有且仅有一个pom文件,没有源代码文件)。因此无论是空的maven父工程还是空的springboot父工程。都是要删除不必要的文件,保留pom文件的。不必拘泥于什么类型的父工程。
③ 修改父工程的pom文件
给父工程的pom文件新增modules标签,让父子工程形成聚合关系。
<!--父pom文件的modules标签,添加子工程shuyx-user-->
<modules>
<module>shuyx-user</module>
</modules>④ 修改子工程的pom文件,添加父工程的依赖。
修改要点
- 更换parent标签,替换为现在的父工程
- 删除不必要的标签。
- 添加packaging标签:如果子工程需要打出jar包,那么可以设置packaging标签。如果子工程不需要打包,那么可以不添加packaging标签。
modules标签和parent标签
modules标签和parent标签,会让父工程与子工程形成一种继承和聚合的关系。
- maven中的继承关系:会让子工程自动继承父工程的依赖。
- maven中的聚合关系:可以让父工程批量管理子工程。例如对父工程进行编译,则相当于对所有的子工程进行编译。
注意:只有在父子工程都是maven工程的情况下,才会自动添加modules和parent标签。如果不是,则需要手动添加modules和parent标签才行。
⑤ 编写完整的子工程pom文件
完整的子工程pom文件如下
<?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标签,替换为现在的父工程-->
<parent>
<artifactId>shuyx-admin-services</artifactId>
<groupId>com.shuyx</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<!--子工程的相关信息-->
<artifactId>shuyx-user</artifactId>
<version>1.0-SNAPSHOT</version> <!--版本与父工程保持一致,避免版本混乱-->
<name>shuyx-user</name>
<description>shuyx-user</description>
<!--子工程的打包方式-->
<packaging>jar</packaging>
<!--子工程使用的依赖,不用写版本,版本自动继承自父工程的版本-->
<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>
<!-- 子工程中需要主动继承父工程的插件。版本可不写 -->
<!-- 核心:配置Spring Boot打包插件,生成可执行Jar -->
<build>
<plugins>
<!-- 1. 编译插件(继承父工程版本和配置) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
<!-- 2. Spring Boot打包插件(核心) -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!-- 版本继承自父工程 -->
<!-- 关键:绑定repackage目标,将普通Jar转为可执行Jar -->
<executions>
<execution>
<goals>
<goal>repackage</goal> <!-- 重新打包:添加主清单属性和启动类 -->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>⑥ 测试验证
当父子工程的pom文件都按照上面进行配置。此时我们可以在父工程中执行mvn clean install命令,来同时编译和安装所有的子工程。
如图是IDEA的maven窗口,可以快捷执行mvn clean install命令。 
当执行完命令后,会在各个子工程的target目录下生成一个可执行jar包。
总结
创建完父工程和子工程后,就可以开始根据业务需求编写代码了。
不同的子工程实现的业务代码不同,因此各个子工程需要导入的依赖也不相同。我们可以将各个子工程中的公共依赖导入到父工程中,通过父工程来管理公共依赖的版本。
另外,各个子工程需要导入的微服务组件也不相同。具体各个微服务组件的使用方式参考其他文章。
