Ribbon的概述
Ribbon是Spring Cloud微服务体系的弹性拓张组件,与其他组件结合可以发挥出强大的作用。此外,它具备了丰富的负载均衡策略,重试机制。支持多协议的异步与响应模型,容错,缓存与批处理等功能可以让你很容易的构建自己的微服务架构.复制代码
Ribbon与负载均衡
负载均衡常见的有软件负载很硬件负载,代表的产品蛋Nginx与F5;Ribbon和他们的区别就是集中式负载均衡与进程内负载均衡的区别。集中式负载均衡是指位于因特网与服务提供者之间,并负责吧网络请求转发到各个提供单位,这个时候Nginx与F5就可以划分为一类了,也可以成为服务端负载均衡策略。进程内负载均衡就是从一个实例库选取一个实例进行流量导入,在微服务的范畴内,实例库一般是存储在Eureka,Consul,Zookeeper,etcd这样的注册中心。复制代码
Ribbon负载均衡策略与自定义配置
ribbon的负载均衡策略主要包括以下几种:
策略类 | 命名 | 描述 |
---|---|---|
RandomRule | 随机策略 | 随机选择server |
RoundRobinRule | 轮询策略 | 按顺序选择server |
RetryRule | 重试策略 | 在一个配置时间段内当选择server不成功,则一直尝试选择一个可用的server |
BestAvailableRule | 最低并发策略 | 逐个考察server,如果server断路器打开,则忽略,在选择其中并发链接最低的server |
AvailabilityFilteringRule | 可用过滤策略 | 过滤掉一直链接失败并标记为circuit tripped的server,过滤掉哪些高并发链接 |
ResponseTimeWeightedRule | 响应时间加权策略 | 根据server的响应时间分配权重。响应时间越长,权重越低,被选择到的概略就越低,权重越高,被选择到的概率就越高。 |
ZoneAvoidanceRule | 区域权衡策略 | 综合判断server所在的区域的性能和server的可用性轮询选择server,并且判定一个AWS Zobe的运行性能是否可用,提出不可用的Zone中所有server。 |
全局策略设置
@Configuration public class MyConfiguration{ @Bean public IRule ribbonRule(){ return new RandomRule(); } }复制代码
基于主机的策略设置
如果我们使用不想针对全局设置,那么可以针对服务源进行特殊的策略配置,可以使用@RibbonClient注解,只需稍微修改上面的代码即可,@RibbonClient注解主要用来对原服务进行约束。
@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); }}复制代码
除了上面的针对服务源使用不同的策略之外,还可以使用@RibbonClients针对多个服务源进行策略的指定。
@RibbonClients(value = { @RibbonClient(name = "ribbon-client",configuration = MyConfiguration.class), @RibbonClient(name = "ribbon-client-b",configuration = MyConfiguration.class)})@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,value = AvoidScan.class)})复制代码
基于配置文件的策略设置
使用SpringBoot的优点是习惯优于配置,大多数的配置都是SpringBoot已经帮助我们配置好的,但是少数的情况下,我们可以通过少量配置文件去自义我们的字定义的配置我们的负载均衡策略,具体的语法如下:
clientname: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadBalancer.RandomRule 复制代码
Ribbon超时与重试
使用HTTP发起请求,免不了要经历极端的环境,此时对调用进行时限控制以及时限之后的重试很重要。 正常情况我们可以使用下面的代码开启ribbon重试的机制,但是F版之后就默认开启了,无需手动配置重试机制的开启,我们要做的就是要做的就是要配置时限。
使用spring.cloud.loadbalancer.retry.enabled: true开启服务重试的机制//ribbon内部的配置类@ConfigurationProperties("spring.cloud.loadbalancer.retry")public class LoadBalancerRetryProperties { private boolean enabled = true; public LoadBalancerRetryProperties() { } public boolean isEnabled() { return this.enabled; } public void setEnabled(boolean enabled) { this.enabled = enabled; }}复制代码
具体的配置可以使用下面的配置
ribbon-client: ribbon: ConnectTimeout: 3000 ReadTimeout: 60000 MaxAutoRetries: 1 #对第一次请求的服务的重试次数 MaxAutoRetriesNextServer: 1 #要重试的下一个服务的最大数量(不包括第一个服务) OkToRetryOnAllOperations: true NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule#复制代码
Ribbon的饥饿加载
Ribbon在进行客户端负载均衡的时候并不是在启动的时候就加载上下文的,实在实际请求的时候才加载,有点像servlet的第一次请求的时候才去生成实例,这回导致第一次请求会比较的缓慢,甚至可能会出现超时的情况。所以我们可以指定具体的客户端名称来开启饥饿加载,即在启动的时候便加载素养的配置项的应用上下文。
ribbon: eager-load: enabled: true clients: ribbon-client-a, ribbon-client-b, ribbon-client-c复制代码