提起負載均衡,我們在服務端肯定聽說過nginx負載均衡,但是nginx是針對於服務端的,什麼意思呢?就是服務端的請求按照往常一樣發送,將請求發送給nginx,由nginx參考自己項目的特點,選擇一些算法決定當前的客戶端請求到底由誰處理比較合適,服務端是什麼都不知道的。
但是在Spring Cloud負載均衡中,正好相反,也就是說將調度的任務放在請求發起端,即Rebbon,首先它會從註冊中心裏面拿到所有的註冊信息,然後客戶端請求出來之後,會看看到底有幾個服務能爲這個請求服務,然後再根據一些調度算法進行調用。
一、基礎準備
- eureka註冊中心
- 服務提供者
- 服務消費者
二、添加依賴
其實不用添加依賴,只要在consumer上有eureka依賴即可
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
三、搭建一個簡單的集羣
將provider項目賦值一份即可,賦值的時候refactory項目名,在pom中修改artifactId即可,更重要的是修改端口號。
然後在provider1中寫一些標識:
@RestController
public class UserService {
private Logger logger = LoggerFactory.getLogger(UserService.class);
@PostMapping("/login")
boolean login(@RequestBody UserLoginInfo userLoginInfo){
logger.info("正在爲客戶端提供服務:provider:8071");
return "amdin".equals(userLoginInfo.getUsername()) && "123456".equals(userLoginInfo.getPassword());
}
}
在provider2中的標識:
logger.info("正在爲客戶端提供服務:provider2:8081");
四、測試
在consumer中調用五次login服務,可以看到在provide1r中調用了三次,在provider2中調用了兩次,可以大題看到rebbon默認選擇的是輪詢的方式去進行調度的。
五、調度規則
在netflix的loadbalancer中我們可以看到各種的負載均衡調用的rule,他們其實都是事先了IRule接口
六、使用其他的輪詢規則
如果我們想要使用randomRule而不用輪詢,我們可以在consumer項目中的ylm添加:
#更換負載均衡策略
dm-user-provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
其中,dm-user-provider是我們provider的註冊名,不同的服務註冊的名稱都不相同,(即provider1和provider2的註冊名都是一樣的,只是端口不一樣罷了)。然後指定想要的遵循的調度算法即可。