一.基本概念
1.在微服务架构中,Ribbon 是一个客户端负载均衡器,用于控制服务间的通信方式。
2.Ribbon 是一个开源的库,最早由 Netflix 开发,用于实现客户端负载均衡。
3.Ribbon 主要解决的是在微服务架构中,多个服务实例之间进行通信时如何选择合适的服务实例的问题。
但是 Ribbon 已经停止了主动维护。
Netflix 于 2018 年宣布 Ribbon 将不再作为新功能的开发重点,并在后续的版本中减少了对 Ribbon 的支持,官方表示,Ribbon 已经进入维护模式,意味着不会有新的功能更新和重大改动,但会继续提供 bug 修复和安全更新。
二.Ribbon的原理
使用方法:
就是在RestTemplate上添加@LoadBalanced注解,Ribbon就生效了,当在使用RestTemplate进行远程请求的时候,就会使用负载均衡策略。
基本原理:
1.通过拦截器对被注解@LoadBalanced修饰的RestTemplate进行拦截(通过AOP扫描到这个注解注释的RestTemplate,然后获取到这个方法的参数,根据获取到的参数就可以做2、3步的操作);
2.将RestTemplate中调用的服务名,解析成具体的IP地址(这一步需要去注册表查询),由于一个服务名会对应多个地址,那么在选择具体服务地址的时候,需要做负载均衡(比如一个Server有IP1和IP2地址的时候,Ribbon会根据不同的负载均衡算法选出合适的IP地址来进行调用)。
3.确定目标服务的IP和PORT后,通过Httpclient进行http的调用。
三.Ribbon的负载均衡算法
Ribbon的核心组件IRule自带的七种负载均衡算法:
1.轮询:RoundRobinRule;
2.随机:RandomRule;
3.重试:RetryRule(先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内进行重试,获取可用的服务);
4.RoundRobinRule的扩展:WeightedResponseTimeRule(响应速度越快的实例选择权重越多大,越容易被选择);
5.会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务: BestAvailableRule
6.先过滤掉故障实例,再选择并发较小的实例:AvailabilityFilteringRule;
7.复合判断Server所在区域的性能和Server的可用性选择服务器:ZoneAvoidanceRule(默认规则)。
自定义算法步骤(以随机算法):
1.定义配置类:
java
@Configuration
public class MyRibbonRuleConfig {
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
@Bean
public IRule MyRibbonRuleConfig (){
// 定义随机负载均衡算法
return new RandomRule();
}
}
2.主启动类上加上@RibbonClient()注解
java
@SpringBootApplication
@RibbonClient(name = "ORDER-SERVICE",configuration = MyRibbonRuleConfig.class)
public class OrderMain {
public static void main(String[] args) {
SpringApplication.run(OrderMain80.class, args);
}
}
四.推荐的替代方案
对于新的微服务项目,Spring Cloud 团队推荐使用 Spring Cloud LoadBalancer 来替代 Ribbon,Spring Cloud LoadBalancer 提供了比 Ribbon 更加现代化的负载均衡支持,并与 Spring Cloud 生态系统更紧密集成,如果项目中仍然使用 Ribbon,并且无法立即迁移,可以继续使用,但要注意它不再接收新的功能和改进,且可能会逐步淘汰。
1.Spring Cloud LoadBalancer 提供了不同的负载均衡策略,例如:
(1)RoundRobinLoadBalancer:轮询负载均衡;
(2)RandomLoadBalancer:随机负载均衡;
(3)WeightedResponseTimeLoadBalancer:基于响应时间加权的负载均衡策略。
2.配置负载均衡策略:
java
@Configuration
public class LoadBalancerConfig {
@Bean
public LoadBalancer loadBalancer() {
// 可以根据需要选择不同的负载均衡策略
return new RoundRobinLoadBalancer(); // 默认使用 RoundRobin 策略
}
}
也可以通过 Spring 配置文件来选择不同的负载均衡策略:
java
spring:
cloud:
loadbalancer:
ribbon:
enabled: false # 禁用 Ribbon(如果你之前在使用 Ribbon)
启用轮训策略:
java
spring:
cloud:
loadbalancer:
round-robin:
enabled: true # 启用轮询策略
总结:
1.SpringCloud LoadBalancer
是 Spring Cloud 推荐的负载均衡解决方案,逐渐替代了 Ribbon;
2.它更轻量并且与现代的服务发现和微服务架构更加兼容;
3.配置 RestTemplate
或直接使用 LoadBalancerClient
,你可以在代码中实现服务调用时的负载均衡。