2021升級版SpringCloud教程從入門到實戰精通「H版&alibaba&鏈路追蹤&日誌&事務&鎖」html
教程全目錄「含視頻」:https://gitee.com/bingqilinpeishenme/Java-Wikijava
微服務開發環境準備
SpringCloud版本
相關文檔git
- SpringCloud官網 https://spring.io/projects/spring-cloud/
- H 版本文檔 https://docs.spring.io/spring-cloud/docs/Hoxton.SR9/reference/html/
- 2020更新狀況 https://mp.weixin.qq.com/s/V6K6Ehq8xdRwnMbKJWG7_g
歷史背景
版本號命名規則
關於SpringCloud的分類,根據SpringCloud版本的命名方式的改變能夠分爲兩個階段:web
-
倫敦地鐵站名spring
在Spring Cloud 2020.0.0版本以前,SpringCloud的全部版本均按照倫敦地鐵站站名從A-Z的排序進行命名,以下:apache
爲了便於稱呼,通常也都稱之爲A版本,B版本,F版本和H版本。編程
SR9,每當SpringCloud解決了一個重大bug就會增長SR版本,SR9就意味着在H版本的基礎上解決了九個重大bugbootstrap
-
日曆化版本api
從 Spring Cloud 2020.0.0-M1 開始,Spring Cloud 廢除了這種英國倫敦地鐵站的命名方式,而使用了全新的 "日曆化" 版本命名方式。springboot
什麼是日曆化版本?
英文名稱: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/04/17/spring-cloud-2020-0-0-m1-released
版本的變化給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 模塊的所有移除,而且給出替代組件
根據上述變化,簡單來講,H版本和2020版本目前屬於一個分界線式的版本,今後開始,SpringCloud棄用Netflix套件,進入一個新的時代,可是對於企業開發而言,如今未必須要立馬更新最新版本。
一方面大量項目仍是採用Netflix組件進行開發,目前來看並無替換的必要性。另外一方面部分技術並不能徹底兼容新版本,例如SpringCloud Alibaba就不能徹底兼容新版本。
總結
本次教程以H版本爲主進行學習,依然採用Netflix組件進行微服務項目開發,同時也會深刻學習SpringCloud Alibaba相關組件,而且根據我司項目實際狀況,對認證,分佈式事務,分佈式鎖,分佈式日誌管理等業務場景進行功能實現講解
在我看來,本教程做爲承上啓下的做用,對於普遍採用Netflix組件的企業來講,學習本教程能夠快速上手進行開發,對於將來的技術趨勢也熟稔於心,能夠在合適的時候進行項目的技術迭代。
下個版本的教程,將會推出SpringCloud 2020版本,刪除Netflix組件的同時,更加偏向雲原生開發
該教程版本選擇
關於SpringCloud版本選擇主要考慮的問題就是SpringCloud和SpringBoot的兼容性問題,關於這一點建議嚴格按照官網文檔進行,以下:
版本選擇:
- SpringCloud Hoxton.SR9
- SpringBoot 2.3.5.RELEASE
- SpringCloud Alibaba 2.1.2.RELEASE
- Java版本 Java8
項目搭建
父項目建立
-
建立父項目
-
確認IDEA設置
-
Maven設置
-
文件過濾 能夠不配置
不顯示 .idea 文件夾
-
-
父項目 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>
-
設置跳過單元測試
商品服務和訂單服務建立
經過Spring Initializr的方式建立項目
Spring Initializr SpringBoot項目工程腳手架,能夠直接建立出來SpringBoot項目,包含application配置文件和啓動類等。https://start.spring.io/
相似的腳手架還要Alibaba的Java工程構建工具:https://start.aliyun.com/bootstrap.html
IDEA 整合 Alibaba Java工程腳手架 https://start.aliyun.com/article/initializr/springbootideaplugin
商品服務建立
-
選擇經過Spring Initializr的方式建立項目
-
指定使用Alibaba Java工程腳手架的地址https://start.aliyun.com/
-
選擇依賴建立項目
-
修改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文件
-
-
在商品服務中建立測試Controller接口
-
編寫application配置文件啓動項目
訂單服務建立
效果以下:
-
選擇經過Spring Initializr的方式建立項目
-
指定使用Alibaba Java工程腳手架的地址
-
選擇依賴建立項目
-
修改pom文件,繼承父項目
-
在訂單服務中建立測試Controller接口
-
編寫application配置文件啓動項目
RestTemplate
訂單服務如何獲取商品服務數據
服務調用:訂單服務發請求,請求商品服務,獲取響應數據
Java代碼怎麼發http請求?
- HTTPClient Apache
- RestTemplate Spring
參考資料:https://mp.weixin.qq.com/s/3MfNWtTfckGr2hG9Ly9OPg
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
在測試類中使用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調用訂單服務
若是你以爲這篇內容對你挺有有幫助的話:
-
點贊支持下吧,讓更多的人也能看到這篇內容(收藏不點贊,都是耍流氓 -_-)
-
歡迎在留言區與我分享你的想法,也歡迎你在留言區記錄你的思考過程。
-
以爲不錯的話,也能夠關注 編程鹿 的我的公衆號看更多文章和講解視頻(感謝你們的鼓勵與支持🌹🌹🌹)