使用SpringCloud實現Java分散式開發【part-2】:Ribbon負載均衡的介紹及使用方式

2020-09-22 15:01:48

SpringCloud簡介

Spring Cloud是Spring旗下的專案之一
Spring Cloud並不是一個元件 而是許多元件的集合
其將當下非常流行的一些技術整合到了一起 實現了多個分散式開發中的重要功能
協調了分散式環境中各個系統 並且為各類服務提供模板性的設定

其主要涉及的元件包括:

  • Eureka:註冊中心
  • Zuul或Spring Cloud Gateway:服務閘道器
  • Ribbon:負載均衡
  • Feign:服務呼叫
  • Hystrix或Resilience4j:熔斷器

【在本篇中 將介紹Ribbon負載均衡】

Ribbon負載均衡

負載均衡 顧名思義 就是讓服務的負載更加均衡的…(廢話)

在實際環境中往往會開啟很多個伺服器端的叢集 此時獲取的服務列表中就會有多個
此時 到底該存取哪一個 一般在這種情況下就需要編寫負載均衡演演算法 在多個範例列表中選擇最優的
Eureka中已經整合了負載均衡元件Ribbon 只需簡單修改程式碼即可使用

Ribbon是一個負載均衡器 有助於控制HTTP和TCP使用者端的行為
為Ribbon設定服務提供者列表後 Ribbon可基於某種負載均衡演演算法 自動地幫助服務消費者去進行請求

Ribbon預設提供了很多的負載均衡演演算法 例如輪詢演演算法 隨機演演算法 等等
輪詢演演算法即為輪著進行 例如共有AB兩個服務提供者 那麼第一次存取A服務提供者 則第二次必定存取B服務提供者 第三次存取A服務提供者 以此類推
隨機演演算法顧名思義 是隨機的
當然 也可為Ribbon實現自定義的負載均衡演演算法

Ribbon預設使用輪詢演演算法

在匯入Eureka使用者端的依賴包的時候同時也自動匯入了Ribbon的相關包:
在這裡插入圖片描述

一、負載均衡的過程:

在執行RestTemplate傳送地址請求的時候 會使用Ribbon負載均衡器進行攔截 然後根據服務名獲取服務地址列表
再使用Ribbon的負載均衡演演算法從服務地址列表中選擇一個服務地址 最後 存取該服務地址 獲取資料

二、使用步驟:

為服務消費者的啟動類中的RestTemplate範例化方法新增@LoadBalanced註解以開啟使用者端負載均衡功能:

// 註冊RestTemplate
@Bean
@LoadBalanced
public RestTemplate restTemplate()
{
    return new RestTemplate();
}

使用步驟很簡單
在服務消費者的介面類中 直接使用服務名來進行負載均衡即可:

@RestController
@RequestMapping("/consumer")
public class ConsumerController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/{id}")
    public User queryById(@PathVariable Long id)
    {
        // Ribbon負載均衡
        String url="http://user-service/user/"+id;

        return restTemplate.getForObject(url,User.class);
    }
}