Spring Cloud——ribbon(简介、快速入门、负载均衡理解)

概述

Spring Cloud Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它基于 Netflix Ribbon 实现。通过 Spring Cloud 的封装,可以让我们轻松地将面向服务的 REST 模版请求 自动转换成客户端负载均衡的服务调用。
简单的说 Ribbon 就是 netfix 公司的一个开源项目,主要功能是提供客户端负载均衡算法和服务调用。Ribbon 客户端组件提供了一套完善的配置项,比如连接超时,重试等。
Ribbon 作为服务消费者的负载均衡器,有两种使用方式,一种是和RestTemplate 相结合,另一种是和 OpenFeign 相结合。OpenFeign 已经 默认集成了 Ribbon

负载均衡

负载均衡,英文名称为 Load Balance(LB)http:// lb://(负载均衡协议) ,其含义 就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如 Web 服务器、 企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。
负载均衡构建在原有网络结构之上,它提供了一种透明且廉价有效的方法扩展服务器和网络设 备的带宽、加强网络数据处理能力、增加吞吐量、提高网络的可用性和灵活性。

快速入门

调用设计图

在这里插入图片描述
consumer、provider-1、provider-2都在注册中心中注册,现在consumer想调用的方法在provider-1和provider-2中都有(他俩是集群),那么如何有效合理调用则是ribbon做的工作。

搭建步骤

1、创建一个Maven工程,在其下创建provider-a、provider-b

创建provider-a时,需要导入依赖
在这里插入图片描述
更改版本2.3.12 Hoxton.SR12
在这里插入图片描述

写YML文件

server:
  port: 8080
spring:
  application:
    name: provider-a
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
  instance:
    hostname: localhost
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}

再建一个b,如上,把端口改成8081

2.创建consumer

添加依赖
在这里插入图片描述

修改pom中版本,yml跟之前一样,修改端口号为8082,启动类中添加启动客户端注解

在启动类中添加一个RestTemplate

@Bean
@LoadBalanced //这个用于之后的url识别,会被Ribbon来操作
public RestTemplate restTemplate(){
    return new RestTemplate();
}

创建controller,添加以下代码

@Autowired
private RestTemplate restTemplate;

@GetMapping("testRibbon")
public String testRibbon(String serverName){
    //正常需要ip和port以及路径
    String str=restTemplate.getForObject("http://"+serverName+"/hello",String.class);
    return str;
}

进行测试,不断刷新页面,会发现每次调用不同接口:
在这里插入图片描述
在这里插入图片描述

@LoadBalanced注解所做工作

将http://provider-a/hello变成http://localhost:8080(8081)/hello
1.拦截restTemplate请求
2.截取主机名称
3.借助eureka来做服务发现 List<>
4.通过负载均衡算法,拿到一个服务ip port
5.reConstructURL
6.发起请求

负载均衡理解

  • 当添加@LoadBalanced注解后,则RestTemplate就被Ribbon操作了
  • 当consumer想要调用provider中的方法时,provider还没注册,或者consumer的拉取之前provider才进行注册,则无法调用到,最好先启动provider,再启动consumer
  • 轮训算法实现:int index = 1 % size list.get(index);,取模的好处是一个周期函数,让得到的记过总是小于除数,一般制定一个i,让i++,但这样是线程不安全的,所以会加一个锁,CAS自旋锁,优点是性能好,java层面无锁的状态,但在jvm层面有锁的cmpxy,缺点是短暂时间会让cup飙升
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值