Ribbon是Spring Cloud微服务体系的弹性拓张组件,与其余组件结合能够发挥出强大的做用。此外,它具有了丰富的负载均衡策略,重试机制。支持多协议的异步与响应模型,容错,缓存与批处理等功能可让你很容易的构建本身的微服务架构.
复制代码
负载均衡常见的有软件负载很硬件负载,表明的产品蛋Nginx与F5;Ribbon和他们的区别就是集中式负载均衡与进程内负载均衡
的区别。集中式负载均衡是指位于因特网与服务提供者之间,并负责吧网络请求转发到各个提供单位,这个时候Nginx与F5就
能够划分为一类了,也能够成为服务端负载均衡策略。进程内负载均衡就是从一个实例库选取一个实例进行流量导入,在微
服务的范畴内,实例库通常是存储在Eureka,Consul,Zookeeper,etcd这样的注册中心。
复制代码
ribbon的负载均衡策略主要包括如下几种:spring
策略类 | 命名 | 描述 |
---|---|---|
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
复制代码
使用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在进行客户端负载均衡的时候并非在启动的时候就加载上下文的,实在实际请求的时候才加载,有点像servlet的第一次请求的时候才去生成实例,这回致使第一次请求会比较的缓慢,甚至可能会出现超时的状况。因此咱们能够指定具体的客户端名称来开启饥饿加载,即在启动的时候便加载素养的配置项的应用上下文。dom
ribbon:
eager-load:
enabled: true
clients: ribbon-client-a, ribbon-client-b, ribbon-client-c
复制代码