一、微服务基础

1.什么是SpringCloud?

SpringCloud官网:https://spring.io/projects/spring-cloud

个人理解:
以前的服务器就好像,一个会语数外全能的老师,为学生提供服务,这个老师生病了,那全校停课。现在微服务流行后,学校有了数学教研组,语文教研组,外语教研组,每个教研组有一群老师具体负责某科的教学,缺了谁,学校都照样运转。
而这个变化中,那些改变历史的程序员就是把一个服务器中的众多服务,或好几台服务器中的众多服务,分类出来,解耦合出来,把他们类似的功能交给同一个集群来做,把互相耦合在一起的功能剥离出来,按业务,按功能来把他们作为一个个微服务放在服务器上,而这个服务器就只提供一个服务,或较少的服务。让一个超大的服务逻辑,解耦合为一个个小服务,均匀的分布在各自的服务器中。微服务就微在这。
每个教研组就是一个微服务集群。他们提供同样的服务
注册中心Eureka/Nacos:就是这个存放这个教研组老师名单的地方,学生们要先访问这个注册中心获取教师名单,然后根据相应的负载方法去访问各自老师。不至于让集群中某一老师累死也不至于让某一老师闲死。
Zuul/Gateway网关:就是学校的门卫,某些学生来学校找谁,它负责指引(路由),并且通过一些非常简单的配置,达到阻拦一些人进入(身份验证),或者控制想学数学的人只能去数学教研组,不能去核能教研组学怎么造原子弹(权限验证)。
Hystrix/Sentinel熔断器:可以把它当成学校的志愿者,当一个教研组集体罢课后,学生找不到老师了,这些志愿者及时的告诉来访问的学生,相应的结果,异常信息等,免得大量的学生在学校等待,这些志愿者赶快把这些等待的学生梳理出去,学生一直在学校等待,那其他需要学生的学校,也会等待学生,最后造成大面积的学校瘫痪。这里学生我们看成一个个请求。熔断器就是把某事故的蔓延及时熔断了。

那SpringCloud就可以看成是这个学校了。众多上面提到的组件相当于都是这个学校的各职能部门。

二、Spring Cloud Alibaba环境搭建

基于Maven+JDK8+ IDEA搭建。
其版本和Spring Cloud版本有着严格要求对照
相关的版本依赖具体参考:https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E

配置pom文件

注意SpringCloudAlibaba 体系有着严格的版本对应要求

推荐使用最新版本依赖
[20220628]

Spring Cloud Alibaba Version Spring Cloud Version Spring Boot Version
2021.0.1.0 Spring Cloud 2021.0.1 2.6.3
  1. <dependencyManagement>
  2. <dependencies>
  3. <!--基础依赖-->
  4. <dependency>
  5. <groupId>org.springframework.boot</groupId>
  6. <artifactId>spring-boot-dependencies</artifactId>
  7. <version>${spring-boot.version}</version>
  8. <type>pom</type>
  9. <scope>import</scope>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.cloud</groupId>
  13. <artifactId>spring-cloud-dependencies</artifactId>
  14. <version>${spring-cloud.version}</version>
  15. <type>pom</type>
  16. <scope>import</scope>
  17. </dependency>
  18. <dependency>
  19. <groupId>com.alibaba.cloud</groupId>
  20. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  21. <version>${spring-cloud-alibaba.version}</version>
  22. <type>pom</type>
  23. <scope>import</scope>
  24. </dependency>
  25. </dependencies>
  26. </dependencyManagement>

其余版本管理

其余版本依赖可以使用一个单独的模块去进行管理
新建子模块
《项目名-bom》
例如:cloud-bom
只保留一个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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zukxu</groupId>
    <artifactId>cloud-bom</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>

    <name>cloud-bom</name>
    <description>cloud dependencies manager</description>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <cloud-project.version>${project.version}</cloud-project.version>
        <spring-boot.version>2.6.5</spring-boot.version>
        <spring-oauth.version>2.6.3</spring-oauth.version>
        <knife4j.version>3.0.3</knife4j.version>
        <fastjson2.version>2.0.7</fastjson2.version>
        <mybatis-plus.version>3.5.2</mybatis-plus.version>
        <pagehelper.version>1.4.3</pagehelper.version>
        <log4j2.version>2.17.2</log4j2.version>
        <excel.version>1.1.1</excel.version>
        <sms.version>2.0.2</sms.version>
        <hutool.version>5.8.3</hutool.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!--各模块依赖-->
            <dependency>
                <groupId>com.zukxu</groupId>
                <artifactId>cloud-auth</artifactId>
                <version>${cloud-project.version}</version>
            </dependency>
            <dependency>
                <groupId>com.zukxu</groupId>
                <artifactId>cloud-common-core</artifactId>
                <version>${cloud-project.version}</version>
            </dependency>
            <dependency>
                <groupId>com.zukxu</groupId>
                <artifactId>cloud-common-datasource</artifactId>
                <version>${cloud-project.version}</version>
            </dependency>
            <dependency>
                <groupId>com.zukxu</groupId>
                <artifactId>cloud-common-feign</artifactId>
                <version>${cloud-project.version}</version>
            </dependency>
            <dependency>
                <groupId>com.zukxu</groupId>
                <artifactId>cloud-common-knife4j</artifactId>
                <version>${cloud-project.version}</version>
            </dependency>
            <dependency>
                <groupId>com.zukxu</groupId>
                <artifactId>cloud-common-log</artifactId>
                <version>${cloud-project.version}</version>
            </dependency>
            <dependency>
                <groupId>com.zukxu</groupId>
                <artifactId>cloud-common-mybatis</artifactId>
                <version>${cloud-project.version}</version>
            </dependency>
            <dependency>
                <groupId>com.zukxu</groupId>
                <artifactId>cloud-common-security</artifactId>
                <version>${cloud-project.version}</version>
            </dependency>
            <dependency>
                <groupId>com.zukxu</groupId>
                <artifactId>cloud-gateway</artifactId>
                <version>${cloud-project.version}</version>
            </dependency>
            <dependency>
                <groupId>com.zukxu</groupId>
                <artifactId>cloud-register</artifactId>
                <version>${cloud-project.version}</version>
            </dependency>
            <dependency>
                <groupId>com.zukxu</groupId>
                <artifactId>cloud-flowable</artifactId>
                <version>${cloud-project.version}</version>
            </dependency>
            <dependency>
                <groupId>com.zukxu</groupId>
                <artifactId>cloud-admin</artifactId>
                <version>${cloud-project.version}</version>
            </dependency>
            <!--开发依赖-->
            <dependency>
                <groupId>com.github.xiaoymin</groupId>
                <artifactId>knife4j-spring-boot-starter</artifactId>
                <version>${knife4j.version}</version>
            </dependency>
            <dependency>
                <groupId>com.github.xiaoymin</groupId>
                <artifactId>knife4j-micro-spring-boot-starter</artifactId>
                <version>${knife4j.version}</version>
            </dependency>
            <dependency>
                <groupId>com.github.xiaoymin</groupId>
                <artifactId>knife4j-annotations</artifactId>
                <version>${knife4j.version}</version>
            </dependency>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatis-plus.version}</version>
            </dependency>
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper-spring-boot-starter</artifactId>
                <version>${pagehelper.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.mybatis.spring.boot</groupId>
                        <artifactId>mybatis-spring-boot-starter</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.springframework.security.oauth.boot</groupId>
                <artifactId>spring-security-oauth2-autoconfigure</artifactId>
                <version>${spring-oauth.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>${spring-boot.version}</version>
            </dependency>
            <!-- excel 导入导出 -->
            <dependency>
                <groupId>com.pig4cloud.excel</groupId>
                <artifactId>excel-spring-boot-starter</artifactId>
                <version>${excel.version}</version>
            </dependency>
            <!--  阿里云短信下发 -->
            <dependency>
                <groupId>io.springboot.sms</groupId>
                <artifactId>aliyun-sms-spring-boot-starter</artifactId>
                <version>${sms.version}</version>
            </dependency>
            <!--指定log4j版本-->
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-to-slf4j</artifactId>
                <version>${log4j2.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-bom</artifactId>
                <version>${log4j2.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--hutool start=============================================-->
            <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-core</artifactId>
                <version>${hutool.version}</version>
            </dependency>
            <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-extra</artifactId>
                <version>${hutool.version}</version>
            </dependency>
            <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-http</artifactId>
                <version>${hutool.version}</version>
            </dependency>
            <!--hutool end=============================================-->
            <dependency>
                <groupId>com.alibaba.fastjson2</groupId>
                <artifactId>fastjson2</artifactId>
                <version>${fastjson2.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

然后在父pom中进行引入依赖

        <!--子模块依赖全部从cloud-bom中加载-->
            <dependency>
                <groupId>com.zukxu</groupId>
                <artifactId>cloud-bom</artifactId>
                <version>${cloud-project.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>