前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >面试题110:什么是Ribbon?它的作用是什么?

面试题110:什么是Ribbon?它的作用是什么?

作者头像
爪哇缪斯
发布于 2023-05-10 02:55:13
发布于 2023-05-10 02:55:13
63500
代码可运行
举报
文章被收录于专栏:爪哇缪斯爪哇缪斯
运行总次数:0
代码可运行

【什么是Ribbon】

  • Spring Cloud Ribbon是一个基于HTTPTCP的客户端负载均衡工具,它基于Netflix Ribbon实现,通过Spring Cloud的封装,可以让我们轻松地将面向服务的Rest模板请求自动转换成客户端负载均衡的服务调用。
  • Ribbon只具有负载均衡的能力,并不具有发送请求的能力。所以,需要配合服务通信组件,如:RestTemplate

【Ribbon在微服务中扮演的角色】

  • Ribbon实现了从注册中心中获取服务列表的能力。
  • 然后通过获取到的服务列表,采用负载均衡算法(Ribbon默认采用的是轮训方式),利用通信框架(RestTemplate或Feign等)进行服务调用。

【通信的三种方式】

  • 有三种方式可以实现基于服务名+负载均衡的服务间通信方式。分别是:
  • DiscoveryClient + 自己实现负载均衡 + RestTemplate
  • LoadBalanceClient + RestTemplate
  • @LoadBalanced + RestTemplate
  • 下面就来介绍一下这三种通信方式如何实现

【准备工作】

  • 首先启动Nacos,两个项目都加入Nacos的依赖
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  • 其次,在application.yml配置文件中加入Nacos的配置信息
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server:
  port: 7000
spring:
  application:
    name: ribbon-producer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server:
  port: 7002
spring:
  application:
    name: ribbon-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

【方式一:DiscoveryClient】

  • 优点:客户获得指定服务名称下的所有服务实例。
  • 缺点:没有负载均衡,需要通过获取服务列表,来编程实现负载均衡。
  • DiscoveryClient的实现类是NacosDiscoveryClient
  • 实现方式(【注意】不能加@LoadBalanced,否则请求失败)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Resource
private DiscoveryClient discoveryClient;

/**
 * 使用DiscoveryClient获取服务列表进行随机服务调用(http://localhost:7002/consumer/discoveryClient)
 */
@GetMapping("/discoveryClient")
public String discoveryClient() {
    log.info("discoveryClient invoke!");
    // 获得服务id下的服务信息
    List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("ribbon-producer");
    serviceInstanceList.forEach(serviceInstance -> log.info("host={}, port={}, uri={}", 
            serviceInstance.getHost(), serviceInstance.getPort(), serviceInstance.getUri()));
  // 自实现具体服务的请求
    int num = new Random().nextInt(serviceInstanceList.size());
    URI uri = serviceInstanceList.get(num).getUri();
    log.info("num={}, uri={}", num, uri);
    return restTemplate.getForObject( uri + "/provider/hello", String.class);
}

【方式二:LoadBlanceClient】

  • 优点:自带负载均衡算法,不需要自己实现了。
  • 缺点:使用时需要每次先根据服务id获取一个负载均衡机器,然后再通过RestTemplate调用服务。
  • LoadBalanceClient的实现类是RibbonLoadBalancerClient
  • 实现方式(【注意】不能加@LoadBalanced,否则请求失败)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Resource
private LoadBalancerClient loadBalancerClient;

/**
 * 使用LoadBalancerClient自带的负载均衡功能执行服务调用
 *(http://localhost:7002/consumer/loadBalancerClient)
 */
@GetMapping("/loadBalancerClient")
public String loadBalancerClient() {
    log.info("loadBalancerClient invoke!");
    // 获得负载均衡实例
    ServiceInstance serviceInstance = loadBalancerClient.choose("ribbon-producer");
    log.info("uri={}", serviceInstance.getUri());
    return restTemplate.getForObject(serviceInstance.getUri()+"/provider/hello", String.class);
}

【方式三:@LoadBalanced】

  • 基于LoadBalanceClient,提供了使用更方便的@LoadBalanced注解。
  • 优点:使得RestTemplate实例具有了负载均衡的能力,不需要特殊调用loadBalanceClient实例的choose方法获得负载均衡计算出的实例了。使用方式,跟普通RestTemplate一样。非常简单。
  • 缺点:依然还需要指定请求的uri和返回值类型。调用依然没有基于rpc方式简洁和直观。
  • 修饰范围:方法上。
  • 作用:让restTemplate具有ribbon负载均衡特性。使用更简单。
  • 实现方式
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Bean
@LoadBalanced // 增加LoadBalanced注解
public RestTemplate restTemplate() {
    return new RestTemplate();
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 使用@LoadBalanced修饰的RestTemplate来执行具有负载均衡功能的服务调用
 *(http://localhost:7002/consumer/loadBalancerAnnotation)
 */
@GetMapping("/loadBalancerAnnotation")
public String loadBalancerAnnotation() {
    log.info("loadBalancerAnnotation invoke!");
    // 获得负载均衡实例
    return restTemplate.getForObject("http://ribbon-producer/provider/hello", String.class);
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 爪哇缪斯 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Ribbon负载均衡
文章目录 1、Ribbon基础知识 2、Ribbon服务调用 2.1 项目中引入依赖 2.2 查看consul client中依赖的ribbon 2.3 启动consul服务注册中心 2.4 将订单服务进行注册 2.5 将RestTemplate交给Spring工厂去管理 2.6 使用RestTemplate+ribbon进行服务调用 2.6.1 使用discovery client形式调用 2.6.2 使用LoadBalancerClient形式调用 2.6.3 使用 @LoadBalanced注解
别团等shy哥发育
2023/02/25
3610
Ribbon负载均衡
SpringCloud Nacos + Ribbon 调用服务的 2 种方法!
在 Nacos 中,服务调用主要是通过 RestTemplate + Ribbon 实现的,RestTemplate 是 Spring 提供的 Restful 请求实现类,而 Ribbon 是客户端负载均衡器,通过 Ribbon 可以获取服务实例的具体信息(IP 和端口号),之后再通过 RestTemplate 加服务实例的具体信息就可以完成一次服务调用了。 ​
磊哥
2022/05/10
2.3K0
SpringCloud Nacos + Ribbon 调用服务的 2 种方法!
SpringCloud服务间通信方式
接下来在整个微服务架构中,我们比较关心的就是服务间的服务改如何调用,有哪些调用方式? 总结:在springcloud中服务间调用方式主要是使用 http restful方式进行服务间调用 1. 1基于
用户4283147
2022/10/27
4610
SpringCloud服务间通信方式
SpringCloud集成Ribbon
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。
大忽悠爱学习
2021/12/07
3060
SpringCloud集成Ribbon
Spring Cloud【Finchley】-04使用Ribbon实现客户端负载均衡
Spring Cloud-03将微服务注册到Eureka Server上 + 为Eureka Server添加用户认证中遗留的问题还记得吧 ,对,服务消费者调用服务提供者是硬编码的方式,虽然把地址配置到了application.yml中,但是一旦服务端的地址发生改变,那肯定是要修改配置文件的。
小小工匠
2021/08/17
4970
SpringCloud——Ribbon&OpenFeign
今天我们针对SpringCloud中服务之间的通讯方式全面的聊一聊。如下是本篇文章的大纲
爪哇缪斯
2023/05/10
4420
SpringCloud——Ribbon&OpenFeign
springboot在后端通过网址调用其他后端的接口的两个方法
通过restTemplate 直接调用 RestTemplate restTemplate = new RestTemplate(); String s = restTemplate.getFor
知识浅谈
2020/12/28
1.8K0
8848钛金手机之nacos的注册发现
朋友,你看过那个弥漫着奢华尊贵的8848钛金手机的广告吗?对就是一个光头还有王石代言的那个,可以被制作成多种鬼畜的那个。8848的含义到底是啥?和注册发现服务nacos 又有啥关系?
酒馆丁老师
2020/09/08
1.2K0
8848钛金手机之nacos的注册发现
SpringCloud客户端负载均衡器Ribbon
cheese
2023/10/25
3560
SpringCloud客户端负载均衡器Ribbon
Spring Boot + Spring Cloud 实现权限管理系统
1. 使用 RestTemplate 进行服务调用,可以通过 Ribbon 注解 RestTemplate 模板,使其拥有负载均衡的功能。
朝雨忆轻尘
2019/06/18
6570
Ribbon 负载均衡服务调用
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。
用户9615083
2022/12/25
5330
Ribbon 负载均衡服务调用
Spring Cloud 入门之 Ribbon 篇
本篇文章将介绍如何使用 Ribbon 完成发现服务的调用以及其负载均衡的规则的使用。 Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端负载均衡工具,其主要功能是提供客户端的软件负载均衡算法,将 Netflix 的中间层服务连接在一起。
崔笑颜
2020/06/08
3330
微服务(六)——Ribbon负载均衡服务调用
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。
不愿意做鱼的小鲸鱼
2022/09/26
3240
微服务(六)——Ribbon负载均衡服务调用
Ribbon负载均衡算法
负载均衡算法:rest接口第几次请求数 % 服务器集群总数量 = 实际调用服务器位置下标  ,每次服务重启动后rest接口计数从1开始。 List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE"); 如:   List [0] instances = 127.0.0.1:8002    List [1] instances = 127.0.0.1:8001 8001+ 8002 组合成为集群,它们共计2台机器,集群总数为2, 按照轮询算法原理: 当总请求数为1时: 1 % 2 =1 对应下标位置为1 ,则获得服务地址为127.0.0.1:8001 当总请求数位2时: 2 % 2 =0 对应下标位置为0 ,则获得服务地址为127.0.0.1:8002 当总请求数位3时: 3 % 2 =1 对应下标位置为1 ,则获得服务地址为127.0.0.1:8001 当总请求数位4时: 4 % 2 =0 对应下标位置为0 ,则获得服务地址为127.0.0.1:8002 如此类推......
一个风轻云淡
2022/11/13
3910
Ribbon负载均衡算法
09-SpringCloud Ribbon
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。
彼岸舞
2021/08/24
3620
Spring Boot + Spring Cloud 构建微服务系统(二):服务消费和负载(Ribbon)
在上一篇教程中,我们是这样调用服务的,先通过 LoadBalancerClient 选取出对应的服务,然后使用 RestTemplate 进行远程调用。
朝雨忆轻尘
2019/06/19
6380
Spring Boot + Spring Cloud 构建微服务系统(二):服务消费和负载(Ribbon)
1.1 自定义负载均衡器
我们现在有两个服务, 一个getway服务, 另一个是order服务. 使用的是nacos管理配置文件和服务注册中心
用户7798898
2020/09/27
1.1K0
1.1 自定义负载均衡器
Spring Cloud 系列之负载均衡 Ribbon
  Ribbon 是 Netflix 发布的负载均衡器,它有助于控制 HTTP 和 TCP 客户端的行为。为 Ribbon 配置服务提供者地址列表后,Ribbon 就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon 默认为我们提供了很多的负载均衡算法,例如轮询、随机等。当然,我们也可为 Ribbon 实现自定义的负载均衡算法。Ribbon 现在已经进入维护状态,但目前仍在大规模使用,Spring Cloud 准备使用 LoadBalancer 作为 Ribbon 的替换方案。
Demo_Null
2020/11/11
9080
Spring Cloud 系列之负载均衡 Ribbon
Spring Cloud框架(原生Hoxton版本与Spring Cloud Alibaba)初级篇 ---- 服务调用
官方文档:https://docs.spring.io/spring-framework/docs/5.2.2.RELEASE/javadoc-api/org/springframework/web/client/RestTemplate.html
百思不得小赵
2022/12/01
3010
Spring Cloud框架(原生Hoxton版本与Spring Cloud Alibaba)初级篇 ---- 服务调用
Nacos Discovery--服务治理
通过上一章的操作,我们已经可以实现微服务之间的调用。但是我们把服务提供者的网络地址(ip,端 口)等硬编码到了代码中,这种做法存在许多问题:
IT小马哥
2021/02/01
1.2K0
Nacos Discovery--服务治理
相关推荐
Ribbon负载均衡
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文