Ribbon详解(作用原理及使用实例)

Ribbon详解(作用原理及使用实例)-mikechen

Ribbon定义

Ribbon是Spring Cloud Netiflix组件中一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。

 

Ribbon作用

Ribbon主要作用是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。

当多个服务提供者时,Ribbon 可以根据负载均衡的算法,比如:如简单轮询、随机连接等,自动地选择需要调用的服务地址。

 

Ribbon使用

知道了Ribbon的作用后,我们通过一个简单的示例来学习下Ribbon的使用。

1.引入Ribbon依赖

在 Spring Cloud工程中引用Ribbon非常简单,只需要在pom.xml中添加以下依赖。

如下所示:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

 

2.增加启动类

@SpringBootApplication
@EnableEurekaClient
public class RibbonDemoApplication {

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

    @Bean
    @LoadBalanced
    RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

Ribbon客户端本身作为一个Eureka客户端存在,因此需要@EnableEurekaClient注解,并且向注册中心注册服务。

Ribbon通过RestTemplate类调用远程服务器,因此我们还需要注入RestTemplate类。

@LoadBalanced

只有增加@LoadBalanced注解,Ribbon才会启用负载均衡。

 

3.配置文件

server.port=8090

# 当前应用名称
spring.application.name=ribbon-client
# eureka注册中心地址
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8761/eureka/

作为一个Eureka客户端,我们仍然需要如下的配置信息,以保证注册服务到注册中心服务器上。

 

4.创建Rest请求示例

我们打算对外暴露一个接口,接收来自浏览器的请求,然后将这些请求以负载均衡的方式发送给真正的服务端。

@RestController
public class RibbonTestController {
    private static String EUREKA_URL = "http://eureka-client/getHello";

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/getRibbonHello")
    public String getRibbonHello(HttpServletRequest request){
        String result = restTemplate.getForObject(EUREKA_URL, String.class);
        System.out.println(result);
        return result;
    }

}

如此我们就准备好了一个最简单的Ribbon使用案例。

 

Ribbon负载均衡原理

首先我们要明确负载均衡分为:集中式负载均衡和进程内负载均衡。

1.服务端的负载均衡

例如,硬件的有:F5,软件的有典型代表:Nginx,都是先发送请求,然后在服务器端再进行负载均衡算法分配。

 

2.客户端的负载均衡

负载均衡逻辑集成到消费方客户端,消费方从服务注册中心获知那些地址可用,然后自己再从这些地址中选择一个合适的服务器。

例如spring cloud中的Ribbon,客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,在客户端就进行负载均衡算法分配。

如下图所示:

Ribbon详解(作用原理及使用实例)-mikechen

总共有七种负载均衡策略可供选择,可以根据自己的业务场景进行选择:

  1. 轮询RoundRobinRule:这也是Ribbon默认的策略
  2. 随机RandomRule;
  3. 响应时间权重ResponseTimeWeightedRule:为每个服务设置权重,响应时间越短,权重越大;
  4. 最少并发数策略BestAvailableRule;
  5. 重试策略RetryRule;
  6. 可用性敏感策略AvailabilityFilteringRule;
  7. 区域性敏感策略ZoneAvoidanceRule;

作者简介

陈睿|mikechen,10年+大厂架构经验,大厂资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法