Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。
负载均衡在系统架构中是一个非常重要,因为负载均衡是对系统的高可用、网络压力的缓解和处理能力扩容的重要手段之一。之前负载均衡都指的是服务端负载均衡,其中分为硬件负载均衡(F5)和软件负载均衡(VS,HAProxy)。微服务框架中的负载均衡是集成服务消费者进程中的。
POM添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
使用注解实现负载均衡
使用代码实现负载均衡
Ribbon的负载均衡策略
RandomRule:随机策略
package com.gf;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
@Configuration
public class RibbonConfiguration {
@Autowired
private SpringClientFactory springClientFactory;
@Bean
public IRule ribbonRule() {
return new RandomRule();
}
}
RoundRobinRule:表示轮询策略。
package com.gf;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RoundRobinRule;
@Configuration
public class RibbonConfiguration {
@Autowired
private SpringClientFactory springClientFactory;
@Bean
public IRule ribbonRule() {
return new RoundRobinRule();
}
}
RetryRule:采用RoundRobinRule的选择机制,进行反复尝试,当花费时间超过设置的阈值maxRetryMills时,就返回null。
package com.gf;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RetryRule;
import com.netflix.loadbalancer.RoundRobinRule;
@Configuration
public class RibbonConfiguration {
@Autowired
private SpringClientFactory springClientFactory;
@Bean
public IRule ribbonRule() {
return new RetryRule();
}
}
WeightedResponseTimeRule:表示加权策略。
package com.gf;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RetryRule;
import com.netflix.loadbalancer.RoundRobinRule;
import com.netflix.loadbalancer.WeightedResponseTimeRule;
@Configuration
public class RibbonConfiguration {
@Autowired
private SpringClientFactory springClientFactory;
@Bean
public IRule ribbonRule() {
return new WeightedResponseTimeRule();
}
}
BestAvailableRule:表示请求数最少策略。
package com.gf;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.netflix.loadbalancer.BestAvailableRule;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RetryRule;
import com.netflix.loadbalancer.RoundRobinRule;
import com.netflix.loadbalancer.WeightedResponseTimeRule;
@Configuration
public class RibbonConfiguration {
@Autowired
private SpringClientFactory springClientFactory;
@Bean
public IRule ribbonRule() {
return new BestAvailableRule();
}
}
PredicateBasedRule:
ClientConfigEnabledRoundRobinRule的子类,基于Predicate实现的策略。通AbstractServerPredicate的chooseRoundRobinAfterFiltering方法进行过滤,获取备选的服务实例清单,然后用线性轮询选择一个实例,是一个抽象类,过滤策略在AbstractServerPredicate的子类中具体实现。
AvailabilityFilteringRule:可用过滤策略,首先过滤出故障的或者并发请求大于阀值的服务列表,然后以线性轮训过滤后的服务列表。
package com.gf;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.netflix.loadbalancer.AvailabilityFilteringRule;
import com.netflix.loadbalancer.BestAvailableRule;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RetryRule;
import com.netflix.loadbalancer.RoundRobinRule;
import com.netflix.loadbalancer.WeightedResponseTimeRule;
@Configuration
public class RibbonConfiguration {
@Autowired
private SpringClientFactory springClientFactory;
@Bean
public IRule ribbonRule() {
return new AvailabilityFilteringRule();
}
}
9.ZoneAvoidanceRule:区域感知策略,首先用主过滤条件对所有服务实例过滤,再用次过滤条件过滤,最后使用轮询方式选择一个服务实例
package com.gf;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.netflix.loadbalancer.AvailabilityFilteringRule;
import com.netflix.loadbalancer.BestAvailableRule;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RetryRule;
import com.netflix.loadbalancer.RoundRobinRule;
import com.netflix.loadbalancer.WeightedResponseTimeRule;
import com.netflix.loadbalancer.ZoneAvoidanceRule;
@Configuration
public class RibbonConfiguration {
@Autowired
private SpringClientFactory springClientFactory;
@Bean
public IRule ribbonRule() {
return new ZoneAvoidanceRule();
}
}