一、Ribbon简介
在 Spring Cloud 中,Ribbon 是一个基于客户端的负载均衡器,它允许开发者在客户端配置负载均衡策略,而不需要依赖于服务器端的负载均衡器。Ribbon 提供了多种内置的负载均衡策略,可以通过简单的配置来切换和定制。
-
具体策略
策略名称 | 类名 | 描述 | 适用场景 |
---|---|---|---|
轮询(Round Robin) | com.netflix.loadbalancer.RoundRobinRule | 按照顺序轮流选择服务器。 | 适用于服务器性能相近且网络条件稳定的情况。 |
随机(Random) | com.netflix.loadbalancer.RandomRule | 随机选择服务器。 | 适用于对服务器性能要求不高,且希望均匀分配流量的情况。 |
权重轮询(Weighted Response Time) | com.netflix.loadbalancer.WeightResponseTimeRule | 根据服务器的响应时间动态调整权重,响应时间越短的服务器权重越高。 | 适用于服务器性能差异较大,希望根据性能动态分配流量的情况。 |
最少连接数(Least Connections) | com.netflix.loadbalancer.BestAvailableRule | 选择当前活动连接数最少的服务器。 | 适用于处理长时间连接或资源消耗较大的请求,希望减少服务器压力的情况。 |
IP 哈希(IP Hash) | com.netflix.loadbalancer.IPHashRule | 根据请求的 IP 地址进行哈希运算,将请求分配到固定的服务器上。 | 适用于需要保持会话粘性,确保同一用户请求始终分配到同一服务器的情况。 |
可用性过滤器(Availability Filtering) | com.netflix.loadbalancer.AvailabilityFilteringRule | 先过滤掉不可用的服务器,然后在剩下的服务器中选择一个。 | 适用于网络环境不稳定或服务器可能出现故障的情况,确保只选择健康的服务器。 |
区域感知(Zone Awareness) | com.netflix.loadbalancer.ZoneAvoidanceRule | 结合了可用性过滤和区域感知,优先选择同一区域内的服务器。 | 适用于分布式部署的微服务架构,希望减少跨区域调用的延迟和成本。 |
二、调整方式
1.全局调整
在服务消费者的配置类中定义IRule实现
package cn.cds.order.config;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class IRuleConfiguration {
@Bean
public IRule randomRule(){
//根据需要在此配置策略
return new RandomRule();
}
}
参数为1,4和2,3的同种请求被随机到了8081和8082端口
2.配置文件方式(针对某个微服务)
在服务消费者的配置文件(.yml或.properties)中配置策略
userservice: #服务的名称,表示配置是针对名为 userservice 的微服务
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡规则
我们将配置类中的@Bean注释掉,重启服务,可以看到本次依然通过随机策略将2,3,4和1分别随机给了两个端口
三、Ribbon扩展:饥饿加载
我们重启服务在网页发起请求并抓取网络信息,可以看到第一次请求用时348ms是后续请求的数十倍,这其中有一重要原因即Ribbon默认采用懒加载
在进行第一次访问时才会创建LoadBalanceClient,我们可以看到一开始的server stats为空,直到运行才开始拉取并缓存
我们可以通过修改配置文件来将加载策略改为饥饿加载
ribbon:
eager-load:
enabled: true #开启饥饿加载
clients: #指定饥饿加载的服务名称
- userservice
#- xxsservice 多个服务这样写
此时重启服务,直接就进行了userservice的拉取
我们再在浏览器进行请求测试,可以看到请求时长有明显下降,至于为什么还远高于第二次请求,是因为第一次请求除了拉取LoadBalanceClient还要初始化其他内容。
好了,今天的分享到此结束,感谢观看。