什么是 Ribbon

Ribbon 是一个基于 HTTP 和 TCP 的 客服端负载均衡工具,它是基于 Netflix Ribbon 实现的。

它不像 Spring Cloud 服务注册中心、配置中心、API 网关那样独立部署,但是它几乎存在于每个 Spring Cloud 微服务中。包括 Feign 提供的声明式服务调用也是基于该 Ribbon 实现的。

Ribbon 默认提供很多种负载均衡算法,例如轮询、随机等等。甚至包含自定义的负载均衡算法。

Ribbon 解决了什么问题

Ribbon 提供了一套微服务的负载均衡解决方案。

负载均衡不同方案的区别

目前业界主流的负载均衡方案可分成两类:

  • 集中式负载均衡(服务器负载均衡),即在 consumer 和 provider 之间使用独立的负载均衡设施(可以是硬件,如 F5,也可以是软件,如 nginx),由该设施负责把访问请求通过某种策略转发至 provider;
  • 进程内负载均衡(客户端负载均衡),将负载均衡逻辑集成到 consumer,consumer 从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的 provider。Ribbon 属于后者,它只是一个类库,集成于 consumer 进程,consumer 通过它来获取 provider 的地址。

集中式负载均衡

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p9U5ee1o-1613981820834)(https://mrhelloworld.com/resources/articles/spring/spring-cloud/ribbon/u=708889431,483252920&fm=26&gp=0.jpg)]

进程内负载均衡

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sWj1gabn-1613981820836)(https://mrhelloworld.com/resources/articles/spring/spring-cloud/ribbon/1578386040836.png)]

Ribbon 负载均衡策略

轮询策略(默认)

策略对应类名:RoundRobinRule

实现原理:轮询策略表示每次都顺序取下一个 provider,比如一共有 5 个 provider,第 1 次取第 1 个,第 2 次取第 2 个,第 3 次取第 3 个,以此类推。

权重轮询策略

策略对应类名:WeightedResponseTimeRule

实现原理:

  • 根据每个 provider 的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性越低。
  • 原理:一开始为轮询策略,并开启一个计时器,每 30 秒收集一次每个 provider 的平均响应时间,当信息足够时,给每个 provider 附上一个权重,并按权重随机选择 provider,高权越重的 provider 会被高概率选中。

随机策略

策略对应类名:RandomRule

实现原理:从 provider 列表中随机选择一个。

最少并发数策略

策略对应类名:BestAvailableRule

实现原理:选择正在请求中的并发数最小的 provider,除非这个 provider 在熔断中。

重试策略

策略对应类名:RetryRule

实现原理:其实就是轮询策略的增强版,轮询策略服务不可用时不做处理,重试策略服务不可用时会重新尝试集群中的其他节点。

可用性敏感策略

策略对应类名:AvailabilityFilteringRule

实现原理:过滤性能差的 provider

  • 第一种:过滤掉在 Eureka 中处于一直连接失败的 provider。
  • 第二种:过滤掉高并发(繁忙)的 provider。

区域敏感性策略

策略对应类名:ZoneAvoidanceRule

实现原理:

  • 以一个区域为单位考察可用性,对于不可用的区域整个丢弃,从剩下区域中选可用的 provider。
  • 如果这个 ip 区域内有一个或多个实例不可达或响应变慢,都会降低该 ip 区域内其他 ip 被选中的权 重。

Ribbon 入门案例

eureka-demo 聚合工程。SpringBoot 2.2.4.RELEASESpring Cloud Hoxton.SR1

Ribbon 中对于集群的服务采用的负载均衡策略默认是轮询。

创建项目

使用学习 Eureka 时的 eureka-demo 项目,在该项目中创建子项目 service-provider02

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CjXIVg3E-1613981820837)(https://mrhelloworld.com/resources/articles/spring/spring-cloud/ribbon/1578836785223.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fC5UGb71-1613981820838)(https://mrhelloworld.com/resources/articles/spring/spring-cloud/ribbon/image-20200213131503574.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rv6Kav3X-1613981820838)(https://mrhelloworld.com/resources/articles/spring/spring-cloud/ribbon/image-20200213131548627.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Egpv6VW9-1613981820839)(https://mrhelloworld.com/resources/articles/spring/spring-cloud/ribbon/image-20200213131647813.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pHUoPRSb-1613981820840)(https://mrhelloworld.com/resources/articles/spring/spring-cloud/ribbon/1578826063614.png)]

添加依赖

pom.xml

<?xml version="1.0" encoding="UTF-8"?>

4.0.0

<groupId>com.example</groupId>
<artifactId>service-provider02</artifactId>
<version>1.0-SNAPSHOT</version><!-- 继承父依赖 -->
<parent><groupId>com.example</groupId><artifactId>eureka-demo</artifactId><version>1.0-SNAPSHOT</version>
</parent><!-- 项目依赖 -->
<dependencies><!-- netflix eureka client 依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!-- spring boot web 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- lombok 依赖 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency><!-- spring boot actuator 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- spring boot test 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency>
</dependencies>

  

配置文件

application.yml

server:port: 7071 # 端口spring:application:name: service-provider # 应用名称(集群下相同)# 配置 Eureka Server 注册中心
eureka:instance:prefer-ip-address: true       # 是否使用 ip 地址注册instance-id: ${spring.cloud.client.ip-address}:${server.port} # ip:portclient:service-url:                  # 设置服务注册中心地址defaultZone: http://root:123456@localhost:8761/eureka/,http://root:123456@localhost:8762/eureka/# 度量指标监控与健康检查
management:endpoints:web:exposure:include: shutdown         # 开启 shutdown 端点访问endpoint:shutdown:enabled: true               # 开启 shutdown 实现优雅停服

服务及启动类

将所有代码复制粘贴一份至 server-provider02,修改启动类名称即可。

ServiceProvider02Application.java

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ServiceProvider02Application {

public static void main(String[] args) {SpringApplication.run(ServiceProvider02Application.class, args);
}

}

为了更直观的看到负载均衡的效果,我们在 service-consumer 项目中将服务地址打印至控制台。

注册中心

运行完整的 Eureka 环境,访问:http://localhost:8761/ 可以看到现在已经有两个服务提供者。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W16s6PZ1-1613981820841)(https://mrhelloworld.com/resources/articles/spring/spring-cloud/ribbon/1578826530501.png)]

消费服务

多次访问:http://localhost:9090/order/1 可以看到默认使用的是轮询策略。

Ribbon 负载均衡策略设置

全局

在启动类或配置类中注入负载均衡策略对象。所有服务请求均使用该策略。

@Bean
public RandomRule randomRule() {
return new RandomRule();
}

多次访问:http://localhost:9090/order/1 结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TmzW30PY-1613981820841)(https://mrhelloworld.com/resources/articles/spring/spring-cloud/ribbon/image-20200213133444394.png)]

局部

修改配置文件指定服务的负载均衡策略。格式:服务应用名.ribbon.NFLoadBalancerRuleClassName

# 负载均衡策略
# service-provider 为调用的服务的名称
service-provider:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

多次访问:http://localhost:9090/order/1 结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SeEAtV50-1613981820842)(https://mrhelloworld.com/resources/articles/spring/spring-cloud/ribbon/image-20200213133714557.png)]

Ribbon 点对点直连

点对点直连是指绕过注册中心,直接连接服务提供者获取服务,一般在测试阶段使用比较多。

添加依赖

在调用方 pom 文件中引入 ribbon 依赖,需要注意的是如果 pom 中有 Eureka 的依赖,则需要去除 Eureka 的依赖。

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

配置文件

配置文件中关闭 Eureka,添加直连的服务地址。如果不设置负载均衡策略默认使用轮询策略。

# 负载均衡策略
# service-provider 为调用的服务的名称
service-provider:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule# 点对点直连模式,指定具体的 Provider 服务列表,多个用逗号隔开listOfServers: http://localhost:7070,http://localhost:7071# 关闭 Eureka 实现 Ribbon 点对点直连
ribbon:eureka:enabled: false # false:关闭,true:开启

访问

关闭 Eureka 注册中心,服务提供者由于无法连接至注册中心所以会报连接异常。但是服务是可以正常可消费的,所以目前使用的是点对点的方式来进行调用的。

至此 Ribbon 负载均衡所有的知识点就讲解结束了。

今天要说的Spring Cloud 系列之 Netflix Ribbon 负载均衡篇暂时先说这么多,了解更多技术干货,关注公众号【乐字节发送123可了解,我们一起学习吖】,我是哩哩,一个有趣的灵魂!下期见!

Spring Cloud 系列之 Netflix Ribbon 负载均衡相关推荐

  1. Spring Cloud 系列之 Netflix Zuul 服务网关(三)

    本篇文章为系列文章,未读前几集的同学请猛戳这里: Spring Cloud 系列之 Netflix Zuul 服务网关(一) Spring Cloud 系列之 Netflix Zuul 服务网关(二) ...

  2. SpringCloud系列五:Ribbon 负载均衡(Ribbon 基本使用、Ribbon 负载均衡、自定义 Ribbon 配置、禁用 Eureka 实现 Ribbon 调用)...

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:Ribbon 负载均衡 2.具体内容 现在所有的服务已经通过了 Eureka 进行了注册,那么使用 Eureka 注册 ...

  3. 【小马哥】Spring Cloud系列讲座

    这里推荐一个不错的Spring Cloud系列讲座,讲师简介如下: 小马哥,阿里巴巴技术专家,从事十余年Java EE 开发,国内微服务技术讲师.目前主要负责微服务技术推广.架构设计.基础设施.迁移等 ...

  4. springcloud 网关_Spring Cloud 系列之 Netflix Zuul 服务网关(二)

    本篇文章为系列文章,未读第一集的同学请猛戳这里: 哈喽沃德先生:Spring Cloud 系列之 Netflix Zuul 服务网关(一)​zhuanlan.zhihu.com 本篇文章讲解 Zuul ...

  5. SpringCloud学习笔记(6)----Spring Cloud Netflix之负载均衡-Ribbon的使用

    1. 什么是负载均衡? 负载均衡,就是分发请求流量到不同的服务器. 负载均衡一般分为两种 1. 服务器端负载均衡(nginx) 2. 客户端负载均衡(Ribbon) 2. 服务提供者(spring-c ...

  6. spring cloud中通过配置文件自定义Ribbon负载均衡策略

    2019独角兽企业重金招聘Python工程师标准>>> spring cloud中通过配置文件自定义Ribbon负载均衡策略 博客分类: 微服务 一.Ribbon中的负载均衡策略 1 ...

  7. 最新版Spring Cloud Alibaba微服务架构-Ribbon负载均衡篇

    文章目录 前言 一.Ribbon核心概念 二.服务器端负载均衡和Riboon客户端负载均衡 1.服务器端负载均衡: 2.Riboon客户端负载均衡: 三.Ribbon策略 四.Ribbon配置使用 五 ...

  8. Spring Cloud概念+案例(eureka注册+拉取、ribbon负载均衡+重试)、netfix各组件介绍【上】

    Spring Cloud概念+案例(断路器)[下] https://blog.csdn.net/LawssssCat/article/details/104632719 [⭐️⭐️⭐️] Spring ...

  9. 微服务(三) 【手摸手带你搭建Spring Cloud】 Ribbon 什么是负载均衡?spring cloud如何实现负载均衡?ribbon负载均衡有几种策略?Ribbon是什么?

    在上一章,我介绍了springcloud的eureka搭建.我们做了服务注册.最后我们还介绍了一些续约,失效剔除等参数配置.已经不需要再通过手动输入ip去访问服务,而是通过中心只需要通过服务名就可以获 ...

最新文章

  1. 如何选择正确的RAID级别
  2. [Android]你不知道的Android进程化(4)--进程通信AIDL框架
  3. python原理及代码_lightgbm原理以及Python代码
  4. 【英语学习】【Level 07】U03 Amazing wonders L3 A pearl of East Asia
  5. endnote怎么和word关联_把Endnote装进大脑:行走的文献管理者
  6. Python出现AttributeError: module ‘tkinter‘ has no attribute ‘messagebox‘,已解决
  7. python爬虫怎么发布请求_http请求如何在python爬虫中实现?
  8. nginx 部署前端项目
  9. QCSPCChart SPC控制图工具软件是面向对象的工具包
  10. 计算机应用技术Word文档题目,计算机应用技术复习题(word版)
  11. (2) python--pandas
  12. Cortex-M3/M4(1)-处理器概述
  13. 只读ppt如何获得可编辑版本?
  14. Jenkins持续集成入门到精通
  15. python scipy.optimize.minimize多变量多参数优化
  16. AD15 原理图更新为PCB图遇到的错误及解决办法(footprint not found;unknown pin)
  17. IP地址,子网掩码、默认网关,DNS的设置和工作原理(总结)
  18. 文库网站建设小说在线阅读源码分享
  19. 代码高亮插件SyntaxHighlighter
  20. 呼死你泛滥 安全联盟提醒网民远离欺诈

热门文章

  1. SolidWorks Simulation曲线图属性设定
  2. Squire编辑器源码解读
  3. 赤峰公交出行-方便快捷
  4. 联通高管频频出走:通信业已成鸡肋?
  5. 关于操作系统安全补丁信息的查询
  6. 文件描述符与socket连接
  7. 西工大java实验报告给,春风又绿西工大,软酷实践让我忙
  8. 容器之 CGroup
  9. WP Rocket激活版 WordPress优化插件 v3.7.3
  10. 【SpringBoot系列】最详细demo- 集成Shiro权限管理