Eureka Client內置了Ribbon,用於實現服務節點列表的負載均衡。
SpringCloud的服務調用流程
eg. user-service的某個節點要調用order-service
1、向內置的Ribbon發起調用order-service的負載均衡請求
2、Ribbon查詢緩存中有沒有order-service的節點列表,有就直接使用,沒有就從Eureka Server獲取
3、Ribbon使用指定的負載均衡算法從節點列表中返回一個節點
4、user-service向返回的order-service節點發起調用
Ribbon內置的負載均衡策略(7種)
1、RoundRobinRule 輪詢(默認策略)
輪詢適合節點性能都差不多的情況。從前往後依次輪詢節點列表中的每個節點,誰空閒就調用誰。
2、RetryRule 重試
先輪詢,如果未獲取到節點,則在指定的時間內(默認500ms)重試。
3、RandomRule 隨機
4、BestAvailableRule 最可用,選擇負載最小的節點
5、AvailabilityFilteringRule 可用過濾
先過濾掉處於斷路狀態(斷路器打開)、負載很大的節點,再使用輪詢。
6、ZoneAvoidanceRule 根據大區性能、節點可用性綜合篩選
7、WeightedResponseTimeRule 權重響應時間
根據節點的平均響應時間計算權重,響應快的權重大,被選中的機率就越大。
設置Ribbon的負載均衡策略
eureka client的依賴中已經包含了ribbon的依賴,不用額外添加依賴。
負載均衡策略是在消費者中設置的,有2種方式
方式一、在application.yml中設置
#設置調用order-service的負載均衡策略
order-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
只對指定的服務調用有效
方式二、在引導類中設置
@SpringBootApplication
@EnableEurekaClient
public class UserServiceApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
//設置負載均衡策略
@Bean
public RandomRule getRule(){
return new RandomRule();
}
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
對調用的所有服務都有效
也可以使用自定義的負載均衡策略。