【三】Spring Cloud Ribbon 实战

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_脚本之家

相关推荐
缺点内向3 小时前
Java:创建、读取或更新 Excel 文档
java·excel
带刺的坐椅4 小时前
Solon v3.4.7, v3.5.6, v3.6.1 发布(国产优秀应用开发框架)
java·spring·solon
四谎真好看5 小时前
Java 黑马程序员学习笔记(进阶篇18)
java·笔记·学习·学习笔记
桦说编程5 小时前
深入解析CompletableFuture源码实现(2)———双源输入
java·后端·源码
java_t_t5 小时前
ZIP工具类
java·zip
lang201509286 小时前
Spring Boot优雅关闭全解析
java·spring boot·后端
pengzhuofan7 小时前
第10章 Maven
java·maven
百锦再7 小时前
Vue Scoped样式混淆问题详解与解决方案
java·前端·javascript·数据库·vue.js·学习·.net
刘一说7 小时前
Spring Boot 启动慢?启动过程深度解析与优化策略
java·spring boot·后端
壹佰大多7 小时前
【spring如何扫描一个路径下被注解修饰的类】
java·后端·spring