1. 程式人生 > >SpringCloud入門 - 微服務架構搭建(註冊中心、服務提供者、服務消費者)

SpringCloud入門 - 微服務架構搭建(註冊中心、服務提供者、服務消費者)

前言:以maven多模組化的方法搭建                                                         【專案原始碼我放文章最後了哦~】

一、SpringCloud入門 - 搭建環境

1.建立maven專案: 

2.匯入依賴:  

-   限定springboot和springcloud版本

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <spring-cloud.version>Finchley.SR1</spring-cloud.version>
    <springboot.version>2.0.5.RELEASE</springboot.version>
</properties>
<!--管理springboot和springcloud的版本-->
<dependencyManagement>
    <dependencies>
        <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>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${springboot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

SpringCloud入門 - Eureka註冊中心 

1.建立普通maven專案: 

2.匯入依賴:

<dependencies>
    <!--springboot支援-->
    <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>
    </dependency>

    <!--Eureka服務端支援-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
</dependencies>

3.配置:

4.啟動入庫類:

5.測試:http://127.0.0.1:7001/


二、SpringCloud入門 - 服務提供者

1.公共程式碼   -  domain,query,介面,util ...

2.服務提供者 

3.匯入依賴:

<dependencies>
    <!--公共程式碼依賴-->
    <dependency>
        <groupId>com.zhengqing</groupId>
        <artifactId>User_interface</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

    <!--springboot支援-->
    <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>
    </dependency>

    <!--eureka客戶端支援 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>

4.配置 

5.啟動類 - 入口:

6.編寫業務程式碼:

7.啟動測試:http://127.0.0.1:8001/provider/user/1

重新整理Eureka註冊中心  - 可稱為Eureka的服務端  --> 可看到剛註冊的提供者 

注意事項: 自我保護引發的錯誤 - Eureka自我保護機制導致,不影響使用.

如何顯示ip地址:  -->    客服端實現


三、SpringCloud入門 - 服務消費者-基礎

注意:這裡與註冊中心無關

1.建立一個普通maven專案 

2.匯入依賴:

<dependencies>
    <!--公共程式碼依賴-->
    <dependency>
        <groupId>com.zhengqing</groupId>
        <artifactId>User_interface</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

    <!--springboot支援-->
    <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>
    </dependency>
</dependencies>

3.配置 

4.編寫業務:

5.啟動類:

6.啟動測試: http://127.0.0.1:9001/comsumer/user/1


四、SpringCloud入門加強 - 註冊中心叢集

為什麼需要叢集?   -->   如果只有一個註冊中心伺服器,會存在單點故障所以要叢集

操作: 拷貝一份 

搭建叢集:

1.配置對映hosts

2.配置 :

①EurekaServer_7001中

②EurekaServer_7002中

③User_provider_8001中

3.重新啟動測試:    

7001中可看見7002

7002中可看見7001

8001中測試正常

再回到7001或7002中重新整理,有8001提供者 --> 配置正確!


五、SpringCloud入門加強 - 服務消費者(負載均衡)

為什麼需要負載均衡?

為了提供併發量,有時同一個服務提供者可以部署多個。這個客戶端在呼叫時要根據一定的負責均衡策略完成負載呼叫。

Spring cloud中常見負載均衡實現技術

1. Ribbon
2. Feign

Ribbon負載均衡

       Ribbon是Netflix釋出的雲中間層服務開源專案,主要功能是提供客戶端負載均衡演算法。Ribbon客戶端元件提供一系列完善的配置項,如,連線超時,重試等。簡單的說,Ribbon是一個客戶端負載均衡器,我們可以在配置檔案中列出load Balancer後面所有的機器,Ribbon會自動的幫助你基於某種規則(如簡單輪詢,隨機連線等)去連線這些機器,我們也很容易使用Ribbon實現自定義的負載均衡演算法。

整合原理:

  •             I -> 單服務提供者操作

1.建立普通maven專案:  

2.匯入依賴:

<dependencies>
    <!--公共程式碼依賴-->
    <dependency>
        <groupId>com.zhengqing</groupId>
        <artifactId>User_interface</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

    <!--springboot支援-->
    <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>
    </dependency>

    <!--服務呼叫-->
    <!--eureka客戶端支援 - 服務消費者也要從註冊中心獲取可用服務列表 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>

    <!-- 客服端負載均衡實現-ribbon -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-ribbon</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
</dependencies>

3. 配置 :

4.啟動類:

5.編寫業務程式碼:

  •       I -> 多服務提供者負載高階操作

1.拷貝一份 

2.pom依賴:

<dependencies>
    <!--公共程式碼依賴-->
    <dependency>
        <groupId>com.zhengqing</groupId>
        <artifactId>User_interface</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

    <!--springboot支援-->
    <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>
    </dependency>

    <!--eureka客戶端支援 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>

3.配置: 

4.編寫程式碼:

5.啟動類:

6.測試: - 啟動2個provider: 即和 

啟動consumer測試:http://127.0.0.1:9002/comsumer/user/1重新整理會發現name資料會變化

 

負載均衡策略:

① IRule:通過配置不同IRule的子類,可以選擇不同負載均衡策略,也就是從服務列表以特定策略選擇一個服務來完成呼叫。當然也可以自定義。所以負載均衡策略可以分為內建和自定義。

② 內建負載均衡策略

內建負載均衡規則類

規則描述

RoundRobinRule(預設)

簡單輪詢服務列表來選擇伺服器。它是Ribbon預設的負載均衡規則。

AvailabilityFilteringRule

對以下兩種伺服器進行忽略:

(1)在預設情況下,這臺伺服器如果3次連線失敗,這臺伺服器就會被設定為“短路”狀態。短路狀態將持續30秒,如果再次連線失敗,短路的持續時間就會幾何級地增加。

注意:可以通過修改配置loadbalancer.<clientName>.connectionFailureCountThreshold來修改連線失敗多少次之後被設定為短路狀態。預設是3次。

(2)併發數過高的伺服器。如果一個伺服器的併發連線數過高,配置了AvailabilityFilteringRule規則的客戶端也會將其忽略。併發連線數的上線,可以由客戶端的<clientName>.<clientConfigNameSpace>.ActiveConnectionsLimit屬性進行配置。

 

 

WeightedResponseTimeRule

為每一個伺服器賦予一個權重值。伺服器響應時間越長,這個伺服器的權重就越小。這個規則會隨機選擇伺服器,這個權重值會影響伺服器的選擇。

ZoneAvoidanceRule

以區域可用的伺服器為基礎進行伺服器的選擇。使用Zone對伺服器進行分類,這個Zone可以理解為一個機房、一個機架等。

BestAvailableRule

忽略哪些短路的伺服器,並選擇併發數較低的伺服器。

RandomRule

隨機選擇一個可用的伺服器。

Retry

重試機制的選擇邏輯

測試: 中

Feign負載均衡

注意:從這個開始寫程式碼的時候  之前類和配置檔案 中的USER_PROVIDER都要換成USER-PROVIDER

ex:9002中,8001中需要換一下

   

為什麼呢??         因為要報錯,不允許使用下劃線!!!!!!!!!!!!!!!!!!!!

溫馨小提示:前面的可以發現當我們通過RestTemplate呼叫其它服務的API時,所需要的引數須在請求的URL中進行拼接,如果引數少的話或許我們還可以忍受,一旦有多個引數的話,這時拼接請求字串就會效率低下,並且顯得好傻。

Feign是一個宣告式的Web Service客戶端,它的目的就是讓Web Service呼叫更加簡單。Feign提供了HTTP請求的模板,通過編寫簡單的介面和插入註解,就可以定義好HTTP請求的引數、格式、地址等資訊。而Feign則會完全代理HTTP請求,我們只需要像呼叫方法一樣呼叫它就可以完成服務請求及相關處理。Feign整合了Ribbon和Hystrix(關於Hystrix我們後面再講),可以讓我們不再需要顯式地使用這兩個元件。

總起來說,Feign具有如下特性:
    ①可插拔的註解支援,包括Feign註解和JAX-RS註解;
    ②支援可插拔的HTTP編碼器和解碼器;
    ③支援Hystrix和它的Fallback;
    ④支援Ribbon的負載均衡;
    ⑤支援HTTP請求和響應的壓縮。
這看起來有點像我們springmvc模式的Controller層的RequestMapping對映。這種模式是我們非常喜歡的。Feign是用@FeignClient來對映服務的。

Feign是以介面方式進行呼叫,而不是通過RestTemplate來呼叫,feign底層還是ribbo,它進行了封裝,讓我們呼叫起來更加happy.

操作:

1.建立一個普通maven專案: 

2.匯入依賴:

<dependencies>
    <!--公共程式碼依賴-->
    <dependency>
        <groupId>com.zhengqing</groupId>
        <artifactId>User_interface</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

    <!--springboot支援-->
    <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>
    </dependency>

    <!--服務呼叫-->
    <!--eureka客戶端支援 - 服務消費者也要從註冊中心獲取可用服務列表 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>

    <!-- feign的支援-可不加,因為有存在的 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>

3.配置:

4.編寫程式碼:

①公共程式碼部分:

匯入依賴:

<dependencies>
    <!--springboot支援-->
    <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>
    </dependency>
    <!-- feign的支援-可不加,因為有存在的 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>

程式碼:

注意:要和服務提供者裡面訪問地址和引數等保持一致!

②  程式碼:

5.啟動類:

6.測試:- 啟動註冊中心  - 啟動服務提供者  -啟動服務消費者   http://127.0.0.1:9003/comsumer/user/1

  

我們也可以控制檯列印了...

最後小結: 當對同一個服務部署多個時,就要涉及負載均衡呼叫了  -->  可以選擇Ribbon和Feign    【一般使用Feign 因為通常使用介面類!!】

最後附上專案原始碼:https://pan.baidu.com/s/19KPousRGUHFkn-pDfkjodg