Ribbon
Ribbon是Netflix发布的云中间层服务开源项目,其主要功能是提供客户端实现负载均衡算法。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。Ribbon是一个客户端负载均衡器,可以在配置文件中Load Balancer后面的所有机器,支持轮询,随机等多种算法连接这些机器,同时支持自定义的负载均衡算法。
Ribbon和Nginx的区别
服务器端负载均衡Nginx
nginx是客户端所有请求统一交给nginx,由nginx进行实现负载均衡请求转发,属于服务器端负载均衡。既请求有nginx服务器端进行转发。
客户端负载均衡Ribbon
Ribbon是从eureka注册中心服务器端上获取服务注册信息列表,缓存到本地,然后在本地实现轮训负载均衡策略。
Ribbon客户端实现负载均衡
主要核心三个步骤:
- 服务发现:能够自动发现所依赖服务的列表
- 服务监听:能够监测到失败的服务,并高效地将失败服务从服务列表中移除
- 负载均衡策略:能够决定如何在多个服务实例中选择一个有效的服务实例,并进行相应的服务请求处理
@LoadBalanced原理
当给RestTemplate增加了@LoadBalance注解后,LoadBalancerAutoConfiguration就会对该RestTemplate进行处理,在RestTemplate的拦截器列表中添加一个LoadBalancerInterceptor拦截器,当通过RestTemplate进行请求请求时,LoadBalancerInterceptor中的拦截方法就会启动,通过LoadBalancerClient使请求具有负载聚恒功能。
负载均衡调度器
Ribbon组件IRule
默认的是RoundBobinRule(轮询)
常见的负载均衡策略
RetryRule
先按照RoundRobinRule(轮询)的策略获取服务,如果获取的服务失败侧在指定的时间会进行重试,进行获取可用的服务
如多次获取某个服务失败,不会再次获取该服务
RoundRobinRule:轮询策略,默认策略
RandomRule:随机策略
BestAvailableRule:最大可用策略,即先过滤出故障服务实例后,选择一个当前并发请求数最小的。
WeightedResponseTimeRule:带有加权的轮询策略,对各个服务实例响应时间进行加权处理,然后再采用轮询的方式获取相应的服务实例。
AvailabilityFilteringRule:可用过滤策略,先过滤出有故障的或并发请求大于阈值的一部分服务实例,然后再以线性轮询的方式从过滤后的实例清单中选择一个。
@Configuration
public class ConfigBean //boot -->spring applicationContext.xml --- @Configuration配置 ConfigBean = applicationContext.xml
{
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
@Bean
public IRule myRule(){
//return new RoundRobinRule();
//return new RandomRule();
return new RetryRule(); //在这里选择负载均衡算法
}
}
客户端之间的调用使用RestTemplate,不太方便,常配合Feign一起使用
Feign
Spring Cloud对Feign进行了增强,使得Feign支持Spring MVC注解。
支持注解:
@RequestParanm:绑定单个请求参数值
@PathVariable:绑定URI模板变量值
@RequestHeader:绑定请求头数据
@RequestBody:绑定请求的内容区数据并能进行自动类型转换。
使用注解
@FeignClient