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);
}
}
对调用的所有服务都有效
也可以使用自定义的负载均衡策略。