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

相关推荐
zaim11 小时前
计算机的错误计算(一百一十四)
java·c++·python·rust·go·c·多项式
hong_zc2 小时前
算法【Java】—— 二叉树的深搜
java·算法
进击的女IT3 小时前
SpringBoot上传图片实现本地存储以及实现直接上传阿里云OSS
java·spring boot·后端
Miqiuha3 小时前
lock_guard和unique_lock学习总结
java·数据库·学习
一 乐4 小时前
学籍管理平台|在线学籍管理平台系统|基于Springboot+VUE的在线学籍管理平台系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习
数云界4 小时前
如何在 DAX 中计算多个周期的移动平均线
java·服务器·前端
阑梦清川4 小时前
Java继承、final/protected说明、super/this辨析
java·开发语言
快乐就好ya6 小时前
Java多线程
java·开发语言
IT学长编程6 小时前
计算机毕业设计 二手图书交易系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·计算机毕业设计选题·二手图书交易系统
CS_GaoMing6 小时前
Centos7 JDK 多版本管理与 Maven 构建问题和注意!
java·开发语言·maven·centos7·java多版本