初识Spring Cloud系列——Ribbon原理

613 阅读2分钟

这是我参与更文挑战的第18天,活动详情查看: 更文挑战

在一个夜黑风高的晚上,小编正襟危坐,带着紧张的情绪,用那双颤抖的双手,缓缓地,慢慢的揭开了一层神秘的面纱————什么是Ribbon?

什么是Ribbon?

Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。

Ribbon的作用?

Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等,主要负责请求分发。

image.png

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区域内可用性能最优