在上一篇笔记中,我们搭建了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
@LoadBalanced
public 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;
@Configuration
public class RibbonRandomRuleConfig {
@Bean
public 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
@LoadBalanced
public RestTemplate restTemplate(RestTemplateBuilder builder){
return builder.build();
}
}
2、配置文件方式
在配置文件加上配置即可
#被调用的服务名
stock-service:
ribbon:
#指定负载均衡策略
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
比如订单调用库存stock-service服务,那么配置文件变为下面的样子
server:
port: 8012
spring:
application:
name: order-service
cloud:
nacos:
server-addr: 127.0.0.1:8848
discovery:
username: nacos
password: nacos
namespace: public
#被调用的服务名
stock-service:
ribbon:
#指定负载均衡策略
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
其他什么都不用改!