1、Ribbon客戶端負載均衡,maven
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.3.1.RELEASE</version>
</dependency>
2、代碼引入
只需要在RestTemplate的bean上面加入@LoadBalanced註解即可在使用RestTemplate發送HTTP請求時,自動實現負載均衡調用
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
3、負載均衡策略
負載均衡器,需要配置兩樣東西:
1、服務地址列表——誰來參選?
2、選擇策略規則——怎麼選?
第二步,按照服務方的地址端口列表,配置一個Server的List。添加給負載均衡器。
第三步,構造或選擇一個IRule實現類,通過ConfigurationMannager來配置【客戶端名稱】.ribbon.NFLoadBalancerRuleClassName屬性,將配置鍵賦予一個規則類。
這裏我們不操作,使用默認的 RoundRobinRule。
4、負載均衡的兩種配置方法:
一種直接調用ConfigurationManager獲取配置實例,然後設置配置屬性;
public class MyIRule {
@Bean public IRule rule() {
return new RandomRule();
}
}
@EnableDiscoveryClient
// name是服務提供者名,configuration是我們配置的負載均衡策略
@RibbonClient(name="cloud-provider",configuration = MyIRule.class)
public class CloudConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(CloudConsumerApplication.class, args);
}
}
一種是在application.yml中配置。
ribbon配置文件添加:
service-B.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
其中service-B是我註冊到Eureka的serviceID
5、總結:
1)用戶創建RestTemplate
2)添加了ribbon依賴後,會在項目啓動的時候自動往RestTemplate中添加LoadBalancerInterceptor攔截器
3)用戶根據RestTemplate發起請求時,會將請求轉發到LoadBalancerInterceptor去執行,該攔截器會根據指定的負載均衡方式獲取該次請求對應的應用服務端IP、port
4)根據獲取到的IP、port重新封裝請求,發送HTTP請求,返回具體響應
6、負載均衡器LoadBalancerClient
addServers():用於添加一個Server集合。
chooseServer():用於根據key去獲取Server。
markServerDown():用於標記某個服務下線。
getReachableServers():獲取可用的Server集合。
getAllServers():獲取所有的Server集合。
BestAvailableRule:選擇最小請求值。
ClientConfigEnableRoundRobinRule:輪循。
RandomRule:隨機選擇一個server。
RoundRobinRule:輪循選擇server。
RetryRule:根據輪循的方式重試。
WeightedResponseTimeRule:根據響應時間去分配一個weight,weight越低,被選擇的可能性就越低。
ZoneAvoidanceRule:根據server的zone區域和可用性來輪循選擇。