SpringBoot整合Ribbon源码分析之Ribbon简介和核心组件

一、简介

Ribbon是Netflix出品的一套负载均衡组件,提供了许多Rule规则从负载均衡列表中选取合适的server实例。当实例出现问题时候,Ribbon本身具有自动移除问题实例的功能。

二、核心组件介绍

1.ILoadBalancer

它是定义负载均衡选择服务的核心方法的接口,它的默认实现类是ZoneAwareLoadBalancer,它的核心方法如下:


package com.netflix.loadbalancer;

import java.util.List;


public interface ILoadBalancer {

  
   public void addServers(List<Server> newServers);
   
  //选择一个服务
   public Server chooseServer(Object key);
   
  
   public void markServerDown(Server server);
   
  
   @Deprecated
   public List<Server> getServerList(boolean availableOnly);

    public List<Server> getReachableServers();
   //获取所有服务列表
   public List<Server> getAllServers();
}

2.IRule

定义Ribbon中负载均衡策略的接口,它的默认实现类是ZoneAvoidanceRule,它是基于ZoneAvoidancePredicate计算出哪个Zone的服务最差,然后从服务列表剔除,AvailabilityPredicate是过滤掉正在处于熔断状态的服务,上述两个断言过滤出来的服务再通过轮询方式从服务获取一个。

除了这个类,还有一个实现类是RandomRule它是一个随机的负载均衡策略的实现,即从多个服务器中随机获取一个服务实例。

另一个实现类是RoundRobinRule,它是轮询的机制,每个服务实例都同等被调用,在选择过程中最多有10次的重试机制。

3.IClientConfig

定义Ribbon中管理管理配置的接口,例如指定Ribbon客户端的连接超时时间、读取超时时间等等,默认实现类是DefaultClientConfigImpl。

4.IPing

检查服务是否可用的方法,常见的是通过HTTP、TCP方式。

5.ServerList

维护着一组Server实例列表,在应该程序运行过程中,Ribbon通过ServerList中的服务实例供负载均衡选择,ServerList维护的实例列表可能在运行过程中发生动态变化。

ServerList提供了两个重要方法,代码如下:


package com.netflix.loadbalancer;

import java.util.List;

public interface ServerList<T extends Server> {

  //第一次获取的Server列表
    public List<T> getInitialListOfServers();
    
    //更新Server列表
    public List<T> getUpdatedListOfServers();   

}

6.ServerListUpdater

ServerListUpdater有多个方法,其中有个start方法开启定时任务调用UpdateAction来更新服务实例列表,它的实现类是PollingServerListUpdater,此对象会启动一个定时线程池定时执行更新策略,当服务有新的实例添加进来会动态更新。

三、工作流程

下面是一张Ribbon简单的执行流程图:

流程先从ILoadBalancer执行开始,选择服务实例过程如下

1.通过ServerList获取当前可用的服务实例列表。

2.通过ServerListFilter将步骤1获取的服务实例进行一次过滤返回满足条件的服务实例列表。

3.通过IRule规则,结合服务实例的统计信息,返回满足条件的某一个服务实例。

总结:

本篇主要简单的介绍一下Ribbon的概念和核心组件的作用以及它们执行的执行流程,下一篇文章开始我将开始分析SpringBoot整合Ribbon的源码,可以一步步看出这些核心组件是怎么加载到容器中的,又是怎么相互调用返回可用的服务实例列表,好了,我是爱编程的程序员老徐,如果喜欢我的文章请点赞,我们下期见

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Boot整合Ribbon可以实现客户端的负载均衡。下面是整合步骤: 1. 添加依赖:在`pom.xml`文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> ``` 2. 创建Ribbon配置类:创建一个配置类,用于配置Ribbon的相关属性。可以使用`@Configuration`注解进行标注,示例代码如下: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.netflix.ribbon.RibbonClient; @Configuration @RibbonClient(name = "serviceName") // 服务名 public class RibbonConfig { @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } } ``` 3. 创建服务调用类:创建一个用于调用服务的类,并注入`RestTemplate`对象。示例代码如下: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; @Service public class ServiceInvoker { @Autowired private RestTemplate restTemplate; public String invokeService() { String serviceUrl = "http://serviceName/path"; // 服务名和路径 return restTemplate.getForObject(serviceUrl, String.class); } } ``` 4. 启用Ribbon:在Spring Boot的启动类上添加`@EnableDiscoveryClient`注解,示例代码如下: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 以上就是Spring Boot整合Ribbon的基本步骤。通过配置Ribbon,可以实现服务的负载均衡,提高系统的性能和可用性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值