前言:
在生產環境中,未避免單點故障,每個微服務都會做高可用部署。
通白的說,就是每一個一模一樣的服務會根據需求提供多分在多臺機器上。
那麼在大併發的情況下,如何分配服務可以快速得到響應,就成為了我們要解決的問題。
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 ListsayHello() {
Listlist = 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註冊覆蓋默認負載均衡策略
加Java架構師進階交流群獲取Java工程化、高性能及分佈式、高性能、深入淺出。高架構。性能調優、Spring,MyBatis,Netty源碼分析和大數據等多個知識點高級進階乾貨的直播免費學習權限 都是大牛帶飛 讓你少走很多的彎路的 群號是:883922439 對了 小白勿進 最好是有開發經驗
注:加群要求
1、具有工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加。
2、在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加。
3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的,可以加。
4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加。
5.阿里Java高級大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶著大家全面、科學地建立自己的技術體系和技術認知!
閱讀更多 Java開發交流 的文章
關鍵字: 單點故障 客戶端 springframework