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

相关推荐
vivi_and_qiao1 小时前
HTML的form表单
java·前端·html
Slaughter信仰1 小时前
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第四章知识点问答补充及重新排版
java·开发语言·jvm
心灵宝贝1 小时前
Mac用户安装JDK 22完整流程(Intel版dmg文件安装指南附安装包下载)
java·开发语言·macos
ta是个码农1 小时前
Mysql——日志
java·数据库·mysql·日志
今***b2 小时前
Python 操作 PPT 文件:从新手到高手的实战指南
java·python·powerpoint
David爱编程2 小时前
volatile 关键字详解:轻量级同步工具的边界与误区
java·后端
fatfishccc4 小时前
Spring MVC 全解析:从核心原理到 SSM 整合实战 (附完整源码)
java·spring·ajax·mvc·ssm·过滤器·拦截器interceptor
没有bug.的程序员4 小时前
MyBatis 初识:框架定位与核心原理——SQL 自由掌控的艺术
java·数据库·sql·mybatis
执键行天涯4 小时前
从双重检查锁定的设计意图、锁的作用、第一次检查提升性能的原理三个角度,详细拆解单例模式的逻辑
java·前端·github
程序员江鸟5 小时前
Java面试实战系列【JVM篇】- JVM内存结构与运行时数据区详解(私有区域)
java·jvm·面试