最適合新手入門的SpringCloud教程 6—Ribbon負載均衡「F版本」
阿新 • • 發佈:2020-04-05
![](https://img2020.cnblogs.com/other/1003051/202004/1003051-20200405195932290-1275725452.png)
> SpringCloud版本:Finchley.SR2
> SpringBoot版本:2.0.3.RELEASE
> 原始碼地址:https://gitee.com/bingqilinpeishenme/Java-Tutorials
>
## 前言
寫部落格一個多月了,斷斷續續的更新,今天有小夥伴催更新了,很高興,說明我的分享是有意義的。
![](https://img2020.cnblogs.com/other/1003051/202004/1003051-20200405195932926-1526073255.png)
於是乎,更新來了,還順便給該系列教程改了個名兒《最適合入門的SpringCloud教程》
![](https://img2020.cnblogs.com/other/1003051/202004/1003051-20200405195933285-74183179.png)
通過之前的幾篇文章,在程式碼中會有三個專案,分別是兩個註冊中心和一個客戶端,如下圖:
![](https://img2020.cnblogs.com/other/1003051/202004/1003051-20200405195936152-338715727.png)
今天將會在這個程式碼的基礎上:
1. 將 eureka-client-8803 作為服務提供者
2. 通過IDEA將eureka-client-8803啟動在8803和8804埠上,模擬服務提供者叢集
3. 再建立一個服務消費者eureka-consumer-8805
4. 讓消費者通過服務呼叫和負載均衡呼叫服務提供者的服務。
![](https://img2020.cnblogs.com/other/1003051/202004/1003051-20200405195937343-1706972981.png)
**Tips:需要了解過RestTemplate的使用** [SpringBoot圖文教程17—上手就會 RestTemplate 使用指南「Get Post」「設定請求頭」](https://mp.weixin.qq.com/s/3MfNWtTfckGr2hG9Ly9OPg)
## 服務提供者叢集執行,建立服務消費者
### 服務提供者寫Controller介面
在服務提供者eureka-client-8803中寫入一個TestController類
```
package com.lby.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @author luxiaoyang
* @create 2020-04-02-20:13
*/
@RestController
public class TestController {
/**
* @Value("${server.port}") 讀取application配置檔案中的值
* 賦值到成員變數上
*
* ${server.port} 引數為 application配置檔案中的key
*/
@Value("${server.port}")
private String port;
/**
* @RequestParam 獲取Request引數的 用於RestFul風格中
* @PathVariable 獲取路徑中的引數
*/
@GetMapping("showImgById")
public String showImgById(@RequestParam("id") Integer id){
return "查詢到id為:"+id+"的資訊,使用埠號為:"+port;
}
}
```
### 通過IDEA在8803和8804埠號啟動服務提供者「模擬叢集」
IDEA 中 預設專案啟動是單例的,即一個專案只能夠在一個埠號啟動一次。但是在IDEA 實際上是支援多例項的,一個專案可以通過修改埠號啟動多次。
**以eureka-client-8803為例**
**1.修改eureka-client-8803的IDEA啟動設定**
![](https://img2020.cnblogs.com/other/1003051/202004/1003051-20200405195938525-724199348.png)
![](https://img2020.cnblogs.com/other/1003051/202004/1003051-20200405195939841-449717170.png)
> IDEA的版本不同,還會出現如圖所示的配置
>
![](https://img2020.cnblogs.com/other/1003051/202004/1003051-20200405195940440-705689764.png)
**2.在 8803 埠號啟動專案**
![](https://img2020.cnblogs.com/other/1003051/202004/1003051-20200405195943129-1471400834.png)
![](https://img2020.cnblogs.com/other/1003051/202004/1003051-20200405195945237-828819397.png)
**3.不要關閉 8803 這個服務,然後直接修改yml中的埠號為8804,再次通過啟動類啟動**
![](https://img2020.cnblogs.com/other/1003051/202004/1003051-20200405195948151-555370042.png)
![](https://img2020.cnblogs.com/other/1003051/202004/1003051-20200405195949878-2004389196.png)
**通過以上步驟,就啟動了兩個服務提供者,用來模擬叢集**,效果如下
![](https://img2020.cnblogs.com/other/1003051/202004/1003051-20200405195951246-1740560764.png)
### 建立服務消費者 eureka-consumer-8805
根據之前教程中的步驟,再建立一個客戶端eureka-consumer-8805作為消費者
![](https://img2020.cnblogs.com/other/1003051/202004/1003051-20200405195952232-212965113.png)
**pom配置**
```
```
**application配置檔案**
```
server:
port: 8805
#指定當前服務的名稱 會註冊到註冊中心
spring:
application:
name: eureka-consumer-8805
# 指定 服務註冊中心的地址
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8801/eureka,http://localhost:8800/eureka
```
**啟動類**
```
package com.lby;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @author luxiaoyang
* @create 2020-04-02-20:43
*/
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaConsumer8805 {
public static void main(String[] args) {
SpringApplication.run(EurekaConsumer8805.class,args);
}
}
```
## 服務呼叫和負載均衡
### Ribbon負載均衡
Ribbon是一個基於HTTP和TCP的客戶端負載均衡工具。
Ribbon是Netflix釋出的開源專案,主要功能是提供客戶端的負載均衡演算法。
> 關於Ribbon的簡介,有一個名詞需要進行解釋,客戶端負載均衡?
> 負載均衡是一種非常常見的技術,例如:Nginx,F5。
>
![](https://img2020.cnblogs.com/other/1003051/202004/1003051-20200405195952861-150001132.png)
> 對於Nginx來說,在Nginx中儲存一份服務端的清單,使用者的請求到達Nginx之後,Nginx會根據負載均衡策略從服務清單中選擇一臺伺服器去處理客戶端的請求。
> 服務清單儲存在負載均衡服務中,這就是**服務端負載均衡**。
> 而**客戶端負責均衡**,例如Ribbon,本身是不儲存可用服務清單的,需要服務清單的時候通過服務節點找註冊中心獲取。
### 服務消費者 eureka-consumer-8805 中通過RestTemplate+Ribbon呼叫服務提供者
#### RestTemplate+Ribbon的配置
**1.在服務消費者 eureka-consumer-8805中匯入Ribbon的依賴**
```
```
**2.在啟動類中寫RestTemplate+Ribbon的配置**
![](https://img2020.cnblogs.com/other/1003051/202004/1003051-20200405195954706-887521421.png)
#### 演示Ribbon負載均衡的效果
**1.在消費者中建立介面 通過RestTemplate呼叫服務提供者**
```
package com.lby.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @author luxiaoyang
* @create 2020-04-02-20:49
*/
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
/**
* 呼叫服務提供者
*/
@RequestMapping("/consumer/showConsumer")
public String showConsumer(){
/**
* 通過Ribbon 傳送服務呼叫 用的是RestTemplate
* RestTemplate 本身沒有負載均衡的能力
*
* 注意:RestTemplate請求地址中寫的不是 ip+埠號 而是被呼叫服務的服務名稱
*/
String object = restTemplate.getForObject("http://eureka-client-8803/showImgById?id=1", String.class);
return "查詢到服務提供者的資料,"+object;
}
}
```
> **注意:RestTemplate請求地址中寫的不是 ip+埠號 而是被呼叫服務的服務名稱**
**2.重啟所有的服務,兩個服務提供者,一個服務消費者**
**3.訪問服務消費者的介面**
請求地址:http://localhost:8805/consumer/showConsumer
可以看到每次請求埠號不一樣
![](https://img2020.cnblogs.com/other/1003051/202004/1003051-20200405195955476-521534290.png)
![](https://img2020.cnblogs.com/other/1003051/202004/1003051-20200405195956091-784468831.png)
## 總結
以上就是RestTemplate+Ribbon的負載均衡的基本使用
- RestTemplate負責服務呼叫
- Ribbon實現負載均衡
> 原始碼地址:https://gitee.com/bingqilinpeishenme/Java-Tutorials
**恭喜你完成了本章的學習,為你鼓掌!如果本文對你有幫助,請幫忙點贊,評論,轉發,這對作者很重要,謝謝。**
![](https://img2020.cnblogs.com/other/1003051/202004/1003051-20200405195956701-154236331.png)
要掌握SpringCloud更多的用法,請持續關注本系列教程。
## 求關注,求點贊,