spring cloud 之 Ribbon
1.Ribbon是什么
Spring Cloud Ribbon 是一套基于 Netflix Ribbon 实现的客户端负载均衡和服务调用工具。Netflix Ribbon 是 Netflix 公司发布的开源组件,其主要功能是提供客户端的负载均衡算法和服务调用。Spring Cloud 将其与 Netflix 中的其他开源服务组件(例如 Eureka、Feign 以及 Hystrix 等)一起整合进 Spring Cloud Netflix 模块中,整合后全称为 Spring Cloud Netflix Ribbon。Ribbon 是 Spring Cloud Netflix 模块的子模块,它是 Spring Cloud 对 Netflix Ribbon 的二次封装。通过它,我们可以将面向服务的 REST 模板(RestTemplate)请求转换为客户端负载均衡的服务调用。Ribbon 是 Spring Cloud 体系中最核心、最重要的组件之一。它虽然只是一个工具类型的框架,并不像 Eureka Server(服务注册中心)那样需要独立部署,但它几乎存在于每一个使用 Spring Cloud 构建的微服务中。Spring Cloud 微服务之间的调用,API 网关的请求转发等内容,实际上都是通过 Spring Cloud Ribbon 来实现的·
2. 什么是负载均衡
在任何一个系统中,负载均衡都是一个十分重要且不得不去实施的内容,它是系统处理高并发、缓解网络压力和服务端扩容的重要手段之一。负载均衡(Load Balance) ,简单点说就是将用户的请求平摊分配到多个服务器上运行,以达到扩展服务器带宽、增强数据处理能力、增加吞吐量、提高网络的可用性和灵活性的目的。通俗来讲,将请求按照一定的策略均匀地发送到集群中的每一个节点上,保证不会出现某个节点承载大量请求,其他节点空闲的情况
3. 负载均衡的种类
3.1 服务端负载均衡
服务端负载均衡是最常见的负载均衡方式,如图:
服务端负载均衡是在客户端和服务端之间建立一个独立的负载均衡服务器,该服务器既可以是硬件设备(例如 F5),也可以是软件(例如 Nginx)。这个负载均衡服务器维护了一份可用服务端清单,然后通过心跳机制来删除故障的服务端节点,以保证清单中的所有服务节点都是可以正常访问的。当客户端发送请求时,该请求不会直接发送到服务端进行处理,而是全部交给负载均衡服务器,由负载均衡服务器按照某种算法(例如轮询、随机等),从其维护的可用服务清单中选择一个服务端,然后进行转发。服务端负载均衡具有以下特点:
需要建立一个独立的负载均衡服务器。
负载均衡是在客户端发送请求后进行的,因此客户端并不知道到底是哪个服务端提供的服务。
可用服务端清单存储在负载均衡服务器上。
3.2 客户端负载均衡
相较于服务端负载均衡,客户端服务在均衡则是一个比较小众的概念。如图:
客户端负载均衡是将负载均衡逻辑以代码的形式封装到客户端上,即负载均衡器位于客户端。客户端通过服务注册中心(例如 Eureka Server)获取到一份服务端提供的可用服务清单。有了服务清单后,负载均衡器会在客户端发送请求前通过负载均衡算法选择一个服务端实例再进行访问,以达到负载均衡的目的;客户端负载均衡也需要心跳机制去维护服务端清单的有效性,这个过程需要配合服务注册中心一起完成。客户端负载均衡具有以下特点:
负载均衡器位于客户端,不需要单独搭建一个负载均衡服务器。
负载均衡是在客户端发送请求前进行的,因此客户端清楚地知道是哪个服务端提供的服务。
客户端都维护了一份可用服务清单,而这份清单都是从服务注册中心获取的。
Ribbon 就是一个基于 HTTP 和 TCP 的客户端负载均衡器,当我们将 Ribbon 和 Eureka 一起使用时,Ribbon 会从 Eureka Server(服务注册中心)中获取服务端列表,然后通过负载均衡策略将请求分摊给多个服务提供者,从而达到负载均衡的目的。
4. 服务端负载均衡与客户端负载均衡对比
不同点 | 服务端负载均衡 | 客户端负载均衡 |
---|---|---|
是否需要建立负载均衡服务器 | 需要在客户端和服务端之间建立一个独立的负载均衡服务器。 | 将负载均衡的逻辑以代码的形式封装到客户端上,因此不需要单独建立负载均衡服务器。 |
是否需要服务注册中心 | 不需要服务注册中心。 | 需要服务注册中心。在客户端负载均衡中,所有的客户端和服务端都需要将其提供的服务注册到服务注册中心上。 |
可用服务清单存储的位置 | 可用服务清单存储在位于客户端与服务器之间的负载均衡服务器上。 | 所有的客户端都维护了一份可用服务清单,这些清单都是从服务注册中心获取的。 |
负载均衡的时机 | 先将请求发送到负载均衡服务器,然后由负载均衡服务器通过负载均衡算法,在多个服务端之间选择一个进行访问;即在服务器端再进行负载均衡算法分配。简单点说就是,先发送请求,再进行负载均衡。 | 在发送请求前,由位于客户端的服务负载均衡器(例如 Ribbon)通过负载均衡算法选择一个服务器,然后进行访问。简单点说就是,先进行负载均衡,再发送请求。 |
客户端是否了解服务提供方信息 | 由于负载均衡是在客户端发送请求后进行的,因此客户端并不知道到底是哪个服务端提供的服务。 | 负载均衡是在客户端发送请求前进行的,因此客户端清楚的知道是哪个服务端提供的服务。 |
5. Ribbon的使用
Ribbon 可以与 RestTemplate(Rest 模板)配合使用,以实现微服务之间的调用。RestTemplate 是 Spring 家族中的一个用于消费第三方 REST 服务的请求框架。RestTemplate 实现了对 HTTP 请求的封装,提供了一套模板化的服务调用方法。通过它,Spring 应用可以很方便地对各种类型的 HTTP 请求进行访问。RestTemplate 针对各种类型的 HTTP 请求都提供了相应的方法进行处理,例如 HEAD、GET、POST、PUT、DELETE 等类型的 HTTP 请求,分别对应 RestTemplate 中的 headForHeaders()、getForObject()、postForObject()、put() 以及 delete() 方法。
引入依赖
<!--Spring Cloud Ribbon 依赖-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
添加RestTemplate Bean声明
@Configuration
public class ConfigBean {@Bean@LoadBalanced //开启负载均衡public RestTemplate getRestTemplate() {return new RestTemplate();}
}
调用
@RestController
@RequestMapping("api/v1/service2")
public class Controller {@Autowiredprivate RestTemplate restTemplate;@GetMappingpublic TestEntity get() {// return restTemplate.getForObject("http://{spring.application.name}{接口路由}", 实体类class);return restTemplate.getForObject("http://service1/api/vi/service1", TestEntity.class);}
}
6. Ribbon负载均衡策略
Ribbon 是一个客户端的负载均衡器,它可以与 Eureka 配合使用轻松地实现客户端的负载均衡。Ribbon 会先从 Eureka Server(服务注册中心)去获取服务端列表,然后通过负载均衡策略将请求分摊给多个服务端,从而达到负载均衡的目的。Spring Cloud Ribbon 提供了一个 IRule 接口,该接口主要用来定义负载均衡策略,它有 7 个默认实现类,每一个实现类都是一种负载均衡策略。
负载均衡策略 | 说明 |
---|---|
RoundRobinRule | 按照线性轮询策略,即按照一定的顺序依次选取服务实例 |
RandomRule | 随机选取一个服务实例 |
RetryRule | 按照 RoundRobinRule(轮询)的策略来获取服务,如果获取的服务实例为 null 或已经失效,则在指定的时间之内不断地进行重试(重试时获取服务的策略还是 RoundRobinRule 中定义的策略),如果超过指定时间依然没获取到服务实例则返回 null 。 |
WeightedResponseTimeRule | WeightedResponseTimeRule 是 RoundRobinRule 的一个子类,它对 RoundRobinRule 的功能进行了扩展。 根据平均响应时间,来计算所有服务实例的权重,响应时间越短的服务实例权重越高,被选中的概率越大。刚启动时,如果统计信息不足,则使用线性轮询策略,等信息足够时,再切换到 WeightedResponseTimeRule。 |
BestAvailableRule | 继承自 ClientConfigEnabledRoundRobinRule。先过滤点故障或失效的服务实例,然后再选择并发量最小的服务实例。 |
AvailabilityFilteringRule | 先过滤掉故障或失效的服务实例,然后再选择并发量较小的服务实例。 |
ZoneAvoidanceRule | 默认的负载均衡策略,综合判断服务所在区域(zone)的性能和服务(server)的可用性,来选择服务实例。在没有区域的环境下,该策略与轮询(RandomRule)策略类似。 |
7. 更换负载均衡策略
Spring Cloud Ribbon 默认使用轮询策略选取服务实例,我们也可以根据自身的需求切换负载均衡策略。切换负载均衡策略的方法很简单,我们只需要在服务消费者(客户端)的配置类中,将 IRule 的其他实现类注入到容器中即可。
@Configuration
public class ConfigBean {@Bean@LoadBalancedpublic RestTemplate getRestTemplate() {return new RestTemplate();}@Beanpublic IRule myRule() {return new RoundRobinRule();}
}
记得点「赞」和「在看」↓
爱你们
spring cloud 之 Ribbon相关推荐
- spring cloud整合Ribbon
spring cloud整合Ribbon 使用Eureka中自带的Ribbon 如果你使用的是Eureka做服务发现和注册的话,在比较新版本的Eureka中,Eureka已经集成了Ribbon进入Eu ...
- Spring Cloud入门-Ribbon服务消费者(Hoxton版本)
文章目录 Spring Cloud入门系列汇总 摘要 Ribbon简介 RestTemplate的使用 GET请求方法 getForObject方法 getForEntity方法 POST请求方法 p ...
- Spring Cloud 之 Ribbon,Spring RestTemplate 调用服务
在Eureka Server 集群基础上,使用Spring RestTemplate,结合Ribbon功能进行服务调用,使用方式非常简单. 1.在主项目中新建一个模块,eurekaclient,mav ...
- Spring Cloud入门 -- Ribbon服务消费者(Hoxton.SR5版)
Ribbon简介 Ribbon是Netflix公司开源的客户端负载均衡器,可以控制Http和Tcp客户端的负载均衡. Ribbon默认提供了很多负载均衡算法,如:轮询.随机等,也可以实现自定义的负载均 ...
- Spring Cloud Netfilx Ribbon(负载均衡工具)
一.介绍 Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现.通过Spring Cloud的封装,可以让我们轻松地将面向服务的 ...
- 深入浅出Spring Cloud Netflix - Ribbon
文章目录 一.负载均衡 1.Load Balance是什么 2.负载均衡的分类 二.Ribbon详解 1.什么是Ribbon 2.Ribbon目前进入维护模式 3.Ribbon的工作流程 4.Ribb ...
- 微服务(三) 【手摸手带你搭建Spring Cloud】 Ribbon 什么是负载均衡?spring cloud如何实现负载均衡?ribbon负载均衡有几种策略?Ribbon是什么?
在上一章,我介绍了springcloud的eureka搭建.我们做了服务注册.最后我们还介绍了一些续约,失效剔除等参数配置.已经不需要再通过手动输入ip去访问服务,而是通过中心只需要通过服务名就可以获 ...
- Spring Cloud 之 Ribbon,Spring RestTemplate 调用服务使用Hystrix熔断器
在服务调用中增加Hystrix熔断器,是在单个服务出现故障的时候快速失败,也可以提供回退方案,避免因为线程等待耗尽整个服务的线程资源:Hystrix DashBoard监控组件,可以实时监控熔断器的状 ...
- Spring Cloud之Ribbon
Ribbon是什么 Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用.Ribbon客户端组件提供一系列完善的配置项,如连接超时,重试等.简单来说,就是在配置 ...
最新文章
- Delphi 之Copyrect的使用
- spring cloud微服务分布式云架构 - 整合企业架构的技术点
- jscience中的parse转换
- iOS很重要的 block回调
- 理解 redis 中的 哈希对象类型
- python 执行shell 事务_python中执行shell的两种方法总结
- 在SQLServer2005中使用全文搜索
- 快速使用ros小乌龟教程——ROS初体验
- CSS3左右滑动开关按钮
- xshell 导入.xsh 文件
- 如何选择适合你的兴趣爱好(十),排球
- 大家都可以学的制作个人网
- 软件项目开发,交付文档(全)
- win7提示盗版 且各种工具无法激活
- 导出百度网盘共享文件库目录清单的脚本
- 【建议收藏系列】爆肝3w字带你理解什么叫运维~
- VUE课堂笔记1-课前准备
- 虚拟机里Win98装XP Luma主题
- 【工业物联网】——污水处理远程监控系统
- windows系统bat批处理 查看当前电脑连接过的wifi名字和wifi密码
热门文章
- 《传智播客.Net培训.net视频教程》(.net视频asp.net培训传智播客asp.net视频教程开放课程c#视频移动开发winform SQL ADO.Net HTML JavaScript
- Kubernetes基础:包含多个容器的Pod
- SEO优化影响谷歌排名的因素
- QQ安装教程 2 -for wuqs
- 敞开心扉,相互依赖,才可能拥有爱情
- Web3.0与数字时尚,该如何落地?
- ESP8266 NodeMcu机智云SOC方案开发经验分享
- 支持向量机(Support Vector Machine, SVM)基础知识
- python中arcsec_在Python类中继承Cython类
- 计算机视觉专业排名,2020美国人工智能专业排名TOP10!