什么是负载均衡?
通常来说就是将负载(工作任务,访问请求)进行分摊到多个操作单元(服务,组件)上进行执行。
根据负载均衡发生位置的不同,一般分为服务端负载均衡和客户端负载均衡。
服务端负载均衡指的是发生在服务提供者一方,比如常见的nginx负载均衡
而客户端负载均衡指的是发生在服务请求的一方,也就是在发送请求之前已经选好了由那个实例处理请求。
自己如何实现负载均衡?
之前在学Nacos的时候有提到,Nacos提供DiscoveryClient 客户对象通过该对象可以拿到对应的实例集合,然后可以对集合进行筛选,从而就能实现负载均衡以随机的方式进行,或者其他的负载均衡算法自己去实现自己也可以去实现,但是我们在开发中需要做的是业务而不是写负载均衡算法,Spring Cloud整合了Ribbon,它可以让我们使用一个注解就能轻松的搞定负载均衡。
轻松使用方式
-
在RestTemplate的生成方法上添加@LoadBalanced注解
@Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } **Ribbon支持的负载均衡策略**
-
Ribbon内置多种负载均衡策略,内部负载均衡的顶级接口为com.loadbalancer.IRule,具体的负载策略如下:
策略名 | 策略描述 | 实现说明 |
---|---|---|
BestAvailableRule | 选择一个最小的并发请求的server | 逐个考查Server被tripped了,则忽略,在选择其中ActivityRequestsCount最小的server |
AvailabilityFilteringRule | 过滤那些因为一直连接失败的被标记为circuit tripped的后端服务,并过滤掉那些高并发的后端服务server(active connections 超过配置的阀值) | 使用一个AvailabilityPredicate来包含一个过滤server的逻辑,其实就是检查status里记录的各个server的运行状态 |
WeightedResponseTimeRule | 根据相应时间分配一个weight,相应时间越长weight越小,被选中的可能性越低。 | 一个后台线程定期的从status里读取评价响应时间,为每个server计算一个weight,Weight的计算也比较简单responsetime减去每个server自己平均的responsetime是server的权重,当刚开始运行,没有形成status时,使用roubune策略选择server |
RetryRule | 对选定的负载均衡策略机制上重试机制 | 在一个配置时间段内选择server不成功,则一直尝试使用subRule的方式选择一个可用的server |
RandomRule | 轮询方式选择server | 轮询index,选择index对应的位置是server |
RoundRobinRule | 随机选择一个服务 | 在index上随机,选择index对应的server |
ZoneAvoidanceRule | 复合判断server所在区域的性能和server的可用性选择server | 使用ZoneAvoildancePredicate和AvaulabilityPredicate来判断一个zone的运行性能是否可用,前一个判定zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailbilityPredicate用于过滤掉连接数过多的server。 |
```
- 可以通过修改配置文件来调整Ribbon的负载均衡策略:
server-product: # 调用的提供者服务名称
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
上一篇:Spring Cloud Alibaba 服务治理—Nacos Discovery
下一篇:Spring Cloud Alibaba 基于Feign实现服务调用