是什么?在哪里用?
是netflix发布,提供客户端的软件负载均衡算法和服务调用。
和NGINX不同,NGINX是服务端负载均衡,请求到达NGINX之后,NGINX实现转发。
原理?
在调用微服务接口时候,会在注册中心获取注册列表,缓存到jvm本地,从而在本地实现RPC远程服务调用技术。比如消费者负载均衡,去调用生产者的所有微服务。
执行步骤:1.优先选择在同一个区域内负载较少的server2.根据用户的策略,在注册列表中选择一个地址。
总共的策略,以及每个策略的意思?
策略名 | 策略声明 | 策略描述 | 实现说明 |
RandomRule | public class RandomRule extends AbstractLoadBalancerRule | 随机选择一个server | 在index上随机,选择index对应位置的server |
RoundRobinRule | public class RoundRobinRule extends AbstractLoadBalancerRule | roundRobin方式轮询选择server | 轮询index,选择index对应位置的server |
RetryRule | public class RetryRule extends AbstractLoadBalancerRule | 对选定的负载均衡策略机上重试机制。 | 在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server |
WeightedResponseTimeRule | public class WeightedResponseTimeRule extends RoundRobinRule | 根据响应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低。 | 一个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。Weight的计算也比较简单responsetime 减去每个server自己平均的responsetime是server的权重。当刚开始运行,没有形成status时,使用roubine策略选择server。 |
BestAvailableRule | public class BestAvailableRule extends ClientConfigEnabledRoundRobinRule | 选择一个最小的并发请求的server | 选择一个最小的并发请求的server 逐个考察Server,如果Server被tripped了,则忽略,在选择其中ActiveRequestsCount最小的server |
AvailabilityFilteringRule | public class AvailabilityFilteringRule extends PredicateBasedRule | 过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值) | 使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个server的运行状态 |
ZoneAvoidanceRule | public class ZoneAvoidanceRule extends PredicateBasedRule | 默认规则,复合判断server所在区域的性能和server的可用性选择server | 使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的Server。 |
怎么使用?
需要注意的点。
pom文件:和eureka-client包含了ribbon的包。
配置文件:
主启动类:@EnableEurekaClient
业务类:在调用生产者的路径的方法或者类上用@loadbalanced
------------------------------------------------------------------负载规则替换
方式 1.在@ComponetScan(一般指的是main函数当中的@SpringbootApplication中包含了扫描)所扫描的当前包外,写一个类,
@Configuration
MyRule{
@Bean
MyRule(){}
}
2.主启动类
加@RibbonClient(name="对应服务名",configuration="MyselfRule.class")
方式2
@Configuration
@AvoidScan
public class MyConfiguration{
@Bean
public IRule ribbonRule(){
return new RandomRule();
}
}
/*在启动类里面加上如下的注解即可完成针对具体的服务源使用不同的负载均衡策略,使用@AvoidScan注解告诉Spring容器不要去扫描该注解,具体的服务源是使用特定的配置指定特定负载均衡的策略。*/
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@RibbonClient(name = "ribbon-client",configuration = MyConfiguration.class)
@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,value = AvoidScan.class)})
public class RibbonBalancerApplication {
//定义一个负载均衡的RestTemplate
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(RibbonBalancerApplication.class,args);
}
}
//复制代码