2021升級版微服務教程—微服務開發環境準備
2021升級版SpringCloud教程從入門到實戰精通「H版&alibaba&鏈路追蹤&日誌&事務&鎖」
教程全目錄「含視訊」:https://gitee.com/bingqilinpeishenme/Java-Wiki
微服務開發環境準備
SpringCloud版本
相關文件
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版本的命名方式的改變可以分為兩個階段:
倫敦地鐵站名
在Spring Cloud 2020.0.0版本之前,SpringCloud的所有版本均按照倫敦地鐵站站名從A-Z的排序進行命名,如下:
為了便於稱呼,一般也都稱之為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/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呼叫訂單服務
如果你覺得這篇內容對你挺有有幫助的話:
點贊支援下吧,讓更多的人也能看到這篇內容(收藏不點贊,都是耍流氓 -_-)
歡迎在留言區與我分享你的想法,也歡迎你在留言區記錄你的思考過程。
覺得不錯的話,也可以關注 程式設計鹿 的個人公眾號看更多文章和講解視訊(感謝大家的鼓勵與支援