2021升级版SpringCloud教程从入门到实战精通「H版&alibaba&链路追踪&日志&事务&锁」
教程全目录「含视频」:https://gitee.com/bingqilinpeishenme/Java-Wiki
微服务开发环境准备
SpringCloud版本
相关文档
- SpringCloud官网 https://spring.io/projects/sp...
- H 版本文档 https://docs.spring.io/spring...
- 2020更新情况 https://mp.weixin.qq.com/s/V6...
历史背景
版本号命名规则
关于SpringCloud的分类,根据SpringCloud版本的命名方式的改变可以分为两个阶段:
- 伦敦地铁站名
在Spring Cloud 2020.0.0版本之前,SpringCloud的所有版本均按照伦敦地铁站站名从A-Z的排序进行命名,如下:
image-20210104183006229
image-20210104183201005
为了便于称呼,一般也都称之为A版本,B版本,F版本和H版本。
SR9,每当SpringCloud解决了一个重大bug就会增加SR版本,SR9就意味着在H版本的基础上解决了九个重大bug
日历化版本
从 Spring Cloud 2020.0.0-M1 开始,Spring Cloud 废除了这种英国伦敦地铁站的命名方式,而使用了全新的 "日历化" 版本命名方式。
什么是日历化版本?
英文名称:Calendar Versioning
日历化版本不是基于任意的数字,而是基于项目的发布日期的版本控制约定,随着时间的推移,版本会越来越好。
Spring Cloud 使用了
YYYY.MINOR.MICRO
的命名规则:- YYYY:表示 4 位年份;
- MINOR:代表一个递增的数字,每年以 0 开始递增;
- MICRO:代表版本号后缀,就和之前使用的
.0
类似于.RELEASE
一样,.2
类似于.SR2
。
预发布版本的后缀分隔符也从
.
变更为-
,如:2020.0.0-M1
和2020.0.0-RC2
命名所示。使用日历化版本命名方式,可以更清楚的看出当前版本的年份,看到字母、纯数字方式的版本号都不知道自己多久没升级了。
详细内容见文档:https://spring.io/blog/2020/0...
版本的变化给SpringCloud带来了什么样的改变呢?
SpringCloud的改变目前来说主要体现在对Netflix套件的支持上,早期SpringCloud主要是封装了Netflix套件实现服务注册发现,负载均衡,熔断等功能,但是随着版本的迭代,由于Netflix停止开源项目的更新,所以SpringCloud开始逐步减少对Netflix套件的支持。简单可以分为以下三个时间阶段:
- 早期,SpringCloud完全封装Netflix套件,核心功能均有Netflix组件提供
- 2018年前后,Netflix 公司宣布其核心组件 Hystrix、Ribbon、Zuul 等均进入维护状态。同时Spring Cloud Netflix 项目进入维护模式,并计划在 2020 年废除。
- 北京时间 2020 年 12 月 22 日深夜,
Spring Cloud 2020.0.0
版本正式发布, Netflix 模块的全部移除,并且给出替代组件image-20210105110251943
根据上述变化,简单来说,H版本和2020版本目前属于一个分界线式的版本,从此开始,SpringCloud弃用Netflix套件,进入一个新的时代,但是对于企业开发而言,现在未必需要立马更新最新版本。
一方面大量项目还是采用Netflix组件进行开发,目前来看并没有替换的必要性。另一方面部分技术并不能完全兼容新版本,例如SpringCloud Alibaba就不能完全兼容新版本。
总结
本次教程以H版本为主进行学习,依然采用Netflix组件进行微服务项目开发,同时也会深入学习SpringCloud Alibaba相关组件,并且根据我司项目实际情况,对认证,分布式事务,分布式锁,分布式日志管理等业务场景进行功能实现讲解
在我看来,本教程作为承上启下的作用,对于广泛采用Netflix组件的企业来说,学习本教程可以快速上手进行开发,对于未来的技术趋势也熟稔于心,可以在合适的时候进行项目的技术迭代。下个版本的教程,将会推出SpringCloud 2020版本,删除Netflix组件的同时,更加偏向云原生开发
该教程版本选择
关于SpringCloud版本选择主要考虑的问题就是SpringCloud和SpringBoot的兼容性问题,关于这一点建议严格按照官网文档进行,如下:
image-20210104183430890
版本选择:
- SpringCloud Hoxton.SR9
- SpringBoot 2.3.5.RELEASE
- SpringCloud Alibaba 2.1.2.RELEASE
- Java版本 Java8
项目搭建
父项目创建
- 创建父项目
确认IDEA设置
- Maven设置
image-20210105145601445
- 文件过滤 可以不配置
不显示 .idea 文件夹
image-20210104220128578
- Maven设置
父项目 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.baizhi</groupId> <artifactId>microservices-cloud</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <description>统一依赖版本</description> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <!-- 版本号--> <spring.cloud-version>Hoxton.SR9</spring.cloud-version> <spring.boot-version>2.3.5.RELEASE</spring.boot-version> <spring.cloud.alibaba-version>2.1.2.RELEASE</spring.cloud.alibaba-version> </properties> <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> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
- 设置跳过单元测试
image-20210104220152154
商品服务和订单服务创建
通过Spring Initializr的方式创建项目image-20210105150153594
Spring Initializr SpringBoot项目工程脚手架,可以直接创建出来SpringBoot项目,包含application配置文件和启动类等。https://start.spring.io/
类似的脚手架还要Alibaba的Java工程构建工具:https://start.aliyun.com/boot...
IDEA 整合 Alibaba Java工程脚手架 https://start.aliyun.com/arti...
商品服务创建
- 选择通过Spring Initializr的方式创建项目
- 指定使用Alibaba Java工程脚手架的地址https://start.aliyun.com/
image-20210105150757057
- 选择依赖创建项目
image-20210105150858275
修改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> <artifactId>cloud-product</artifactId> <version>0.0.1-SNAPSHOT</version> <name>cloud-product</name> <description>商品服务</description> <parent> <groupId>com.baizhi</groupId> <artifactId>cloud-demo</artifactId> <version>1.0-SNAPSHOT</version> </parent> <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> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </project>
- 修改父项目pom文件
image-20210105151158978
- 在商品服务中创建测试Controller接口
image-20210105151449881
- 编写application配置文件启动项目
image-20210105151500881
image-20210105151603943
订单服务创建
image-20210105151940677
效果如下:
image-20210105151955432
- 选择通过Spring Initializr的方式创建项目
- 指定使用Alibaba Java工程脚手架的地址
- 选择依赖创建项目
- 修改pom文件,继承父项目
- 在订单服务中创建测试Controller接口
image-20210105152236108
- 编写application配置文件启动项目
image-20210105152313466
RestTemplate
订单服务如何获取商品服务数据
服务调用:订单服务发请求,请求商品服务,获取响应数据
Java代码怎么发http请求?
- HTTPClient Apache
- RestTemplate Spring
参考资料:https://mp.weixin.qq.com/s/3M...
RestTemplate简介和基本使用
Spring中封装的通过Java代码发送RestFul请求(HTTP)的模板类,内置发送get post delete等请求的方法,在SpringBoot中只要导入spring-boot-starter-web的依赖可以直接使用。
导入依赖 spring-boot-starter-web
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
配置RestTemplate
image-20200420112114312
在测试类中使用RestTemplate的APi发送请求
package com.baizhi.cloudorder;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import java.util.HashMap;
import java.util.Map;
@SpringBootTest
class CloudOrderApplicationTests {
@Autowired
private RestTemplate restTemplate;
private String url = "http://localhost:8081/product/getProductById?id=1";
/**
* 发送请求 请求商品服务
*
* 商品服务接口地址:http://localhost:8081/product/getProductById
*/
@Test
void contextLoads() {
/**
* getForObject getForEntity
* 参数1 url
* 参数2 响应数据的类型的类对象
* 参数3 url参数【可以不要 参数可以直接?拼接】
*
* getForObject 返回值是被调用接口的响应数据
* getForEntity 返回值是响应体对象,包含更多的数据:接口响应数据,响应状态码等
*/
String result = restTemplate.getForObject(url, String.class);
System.out.println(result);
ResponseEntity<String> entity = restTemplate.getForEntity(url, String.class);
System.out.println(entity.getStatusCode());
System.out.println(entity.getBody());
}
@Test
void test1() {
// 通过map封装参数
Map map = new HashMap();
map.put("id",1);
String result = restTemplate.getForObject(
"http://localhost:8081/product/getProductById?id={id}",
String.class,
map
);
System.out.println(result);
}
}
最后商品服务通过RestTemplate调用订单服务
如果你觉得这篇内容对你挺有有帮助的话:
- 点赞支持下吧,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-)
- 欢迎在留言区与我分享你的想法,也欢迎你在留言区记录你的思考过程。
- 觉得不错的话,也可以关注 编程鹿 的个人公众号看更多文章和讲解视频(感谢大家的鼓励与支持🌹🌹🌹)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。