[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>
    <build>
        <plugins>
            <!--spring-boot-maven-plugin插件,可以将项目打包成可执行jar包。-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.7.17</version>
            </plugin>
            <!-- 编译插件,配置JDK版本为8 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </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文件如下
<?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>
    
    <!-- 子工程中自动继承父工程的插件。因此插件配置可写可不写 -->
</project>总结 
创建完父工程和子工程后,就可以开始根据业务需求编写代码了。
不同的子工程实现的业务代码不同,因此各个子工程需要导入的依赖也不相同。我们可以将各个子工程中的公共依赖导入到父工程中,通过父工程来管理公共依赖的版本。
另外,各个子工程需要导入的微服务组件也不相同。具体各个微服务组件的使用方式参考其他文章。
