一,负载均衡算法种类
Ribbon的核心组件是IRule,是所有负载均衡算法的父接口,其子类有:
idea快速查看子类或实现类的快捷键:CTRL+ALT+B。
每一个类就是一种负载均衡算法
每一个类就是一种负载均衡算法
RoundRobinRule 轮询
RandomRule 随机
AvailabilityFilteringRule 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,还有并发的连接数超过阈值的服务,然后对剩余的服务列表进行轮询
WeightedResponseTimeRule 权重 根据平均响应时间计算所有服务的权重,响应时间越快服务权重越大被选中的概率越高。刚启动时,如果统计信息不足,则使用轮询策略,等信息足够,切换到 WeightedResponseTimeRule
RetryRule 重试 先按照轮询策略获取服务,如果获取失败则在指定时间内重试,获取可用服务
BestAvailableRule 选过滤掉多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
ZoneAvoidanceRule 符合判断server所在区域的性能和server的可用性选择服务
二,自定义配置负载均衡算法
配置很简单,在自定义配置类里面如下配置即可
@Configuration public class ConfigBeans { @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } /**自定义配置ribbon负载均衡算法 * @return */ @Bean public IRule myRule(){ //return new RoundRobinRule();//轮询 //return new RetryRule();//重试 return new BestAvailableRule(); } }
很具业务需求选择合适的算法即可,当然可以根据具体业务需求自己写一个算法类
三,个性化定制不同微服务策略
如果要自定义Ribbon配置, 则需要把这个配置类放在@SpringBootApplication扫不到的包中(@ComponentScan),因为如果可以扫到自定义的Ribbon配置类的话,那么会对所有的Riboon都生效,也就是说这种情况下所有的微服务的负载均衡算法都是相同的。
3.1 配置类实现负载均衡策略
独立新建包,创建配置类
//独立的包,不在主启动类的包及其子包里 package com.ribbon; import org.springframework.cloud.netflix.ribbon.RibbonClient; import org.springframework.context.annotation.Configuration; import com.baosight.config.MyConfiguration; /** * 使用RibbonClient,为特定name的Ribbon Client自定义配置. * 使用@RibbonClient的configuration属性,指定Ribbon的配置类. */ @Configuration @RibbonClient(name = "springboot-eureka-clent", configuration = MyConfiguration.class) public class ServiceProviderConfig { }
3.2 使用配置文件实现负载均衡策略
创建配置类的方式虽然能够实现个性化定义,但是当有大量这类配置的时候,对各个RibbonClient 的配置信息都将分散在这些配置类中,使得修改和管理都变得非常麻烦。在Camden版本中,Spring Cloud Ribbon对 RibbonClient 的个性化配置做了进一步优化,可以通过.ribbon.=的形式进行配置。配置如下
#注册中心集群 eureka.client.service-url.defaultZone=http://10.25.25.92:8080/eureka/,http://10.25.25.24:8080/eureka/,http://10.25.25.39:8080/eureka/ server.port=8764 spring.application.name=service-ribbon springboot-eureka-clent.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
ribbon配置优先级:Ribbon配置的优先级:属性配置 > JAVA配置>Netflix Ribbon默认配置
四,不依赖eureka实现Ribbon负载均衡
前面实现的负载均衡都是依赖eureka实现的,当然ribbon可以脱离eureka实现负载均衡。配置如下
#取消Ribbon使用Eureka ribbon.eureka.enabled=false #配置Ribbon能访问 的微服务节点,多个节点用逗号隔开 microservice-provider-user.ribbon.listOfServers=localhost:8001,localhost:8002
我这儿整理了比较全面的JAVA相关的面试资料,
需要领取面试资料的同学,请加群:473984645