Spring Cloud-05-Ribbon

五、Ribbon

1、什么是Ribbon

​ Ribbon是Netflix发布的开源项目,主要提供客户端负载均衡的工具。

简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随即连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法

2、Ribbon能干什么?

  • LB,及负载均衡(Load Balance),在服务器或分布式集群中经常用的一种应用。
  • 负载均衡简单的来说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA(高可用).
  • 常见的负载均衡软件有Nginx, L vs等等
  • dubbo、Spring Cloud中均得我们提供了负载均衡,Spring Cloud的负载均衡算法可以自定义
  • 负载均衡简单分类:
    • 集中式LB
      • 即在服务的消费方和提供方之间使用独立的LB实施,如Nginx, 由该设施负责把访问请求通过某种策略转发至服务的提供方!
    • 进程式LB
      • 将LB逻辑集成到消费方,消费方从服务中心获知有哪些地址可用,然后自己再从这些地址中选取一个合适的服务器
      • Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务器提供方地址

3、实践

在客户服务【80】端口导入Ribbon依赖

<!--        Ribbon-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>

修改配置

eureka:
  client:
    # 不想 eureka注册自己
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

在Config加入注解@LoadBalanced实现RestTemplate的负载均衡

@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
    return new RestTemplate();
}

在程序主入口加入开启客户端服务的注解@EnableEurekaClient

@EnableEurekaClient
@SpringBootApplication
public class DeptConsumer_80 {
    public static void main(String[] args) {
        SpringApplication.run(DeptConsumer_80.class,args);
    }
}
  • Ribbon作为消费方,会从Eureka集群查询可用的服务列表,然后通过负载均衡默认算*询的方式进行挨个访问可用的服务列表。
    Spring Cloud-05-Ribbon

负载均衡算法:【IRule】

  • RoundRobinRule 轮询【默认】
  • RandomRule 随机
  • RetryRule 先按照轮询获取服务,如果服务获取失败,则会在指定的时间内进行重试。
  • AvailabilityFilteringRule 会先过滤掉,跳闸,访问故障的服务,对剩下的进行轮询

4、自定义路由组件

1、创建自定义路由包(不能与程序主入口在同目录下)

​ 复制源码RandomRule修改主要算法,比如:每个服务要访问5次,换下一个服务

if (total < 5){
    server = upList.get(currentIndex);
    total++;
}else{
    total = 0;
    currentIndex++;
    if (currentIndex > upList.size()){
        currentIndex = 0;
    }
    // 从活着的服务获取指定的服务进行操作
    server = upList.get(currentIndex);
}

2、创建Config类,将修改的路由组件,装配到Spring中

@Configuration
public class AaronRule {
    @Bean
    public IRule myRule(){
        return new AaronRandomRule();
    }
}

3、在主程序入口上添加注解@RibbonClient(name = "SPRINGCLOUD-PROVIDER-DEPT",configuration = AaronRule.class)
`

@EnableEurekaClient
@SpringBootApplication
@RibbonClient(name = "SPRINGCLOUD-PROVIDER-DEPT",configuration = AaronRule.class)
public class DeptConsumer_80 {
    public static void main(String[] args) {
        SpringApplication.run(DeptConsumer_80.class,args);
    }
}
上一篇:Ribbon架构解析之IClientConfig配置详解


下一篇:Ribbon 负载均衡策略