一、微服务基础
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 |
<dependencyManagement>
<dependencies>
<!--基础依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<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>
其余版本管理
其余版本依赖可以使用一个单独的模块去进行管理
新建子模块
《项目名-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>