3.Spring Cloud初相識--------Ribbon客戶端負載均衡

来源:https://www.cnblogs.com/TimerHotel/archive/2018/10/24/springcloud_03.html
-Advertisement-
Play Games

前言: 在生產環境中,未避免單點故障,每個微服務都會做高可用部署。 通白的說,就是每一個一模一樣的服務會根據需求提供多分在多台機器上。 那麼在大併發的情況下,如何分配服務可以快速得到響應,就成為了我們要解決的問題。 Ribbon就是一款優秀的客戶端負載均衡機制。 什麼是客戶端負載均衡呢? 就是由服務 ...


前言:

在生產環境中,未避免單點故障,每個微服務都會做高可用部署。

通白的說,就是每一個一模一樣的服務會根據需求提供多分在多台機器上。

那麼在大併發的情況下,如何分配服務可以快速得到響應,就成為了我們要解決的問題。

Ribbon就是一款優秀的客戶端負載均衡機制。

什麼是客戶端負載均衡呢?

就是由服務的消費方來設定負載均衡策略,選擇服務。

就像我們去超市買東西進行結賬時,選擇人少的櫃臺排隊。

我們是消費方,排哪個隊有我們自己決定。

配置測試環境:

1.配置三台服務提供者機器

2.修改埠號分別為:8001,8002,8003

3.修改HelloController返回字元串內容

(1)8001:

package com.xm.cloud.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    
    @GetMapping("/hello")
    public String sayHello() {
        return "Hello Spring Cloud!   001號機器";
    }

}

(2)8002:

package com.xm.cloud.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    
    @GetMapping("/hello")
    public String sayHello() {
        return "Hello Spring Cloud!   002號機器";
    }

}

(3)8003:

package com.xm.cloud.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    
    @GetMapping("/hello")
    public String sayHello() {
        return "Hello Spring Cloud!   003號機器";
    }

}

4.修改消費服務HelloController

package com.xm.cloud.controller;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class HelloController {
    
    @Autowired
    private RestTemplate restTemplate;
    
    @GetMapping("/hello")
    public List<String> sayHello() {
        List<String> list = new ArrayList<>();
        for(int i=0;i<30;i++) {
            list.add(restTemplate.getForObject("http://CL-HELLO-PRODUCER/hello", String.class));
        }
        return list;
    }

}

實踐:

1.測試預設的負載均衡策略(輪詢:RoundRobinRule):

(1)預設cfg:

package com.xm.cloud.cfg;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class MyConfiguration {
    
    @LoadBalanced
    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

(2)測試:localhost:8080/hello

0 "Hello Spring Cloud! 002號機器"
1 "Hello Spring Cloud! 003號機器"
2 "Hello Spring Cloud! 001號機器"
3 "Hello Spring Cloud! 002號機器"
4 "Hello Spring Cloud! 003號機器"
5 "Hello Spring Cloud! 001號機器"
6 "Hello Spring Cloud! 002號機器"
7 "Hello Spring Cloud! 003號機器"
8 "Hello Spring Cloud! 001號機器"
9 "Hello Spring Cloud! 002號機器"
10 "Hello Spring Cloud! 003號機器"
11 "Hello Spring Cloud! 001號機器"
12 "Hello Spring Cloud! 002號機器"
13 "Hello Spring Cloud! 003號機器"
14 "Hello Spring Cloud! 001號機器"
15 "Hello Spring Cloud! 002號機器"
16 "Hello Spring Cloud! 003號機器"
17 "Hello Spring Cloud! 001號機器"
18 "Hello Spring Cloud! 002號機器"
19 "Hello Spring Cloud! 003號機器"
20 "Hello Spring Cloud! 001號機器"
21 "Hello Spring Cloud! 002號機器"
22 "Hello Spring Cloud! 003號機器"
23 "Hello Spring Cloud! 001號機器"
24 "Hello Spring Cloud! 002號機器"
25 "Hello Spring Cloud! 003號機器"
26 "Hello Spring Cloud! 001號機器"
27 "Hello Spring Cloud! 002號機器"
28 "Hello Spring Cloud! 003號機器"
29 "Hello Spring Cloud! 001號機器"

2.測試隨機策略(RandomRule):

(1)修改cfg:

package com.xm.cloud.cfg;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;

@Configuration
public class MyConfiguration {
    
    @LoadBalanced
    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
    
    @Bean
    public IRule myRule() {
        return new RandomRule();
    }

}

(2)測試結果:

0 "Hello Spring Cloud! 002號機器"
1 "Hello Spring Cloud! 003號機器"
2 "Hello Spring Cloud! 003號機器"
3 "Hello Spring Cloud! 002號機器"
4 "Hello Spring Cloud! 003號機器"
5 "Hello Spring Cloud! 001號機器"
6 "Hello Spring Cloud! 001號機器"
7 "Hello Spring Cloud! 002號機器"
8 "Hello Spring Cloud! 002號機器"
9 "Hello Spring Cloud! 002號機器"
10 "Hello Spring Cloud! 001號機器"
11 "Hello Spring Cloud! 003號機器"
12 "Hello Spring Cloud! 002號機器"
13 "Hello Spring Cloud! 003號機器"
14 "Hello Spring Cloud! 003號機器"
15 "Hello Spring Cloud! 002號機器"
16 "Hello Spring Cloud! 001號機器"
17 "Hello Spring Cloud! 001號機器"
18 "Hello Spring Cloud! 002號機器"
19 "Hello Spring Cloud! 003號機器"
20 "Hello Spring Cloud! 001號機器"
21 "Hello Spring Cloud! 003號機器"
22 "Hello Spring Cloud! 002號機器"
23 "Hello Spring Cloud! 002號機器"
24 "Hello Spring Cloud! 003號機器"
25 "Hello Spring Cloud! 002號機器"
26 "Hello Spring Cloud! 001號機器"
27 "Hello Spring Cloud! 001號機器"
28 "Hello Spring Cloud! 002號機器"
29 "Hello Spring Cloud! 001號機器"

3.測試最佳可用策略(最佳可用):

(1)修改cfg:

package com.xm.cloud.cfg;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

import com.netflix.loadbalancer.BestAvailableRule;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;

@Configuration
public class MyConfiguration {
    
    @LoadBalanced
    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
    
    @Bean
    public IRule myRule() {
        return new BestAvailableRule();
    }

}

(2)測試結果:

0 "Hello Spring Cloud! 003號機器"
1 "Hello Spring Cloud! 003號機器"
2 "Hello Spring Cloud! 003號機器"
3 "Hello Spring Cloud! 003號機器"
4 "Hello Spring Cloud! 003號機器"
5 "Hello Spring Cloud! 003號機器"
6 "Hello Spring Cloud! 003號機器"
7 "Hello Spring Cloud! 003號機器"
8 "Hello Spring Cloud! 003號機器"
9 "Hello Spring Cloud! 003號機器"
10 "Hello Spring Cloud! 003號機器"
11 "Hello Spring Cloud! 003號機器"
12 "Hello Spring Cloud! 003號機器"
13 "Hello Spring Cloud! 003號機器"
14 "Hello Spring Cloud! 003號機器"
15 "Hello Spring Cloud! 003號機器"
16 "Hello Spring Cloud! 003號機器"
17 "Hello Spring Cloud! 003號機器"
18 "Hello Spring Cloud! 003號機器"
19 "Hello Spring Cloud! 003號機器"
20 "Hello Spring Cloud! 003號機器"
21 "Hello Spring Cloud! 003號機器"
22 "Hello Spring Cloud! 003號機器"
23 "Hello Spring Cloud! 003號機器"
24 "Hello Spring Cloud! 003號機器"
25 "Hello Spring Cloud! 003號機器"
26 "Hello Spring Cloud! 003號機器"
27 "Hello Spring Cloud! 003號機器"
28 "Hello Spring Cloud! 003號機器"
29 "Hello Spring Cloud! 003號機器"

4.測試重試負載均衡策略(RetryRule)

(1)修改cfg:

package com.xm.cloud.cfg;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

import com.netflix.loadbalancer.BestAvailableRule;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RetryRule;

@Configuration
public class MyConfiguration {
    
    @LoadBalanced
    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
    
    @Bean
    public IRule myRule() {
        return new RetryRule();
    }

}

(2)測試結果:

0 "Hello Spring Cloud! 001號機器"
1 "Hello Spring Cloud! 002號機器"
2 "Hello Spring Cloud! 003號機器"
3 "Hello Spring Cloud! 001號機器"
4 "Hello Spring Cloud! 002號機器"
5 "Hello Spring Cloud! 003號機器"
6 "Hello Spring Cloud! 001號機器"
7 "Hello Spring Cloud! 002號機器"
8 "Hello Spring Cloud! 003號機器"
9 "Hello Spring Cloud! 001號機器"
10 "Hello Spring Cloud! 002號機器"
11 "Hello Spring Cloud! 003號機器"
12 "Hello Spring Cloud! 001號機器"
13 "Hello Spring Cloud! 002號機器"
14 "Hello Spring Cloud! 003號機器"
15 "Hello Spring Cloud! 001號機器"
16 "Hello Spring Cloud! 002號機器"
17 "Hello Spring Cloud! 003號機器"
18 "Hello Spring Cloud! 001號機器"
19 "Hello Spring Cloud! 002號機器"
20 "Hello Spring Cloud! 003號機器"
21 "Hello Spring Cloud! 001號機器"
22 "Hello Spring Cloud! 002號機器"
23 "Hello Spring Cloud! 003號機器"
24 "Hello Spring Cloud! 001號機器"
25 "Hello Spring Cloud! 002號機器"
26 "Hello Spring Cloud! 003號機器"
27 "Hello Spring Cloud! 001號機器"
28 "Hello Spring Cloud! 002號機器"
29 "Hello Spring Cloud! 003號機器"

5.規則比較

策略 介紹
RoundRobinRule 簡單輪詢服務列表來選擇伺服器。它是Ribbon預設的負載均衡規則。
RandomRule 隨機選擇一個可用的伺服器。
RetryRule 預設輪詢,重試多次失敗的機器從輪詢列表中淘汰。
BestAvailableRule 忽略哪些短路的伺服器,並選擇併發數較低的伺服器。
ZoneAvoidanceRule 以區域可用的伺服器為基礎進行伺服器的選擇。使用Zone對伺服器進行分類,這個Zone可以理解為一個機房、一個機架等。
WeightedResponseTimeRule 為每一個伺服器賦予一個權重值。伺服器響應時間越長,這個伺服器的權重就越小。這個規則會隨機選擇伺服器,這個權重值會影響伺服器的選擇。
AvailabilityFilteringRule 該策略繼承自上面介紹的抽象策略PredicateBasedRule,所以它也繼承了“先過濾清單,再輪詢選擇”的基本處理邏輯。

自定義負載均衡策略步驟

1.實現IRule介面

2.cfg註冊覆蓋預設負載均衡策略


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第四篇打算作為系列最後一篇,這裡嘗試談談緩存的一些併發交互場景,包括與資料庫(特指 RDBMS)交互,和一些獨立的高併發場景相關補充處理方案(若涉及具體應用同樣將主要以Redis舉例)。 另見:分散式系統之緩存的微觀應用經驗談(三)(數據分片和集群篇) (https://yq.aliyun.com/... ...
  • 單體架構 一個歸檔包(例如war格式)包含所有功能的應用程式,通常稱為單體應用。 如圖: 儘管該應用已經使用了MVC分層與模塊化,但是由於所有部件最終都打包在一個war包中,該war包包含了整個系統所有的業務功能,這樣的應用系統稱為單體應用。 單體架構的缺陷: 1.複雜度高:隨著代碼的增多,會導致業 ...
  • 設計模式:觀察者模式 當一個對象的狀態發生改變時,依賴他的對象會全部收到通知,並自動更新。 使用場景 一個事件發生後,要執行一連串更新操作。傳統的編程方式,就是在事件的代碼之後直接加入處理邏輯,當更新得邏輯增多之後,代碼會變得難以維護,這種方式是耦合的,侵入式的,增加新的邏輯需要改變事件主題的代碼。 ...
  • 緩存穿透 概念 訪問一個不存在的key,緩存不起作用,請求會穿透到DB,流量大時DB會掛掉。 解決方案 1. 採用布隆過濾器,使用一個足夠大的bitmap,用於存儲可能訪問的key,不存在的key直接被過濾; 2. 訪問key未在DB查詢到值,也將空值寫進緩存,但可以設置較短過期時間。 緩存雪崩 概 ...
  • 下麵總結並演示了 Redis 的 常用管理命令、key 操作、字元串、集合、列表、散列類型的操作命令。 你需要掌握的 Redis 知識 "史上最全 Redis 高可用解決方案總結" "為什麼分散式一定要有Redis?" "Spring Boot Redis Cluster 實戰乾貨" "Spring ...
  • 系統介紹: 1.系統採用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC瀏覽器使用) 2.springmvc +spring4.3.7+ mybaits3.3 SSM 普通java web(非maven, 附贈pom.xml文件) 資料庫:mysql 3.開發工具:my ...
  • GraphQuery " " " " " " " " " " " " GraphQuery is a query language and execution engine tied to any backend service. It is . Project Address: "GraphQue ...
  • Learun FrameWork 強大工作流引擎,讓OA更智能 互聯網的發展促使企業在信息化的道路上不斷探索,而隨著企業信息化進程的不斷深入,OA協同辦公的概念也逐步進入大眾的視野。 OA的選型關乎企業的生存發展,除了需要重視“OA技術、OA品牌、OA產品、OA服務”四大要素之外,更重要的其實是讓O ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...