Ribbon


概述

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套 客户端 负载均衡 的工具。

简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供 客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。

负载均衡 + RestTemplate 调用

集中式与进程内

集中式 LB

即在服务的消费方和提供方之间使用独立的 LB 设施(可以是硬件,如 F5,也可以是软件,如 Nginx),又该设施负责把访问请求通过某种策略转发至服务的提供方。

进程内

将 LB 逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。

Ribbon 就属于进程内 LB,他只是一个类库,集成于消费方进程,消费方通过他来获取到服务提供方的地址。

工作步骤

  • 第一步:选择 EurekaServer,他优先选择在同一区域内负载较少的 server。
  • 第二步:再根据用户指定的策略,从 server 取到服务注册列表中选择一个地址。
    • 策略:轮询、随机和根据响应时间加权。

Ribbon核心组件IRule

IRule:根据特定算法中从服务列表中选取一个要访问的服务。

  • com.netflix.loadbalancer.RoundRobinRule:轮询;
  • com.netflix.loadbalancer.RandomRule:随机;
  • com.netflix.loadbalancer.RetryRule:先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试,获取可用的服务;
  • WeightedResponseTimeRule:对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择;
  • BestAvailableRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务 ,然后选择一个并发量最小的服务;
  • AvailabilityFilteringRule:先过滤掉故障实例,再选择并发较小的实例;
  • ZoneAvoidanceRule:默认规则,复合判断server所在区域的性能和server的可用性选择服务器;

更改默认的负载均衡算法

官方文档明确给出了警告:

这个自定义配置类不能放在 @ComponentScan(启动类的同级或子级) 所扫描的当前包下以及子包下,否则我们自定义的这个配置类就会被所有的 Ribbon 客户端所共享,达不到特殊化定制的目的了。

自定义配置类

package com.atguigu.myrule;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MySelfRule {

    @Bean
    public IRule myRule() {
        // 定义为随机
        return new RandomRule();
    }

}

启动类上加注解

package com.atguigu.springcloud;

import com.atguigu.myrule.MySelfRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;

@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = MySelfRule.class)
public class OrderMain80 {

    public static void main(String[] args) {
        SpringApplication.run(OrderMain80.class, args);
    }

}

@RibbonClient(name = “CLOUD-PAYMENT-SERVICE”, configuration = MySelfRule.class)

主要就是这一行注释:

name:客户端的名称,也就是需要请求的地址;

configuration:功能区客户端的自定义;

负载均衡算法

原理

负载均衡算法:rest 接口第几次请求数 % 服务器集群总数量 = 实际调用服务器位置下标,每次服务重启动后 rest 接口计数从 1 开始。

List<ServiceInstance> instances = discobveryClient.getInstances("CLOUD-PAYMENT-SERVICE");

如:
    List[0] instances = 127.0.0.1:8002;
	List[1] instances = 127.0.0.1:8001;

8001 + 8002 组合成为集群,他们共计 2 台机器,集群总数为 2,按照轮询算法原理:

当总请求数为 1 时:1 % 2 = 1 对应下标位置为 1,则获得服务地址为 127.0.0.1:8001;

当总请求数为 2 时:2 % 2 = 0 对应下标位置为 0,则获得服务地址为 127.0.0.1:8002;

当总请求数为 3 时:3 % 2 = 1 对应下标位置为 1,则获得服务地址为 127.0.0.1:8001;

当总请求数为 4 时:4 % 2 = 0 对应下标位置为 0,则获得服务地址为 127.0.0.1:8002;

如此类推…….

原创文章,作者:carmelaweatherly,如若转载,请注明出处:https://blog.ytso.com/245560.html

(0)
上一篇 2022年4月18日
下一篇 2022年4月18日

相关推荐

发表回复

登录后才能评论