在上一篇笔记中,我们搭建了nacos的环境,然后默认负载均衡就是Ribbon的轮询策略,这里大概介绍Ribbon,暂时就不去深究原理啦,只要会用就可以了,环境搭建参考:一、springCloudAlibaba-nacos环境搭建。
1、Ribbon的作用
Ribbon提供了客户端的负载均衡能力,并且提供了多种负载均衡算法,如下
| 策略名 | 策略描述 | 实现说明 |
|---|---|---|
| BestAvailableRule | 选择一个最小的并发请求的server | 逐个考察Server,如果Server被tripped了,则忽略,在选择其中ActiveRequestsCount最小的server |
| AvailabilityFilteringRule | 过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(activeconnections 超过配置的阈值) | 使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个server的运行状态 |
| WeightedResponseTimeRule | 根据相应时间分配一个weight,相应时间越长,weight越小,被选中的可能性越低。 | 一个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。Weight的计算也比较简单responsetime 减去每个server自己平均的responsetime是server的权重。当刚开始运行,没有形成statas时,使用roubine策略选择server。 |
| RetryRule | 对选定的负载均衡策略机上重试机制。 | 在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server |
| RoundRobinRule | 轮询方式轮询选择server | 轮询index,选择index对应位置的server |
| RandomRule | 随机选择一个server | 在index上随机,选择index对应位置的server |
| ZoneAvoidanceRule | 复合判断server所在区域的性能和server的可用性选择server | 使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的Server。 |
Ribbon默认的负载均衡策略是轮询。
2、使用
只需要加上@LoadBalanced注解即可
@Bean@LoadBalancedpublic RestTemplate restTemplate(RestTemplateBuilder builder){return builder.build();}
3、策略修改
1、代码方式
新建一个配置类,注意配置类不能陪在SpringBootApplication注解能扫描得到的目录
package com.suibibk.springCloud.ribbon;import com.netflix.loadbalancer.IRule;import com.netflix.loadbalancer.RandomRule;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class RibbonRandomRuleConfig {@Beanpublic IRule iRule(){return new RandomRule();}}
然后启动类,指定调用哪一个服务用该负载均衡算法
package com.suibibk.springCloud.order;import com.suibibk.springCloud.ribbon.RibbonRandomRuleConfig;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.web.client.RestTemplateBuilder;import org.springframework.cloud.client.loadbalancer.LoadBalanced;import org.springframework.cloud.netflix.ribbon.RibbonClient;import org.springframework.cloud.netflix.ribbon.RibbonClients;import org.springframework.context.annotation.Bean;import org.springframework.web.client.RestTemplate;@SpringBootApplication@RibbonClients(value = {@RibbonClient(name = "stock-service",configuration= RibbonRandomRuleConfig.class)})public class OrderApplication {public static void main( String[] args ) {SpringApplication.run(OrderApplication.class,args);}@Bean@LoadBalancedpublic RestTemplate restTemplate(RestTemplateBuilder builder){return builder.build();}}
2、配置文件方式
在配置文件加上配置即可
#被调用的服务名stock-service:ribbon:#指定负载均衡策略NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
比如订单调用库存stock-service服务,那么配置文件变为下面的样子
server:port: 8012spring:application:name: order-servicecloud:nacos:server-addr: 127.0.0.1:8848discovery:username: nacospassword: nacosnamespace: public#被调用的服务名stock-service:ribbon:#指定负载均衡策略NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
其他什么都不用改!
