这是我参与更文挑战的第18天,活动详情查看: 更文挑战
在一个夜黑风高的晚上,小编正襟危坐,带着紧张的情绪,用那双颤抖的双手,缓缓地,慢慢的揭开了一层神秘的面纱————什么是Ribbon?
什么是Ribbon?
Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。
Ribbon的作用?
Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等,主要负责请求分发。
Ribbon的使用?
在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随即连接等)去连接这些机器。
Ribbon的调用过程?
@LoadBalanced原理
Ribbon通过一个@LoadBalanced注解就实现了RestTemplate请求的负载均衡 ClientHttpRequestInterceptor会对RestTemplate在发送的请求进行拦截 RestTemplate中有一个属性是List interceptors,LoadBalancerInterceptor是ClientHttpRequestInterceptor的实现类
作用
它的作用就是用于RestTemplate的负载均衡,LoadBalancerInterceptor将负载均衡的核心逻辑交给了loadBalancer,以下代码虽然使用的@LoadBalanced来实现负载均衡,
注意
@LoadBalanced注解是属于Spring,这个注解是spring cloud实现的而不是Ribbon的,Spring在初始化容器的时候,如果检测到Bean被@LoadBalanced注解,Spring会为其设置LoadBalancerInterceptor的拦截器。
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@RestController
class EurekaConsumerController {
@Value("${server.port}")
private String port;
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
private String serviceName = "eureka-provider";
@GetMapping("/getProviderInfo")
public String getProvider(){
List<ServiceInstance> serviceInstances = discoveryClient.getInstances(serviceName);
ServiceInstance serviceInstance = serviceInstances.stream()
.findAny().orElseThrow(() ->
new IllegalStateException("no " + serviceName + " instance available"));
return restTemplate.getForObject(
"http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() +
"/instanceInfo", String.class);
}
}
Ribbon的负载均衡策略?
- RoundRobinRule轮询(默认)
- RandomRule随机
- RetryRule轮询重试(重试采用的默认也是轮询)
- WeightedResponseTimeRule响应速度决定权重
- BestAvailableRule最优可用(底层也有RoundRobinRule)
- AvailabilityFilteringRule可用性过滤规则(底层也有RoundRobinRule)
- ZoneAvoidanceRule区域内可用性能最优