2021升級版微服務教程—微服務開發環境準備

2021升級版SpringCloud教程從入門到實戰精通「H版&alibaba&鏈路追蹤&日誌&事務&鎖」

教程全目錄「含影片」//gitee.com/bingqilinpeishenme/Java-Wiki

微服務開發環境準備

SpringCloud版本

相關文檔

  • SpringCloud官網 //spring.io/projects/spring-cloud/
  • H 版本文檔 //docs.spring.io/spring-cloud/docs/Hoxton.SR9/reference/html/
  • 2020更新情況 //mp.weixin.qq.com/s/V6K6Ehq8xdRwnMbKJWG7_g

歷史背景

版本號命名規則

關於SpringCloud的分類,根據SpringCloud版本的命名方式的改變可以分為兩個階段:

  1. 倫敦地鐵站名

    在Spring Cloud 2020.0.0版本之前,SpringCloud的所有版本均按照倫敦地鐵站站名從A-Z的排序進行命名,如下:

    image-20210104183006229
    image-20210104183006229
    image-20210104183201005
    image-20210104183201005

    為了便於稱呼,一般也都稱之為A版本,B版本,F版本和H版本。

    SR9,每當SpringCloud解決了一個重大bug就會增加SR版本,SR9就意味著在H版本的基礎上解決了九個重大bug

  2. 日曆化版本

    從 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-M12020.0.0-RC2 命名所示。

    使用日曆化版本命名方式,可以更清楚的看出當前版本的年份,看到字母、純數字方式的版本號都不知道自己多久沒升級了。

    詳細內容見文檔://spring.io/blog/2020/04/17/spring-cloud-2020-0-0-m1-released

版本的變化給SpringCloud帶來了什麼樣的改變呢?

SpringCloud的改變目前來說主要體現在對Netflix套件的支援上,早期SpringCloud主要是封裝了Netflix套件實現服務註冊發現,負載均衡,熔斷等功能,但是隨著版本的迭代,由於Netflix停止開源項目的更新,所以SpringCloud開始逐步減少對Netflix套件的支援。簡單可以分為以下三個時間階段:

  1. 早期,SpringCloud完全封裝Netflix套件,核心功能均有Netflix組件提供

  2. 2018年前後,Netflix 公司宣布其核心組件 Hystrix、Ribbon、Zuul 等均進入維護狀態。同時Spring Cloud Netflix 項目進入維護模式,並計劃在 2020 年廢除。

  3. 北京時間 2020 年 12 月 22 日深夜,Spring Cloud 2020.0.0 版本正式發布, Netflix 模組的全部移除,並且給出替代組件

    image-20210105110251943
    image-20210105110251943

根據上述變化,簡單來說,H版本和2020版本目前屬於一個分界線式的版本,從此開始,SpringCloud棄用Netflix套件,進入一個新的時代,但是對於企業開發而言,現在未必需要立馬更新最新版本。

一方面大量項目還是採用Netflix組件進行開發,目前來看並沒有替換的必要性。另一方面部分技術並不能完全兼容新版本,例如SpringCloud Alibaba就不能完全兼容新版本。

總結

本次教程以H版本為主進行學習,依然採用Netflix組件進行微服務項目開發,同時也會深入學習SpringCloud Alibaba相關組件,並且根據我司項目實際情況,對認證,分散式事務,分散式鎖,分散式日誌管理等業務場景進行功能實現講解

在我看來,本教程作為承上啟下的作用,對於廣泛採用Netflix組件的企業來說,學習本教程可以快速上手進行開發,對於未來的技術趨勢也熟稔於心,可以在合適的時候進行項目的技術迭代。

下個版本的教程,將會推出SpringCloud 2020版本,刪除Netflix組件的同時,更加偏向雲原生開發

該教程版本選擇

關於SpringCloud版本選擇主要考慮的問題就是SpringCloud和SpringBoot的兼容性問題,關於這一點建議嚴格按照官網文檔進行,如下:

image-20210104183430890
image-20210104183430890

版本選擇:

  • SpringCloud Hoxton.SR9
  • SpringBoot 2.3.5.RELEASE
  • SpringCloud Alibaba 2.1.2.RELEASE
  • Java版本 Java8

項目搭建

父項目創建

  1. 創建父項目

  2. 確認IDEA設置

    1. Maven設置

      image-20210105145601445
      image-20210105145601445
    2. 文件過濾 可以不配置

      不顯示 .idea 文件夾

      image-20210104220128578
      image-20210104220128578
  3. 父項目 pom文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="//maven.apache.org/POM/4.0.0"
             xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //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>
  4. 設置跳過單元測試

    image-20210104220152154
    image-20210104220152154

商品服務和訂單服務創建

通過Spring Initializr的方式創建項目

image-20210105150153594
image-20210105150153594

Spring Initializr SpringBoot項目工程腳手架,可以直接創建出來SpringBoot項目,包含application配置文件和啟動類等。//start.spring.io/

類似的腳手架還要Alibaba的Java工程構建工具://start.aliyun.com/bootstrap.html

IDEA 整合 Alibaba Java工程腳手架 //start.aliyun.com/article/initializr/springbootideaplugin

商品服務創建

  1. 選擇通過Spring Initializr的方式創建項目

  2. 指定使用Alibaba Java工程腳手架的地址//start.aliyun.com/

    image-20210105150757057
    image-20210105150757057
  3. 選擇依賴創建項目

    image-20210105150858275
    image-20210105150858275
  4. 修改pom文件,繼承父項目

    1. 修改商品服務的pom文件,如下

      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="//maven.apache.org/POM/4.0.0" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //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>

    2. 修改父項目pom文件

      image-20210105151158978
      image-20210105151158978
  5. 在商品服務中創建測試Controller介面

    image-20210105151449881
    image-20210105151449881
  6. 編寫application配置文件啟動項目

    image-20210105151500881
    image-20210105151500881
    image-20210105151603943
    image-20210105151603943

訂單服務創建

image-20210105151940677
image-20210105151940677

效果如下:

image-20210105151955432
image-20210105151955432
  1. 選擇通過Spring Initializr的方式創建項目

  2. 指定使用Alibaba Java工程腳手架的地址

  3. 選擇依賴創建項目

  4. 修改pom文件,繼承父項目

  5. 在訂單服務中創建測試Controller介面

    image-20210105152236108
    image-20210105152236108
  6. 編寫application配置文件啟動項目

    image-20210105152313466
    image-20210105152313466

RestTemplate

訂單服務如何獲取商品服務數據

服務調用:訂單服務發請求,請求商品服務,獲取響應數據

Java程式碼怎麼發http請求?

  • HTTPClient Apache
  • RestTemplate Spring

參考資料://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

image-20200420112114312
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 = "//localhost:8081/product/getProductById?id=1";
    /**
     * 發送請求 請求商品服務
     *
     * 商品服務介面地址://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(
                "//localhost:8081/product/getProductById?id={id}",
                String.class,
                map
        )
;

        System.out.println(result);


    }

}

最後商品服務通過RestTemplate調用訂單服務

如果你覺得這篇內容對你挺有有幫助的話:

  1. 點贊支援下吧,讓更多的人也能看到這篇內容(收藏不點贊,都是耍流氓 -_-)

  2. 歡迎在留言區與我分享你的想法,也歡迎你在留言區記錄你的思考過程。

  3. 覺得不錯的話,也可以關注 編程鹿 的個人公眾號看更多文章和講解影片(感謝大家的鼓勵與支援🌹🌹🌹)