本文内容如有错误、不足之处,欢迎技术爱好者们一同探讨,在本文下面讨论区留言,感谢。

文章目录

  • 简述
  • 作用
    • 客户端负载均衡
    • 负载均衡算法
  • 原理和使用
    • 核心类
    • 原理图
    • 使用
  • 小结
  • 参考资料

简述

Spring Cloud Ribbon 是基于 Netflix Ribbon 实现,Spring Cloud 对其进行了一层封装。
Ribbon 基于 HTTPTCP 的客户端负载均衡工具,可以让我们轻松地将面对服务的 REST 模块请求自动转换成客户端负载均衡的服务调用。

提供以下功能:

  • 负载均衡
  • 容错能力
  • 异步和响应模型中的多种协议(HTTP,TCP,UDP)支持
  • 缓存和批处理

不过通过官网提供的消息 Spring Cloud Netflix Ribbon is now deprecated. 已经被弃用了,建议使用 Spring Cloud LoadBalancer 进行负载均衡,可以看下这篇说明。

作用

Ribbon 主要作用是负载均衡,负载均衡又分为客户端负载均衡和服务端负载均衡,它们之间的区别在于:服务清单所在的位置。

  • 客户端负载均衡:自己维护自己要访问的服务实例清单(来源于服务注册中心)
  • 服务端负载均衡:由中间服务单独维护,然后通过心跳检测来剔除故障节点以保证服务清单中的节点都正常可用,通过负载均衡算法(线性轮询、按权重负载、按流量负载等)分配。

负载均衡的概念:

  1. 处理系统的高可用、缓解网络压力、处理内容扩容。
  2. 分为客户端负载均衡和服务端负载均衡。
  3. 按设备来分为硬件负载均衡和软件负载均衡。
  4. 硬件负载均衡主要通过在服务器节点之间安装专门用于负载均衡的设备,例如 F5 等。
  5. 软件负载均衡通过在服务器上安装一些具有负载均衡功能或模块的软件来完成请求的转发工作,例如 Nginx 等。
客户端负载均衡

客户端负载均衡是在 Spring Cloud Ribbon 中定义的。在分布式架构中,同一个Service 集群,当一个请求奔过来时,那么这多个 ServiceRibbon 通过策略决定本次请求使用哪个 Service 的方式就是客户端负载均衡。在 Spring Cloud 分布式框架中客户端负载均衡对开发者是透明的,只要使用 @LoadBalanced 就可以完成一个客户端负载均衡的创建。

负载均衡算法
  • 随机:通过随机选择服务进行执行;
  • 轮训:负载均衡默认实现方式,请求来之后排队处理,均衡的对待每一台服务器;
  • 加权轮训:通过对服务器性能的分型,给高配置,低负载的服务器分配更高的权重,均衡各个服务器的压力,Nginx 的负载均衡默认算法是加权轮询算法;
  • 随机轮训:将随机法和轮询法结合起来,在轮询节点时,随机选择一个节点作为开始位置 index,此后每次选择下一个节点来处理请求,即 (index+1)%size
  • 地址Hash:通过客户端请求的地址的 hash 值取模映射进行服务器调度;
  • 最小链接数:即使请求均衡了,压力不一定会均衡,最小连接数法就是根据后端服务器当前的连接情况,动态的选取其中当前积压连接数最少的一台服务器来处理当前请求,尽可能的提高后台服务器利用率,将负载合理的分流到每一台服务器;

原理和使用

核心类
  • @LoadBalanced 开启负载均衡,这个注解是用来标记 RestTemplate 用LoadBalancerClient 配置
  • LoadBalancerClient 使用从负载均衡器中挑选出的服务实例来执行请求内容
  • LoadBalancerAutoConfiguration 实现客户端负载均衡的自动配置类
  • LoadBalancerInterceptor 拦截 @LoadBalanced 注解的 RestTemplate 发送请求时,执行 LoadBalancerInterceptor 的 intercept 方法
  • RibbonLoadBalancerClient 具体的负载均衡器
  • ILoadBalancer 负载均衡器的一个抽象接口,主要定义了一系列的抽象操作
  • LoadLoadBalancerRequest
原理图


上图 A服务消费者1 需要消费 B功能, 向 Eureka Server (选择负载较少的那个)查询 B服务的服务列表,然后根据用户指定的策略,从 Eureka Server 取到的服务注册列表中选择一个地址。

使用

pom.xml 中配置 Ribbon 依赖

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

应用启动类上使用 @EnableDiscoveryClient 开启 Ribbon 客户端

@SpringBootApplication
@EnableDiscoveryClient
public class RibbonDemoApplication {}

Controller 类上 使用 @RibbonClient 注解,name 服务名称 configuration 配置类

@RestController
@RibbonClient(name = "say-hello", configuration = SayHelloConfiguration.class)
public class ConsumerController {@LoadBalanced@BeanRestTemplate restTemplate(){return new RestTemplate();}@AutowiredRestTemplate restTemplate;@RequestMapping("/hi")private String helloConsumer(@RequestParam(value="name", defaultValue="Artaban") String name){String greeting = this.restTemplate.getForObject("http://say-hello/greeting", String.class);return String.format("%s, %s!", greeting, name);}
}

SayHelloConfiguration 配置类

public class SayHelloConfiguration {@AutowiredIClientConfig ribbonClientConfig;@Beanpublic IPing ribbonPing(IClientConfig config) {return new PingConstant();}@Beanpublic IRule ribbonRule(IClientConfig config) {return new AvailabilityFilteringRule();}
}

application.yml 配置文件内容

spring:application:name: ribbon-demoserver:port: 8090# stores 是自定义的
stores:ribbon:eureka:enabled: falselistOfServers: localhost:8090,localhost:9092,localhost:9999ServerListRefreshInterval: 15000

小结

本文主要内容简单介绍了 Spring Cloud Ribbon ,以及其中的核心组件。

代码地址:github

参考资料

《Spring Cloud 微服务实战》 翟永超 著

Spring Cloud Ribbon

  • https://segmentfault.com/a/1190000015981984

Spring cloud 之Ribbon(一)基本使用

  • https://www.cnblogs.com/htyj/p/10705472.html

Spring Cloud Ribbon简介

  • https://blog.csdn.net/chengqiuming/article/details/81120921

Client Side Load Balancing with Ribbon and Spring Cloud(功能区和Spring Cloud的客户端负载平衡

  • https://spring.io/guides/gs/client-side-load-balancing/

Netflix/ribbon

  • https://github.com/Netflix/ribbon

等风来,不如追风去。

Spring Cloud Ribbon 是什么?相关推荐

  1. Spring Cloud Ribbon(服务消费者)

    Spring Cloud Ribbon 是一个基于Http和TCP的客户端负载均衡工具,基于Netflix Ribbon实现的.它不像服务注册中心.配置中心.API网关那样独立部署,但是它几乎存在于每 ...

  2. 基于Spring cloud Ribbon和Eureka实现客户端负载均衡

    前言 本案例将基于Spring cloud Ribbon和Eureka实现客户端负载均衡,其中Ribbon用于实现客户端负载均衡,Eureka主要是用于服务注册及发现: 传统的服务端负载均衡 常见的服 ...

  3. resttemplate 请求重试_使用Spring Cloud Ribbon重试请求

    使用Spring Cloud Ribbon重试请求 在微服务调用中,一些微服务圈可能调用失败,通过再次调用以达到系统稳定性效果,本文展示如何使用Ribbon和Spring Retry进行请求再次重试调 ...

  4. java B2B2C springmvc mybatis多租户电子商城系统-Spring Cloud Ribbon

    Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现. 通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST ...

  5. Spring Cloud Ribbon –进行安全呼叫

    很简单,但是最近我为此感到困惑 –我必须对安全的远程服务进行基于Netflix Ribbon的客户端调用. 事实证明,使用Netflix Ribbon可以通过两种方式实现这一点,我将通过Spring ...

  6. Spring Cloud微服务笔记(四)客户端负载均衡:Spring Cloud Ribbon

    客户端负载均衡:Spring Cloud Ribbon 一.负载均衡概念 负载均衡在系统架构中是一个非常重要,并且是不得不去实施的内容.因为负载均衡对系统的高可用性. 网络压力的缓解和处理能力的扩容的 ...

  7. 为Spring Cloud Ribbon配置请求重试(Camden.SR2+)

    当我们使用Spring Cloud Ribbon实现客户端负载均衡的时候,通常都会利用@LoadBalanced来让RestTemplate具备客户端负载功能,从而实现面向服务名的接口访问(原理可见& ...

  8. Spring Cloud Ribbon 负载均衡客户端调用示例

    承接 Spring Cloud 最简入门示例 这一篇, 本篇演示如何使用负载均衡客户端 Ribbon 调用在Eureka注册的服务. Ribbon 是什么? Ribbon是Netflix 的开源项目, ...

  9. Java中Spring Cloud Ribbon

    Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现.通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模 ...

  10. Spring Cloud的负载均衡Spring Cloud Ribbon和Spring Cloud Feign

    一.客户端负载均衡:Spring Cloud Ribbon. Spring Cloud Ribbon是基于HTTP和TCP的客户端负载工具,它是基于Netflix Ribbon实现的.通过Spring ...

最新文章

  1. Mac Vim 如何设置高亮
  2. Elasticsearch创建索引和映射结构详解
  3. 送书 | 经典框架Kaldi配套的语音识别实战
  4. 在猜年龄的基础上编写登录、注册方法,并且把猜年龄游戏分函数处理
  5. adnroid string拼接_Android开发中string.xml文件中字符串的拼接
  6. python prettytable表格列数太多_excel列数太多了怎么办
  7. 排序千万级数据_MySQL 对于千万级的大表要怎么优化?我写了6000字的深度解读...
  8. 图片服务 - thumbor启用检测器
  9. VB.NET项目技术总结
  10. @datetimeformat注解使用 晚了8个小时_Java注解,就是那么简单
  11. [导入]将asp.net usercontrol(用户控件页)转变为普通控件
  12. nginx安装问题 Makefile Error 127
  13. Matlab——噪声的检测和处理实验
  14. 国二计算机考试office快捷键,全国计算机二级考试(Office)应试技巧
  15. 【Vegas原创】“光驱无法访问,函数不正确”解决方法
  16. Python-元祖-字典
  17. (C++实例)实现people类、student类,teacher类、graduate类、助教类继承和派生并测试
  18. springboot+vue网上学生评教系统java
  19. linux 可视化分区,可视化linux块设备的工具(分区,LVM PV,LV,mdadm设备……)
  20. Java获取时间格式(年月日时分秒毫秒)

热门文章

  1. 计算机行业点评:软件业、两化融合规划发布,数字化转型大潮将至
  2. cf 340C 差值递推
  3. 四家奥运厂商被指控雇用童工 相关部门将彻查
  4. Boos 日志格式化
  5. Magenta魔改记-0:Magetna初见
  6. 无线耳机哪个品牌好一点?无线耳机推荐品牌
  7. reportviewer控件mysql_真正的全动态报表:ReportViewer+RDLC
  8. pyecharts-Timeline讲解时间线
  9. Zygote启动流程解析
  10. 【IPv6基础系列科普视频】IPv6地址、IPv6 DNS、DHCPv6...精华视频一键打包,谁看谁会!