【三】Spring Cloud Ribbon 实战

发布于:2024-04-25 ⋅ 阅读:(30) ⋅ 点赞:(0)

Spring Cloud Ribbon 实战

概述

        一直在构思写一个spring cloud系列文章,一方面是对自己实践经验进行一次完整的梳理,另一方面也是希望能够给初学者一些借鉴,让初学者少走些弯路,看到本系列博客就能够很好的把微服务系列组件用好。

        spring cloud是一系列开源项目的集合,这些组件组合起来提供了一套微服务解决方案,本系列文章将按组件来进行讲解,本篇文章将以Ribbon为主题来讲解ribbon的使用和实现原理。

一、实战应用

1、负载均衡

        想到负载均衡大家最熟悉的应该是Nginx和F5了,市面上的负载均衡都有哪些类型呢,如下图所示:

        图1、负载均衡类型汇总

        这里还是以Ngin和F5为例来进行说明,如下图是Nginx和F5的应用

图1、Nginx典型应用

图2、F5硬件跨机房高可用负载均衡

        Ribbon的应用场景与Nginx和F5不同,Ribbon是一个客户端负载均衡器,它赋予了应用一些支配HTTP与TCP行为的能力,可以得知,这里的客户端负载均衡(许多人称之为后端负载均衡)也是进程内负载均衡的一种。如下图示:

图3、Ribbon负载均衡

2、示例应用

        首先要引入依赖:

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

        然后需要注入一个RestTemplate的Bean,并且使用@LoadBalanced注解标注:

@Configuration
public class WebConfig {
    public RestTemplate restTemplate() {

        //负载均衡,默认使用轮询规则
        @LoadBalanced
        @Bean
        return new RestTemplate();
    }
}

这里主要是使用了@LoadBalanced注解,它的作用是在服务调用时自动选择负载均衡策略,并将请求转发到合适的后端服务实例上。

        上面介绍了Ribbon使用的基本配置,其中最重要的是@LoadBalanced注解,这个是开启Ribbon负载均衡的入口,后面分析Ribbon的实现原理将从这里着手。

二、原理介绍

1、核心接口展示

        首先Ribbon是基于如下核心接口实现的:

图4、Ribbon核心接口

        这里只是展示一下核心接口,具体实现原理讲解起来篇幅将会太长不利于初学者学习,下一篇将会详细分析源码级实现原理。

2、负载均衡策略

        如下图展示的是Ribbon中负载均衡策略UML类图:

Ribbon内部一共提供了7种可选的负载均衡策略:

轮询策略:RoundRobinRule,按照一定的顺序依次调用服务实例。

权重策略:WeightedResponseTimeRule,根据每个服务提供者的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性也就越低。

随机策略:RandomRule,从服务提供者的列表中随机选择一个服务实例。

最小连接数策略:BestAvailableRule,也叫最小并发数策略,它是遍历服务提供者列表,选取连接数最小的⼀个服务实例。如果有相同的最小连接数,那么会调用轮询策略进行选取。

重试策略:RetryRule,按照轮询策略来获取服务,如果获取的服务实例为 null 或已经失效,则在指定的时间之内不断地进行重试来获取服务,如果超过指定时间依然没获取到服务实例则返回 null。

可用敏感性策略:AvailabilityFilteringRule,先过滤掉非健康的服务实例,然后再选择连接数较小的服务实例。

区域敏感策略:ZoneAvoidanceRule,根据服务所在区域(zone)的性能和服务的可用性来选择服务实例,在没有区域的环境下,该策略和轮询策略类似。

总结

        本文首先围绕ribbon的实际应用和实现原理两方面展开讲解,意在让大家能够快速了解这一负载均衡组件的使用和实现,如果想更深入了解ribbon的原理可以去把源码down下来认真学习。

参考文章

Spring Cloud Ribbon 中的 7 种负载均衡策略的实现方法_java_脚本之家