首页 > 其他分享 >Ribbon服务调用+负载均衡(入门)

Ribbon服务调用+负载均衡(入门)

时间:2023-01-14 22:57:01浏览次数:36  
标签:负载 调用 服务 入门 均衡 id Ribbon

1、Ribbon

Ribbon中文:(用于捆绑或装饰的)带子; 丝带; 带状物;

主要功能是提供客户端的软件负载均衡算法服务调用

Ribbon已经进入了维护模式了,但是Ribbon仍然被广泛使用中

①.Nginx和Ribbon的区别

Nginx是服务器的负载均衡,客户端将所有请求给Nginx,Nginx实现转发。辅助均衡通过服务端实现。

而Ribbon是本地的负载均衡,在调用微服务的接口的时候,会在注册中心获取注册信息服务列表之后缓存到JVM,之后就在本地实现RPC调用了。

②.什么是Ribbon

负载均衡+restTemplate实现远程调用

Ribbon是一个软负载均衡客户端组件,可以和其他所需请求的客户端结合使用,比如Eureka......

③.Ribbon工作流程

  1. 选择EurekaServer,优先选一个负载较少的Server
  2. 根据用户指定的策略,从server渠道的服务注册表中选一个地址(Ribbon提供多种策略:轮询、随机、响应事件加权)

2、演示

①.为什么之前支持负载均衡?

在微服务注册中心的笔记中,没有单独显示Ribbon的引用,同样能实现负载均衡

原因:之前我们在使用eureka注册中心的时候引入了如下的依赖:

<!--eureka-client-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

通过Maven能够看到也引入了Ribbon

image-20230114210728085

同样能够看到使用zookeeper和consul都有ribbon这个依赖

image-20230114210852058

image-20230114210908472

②.RestTemplate

RestTemplate有两个方法:

  1. getForObject或者getForEntity方法

  2. postForObject或者postForEntity方法

ForObject和ForEntity的区别

ForObject返回为响应体中数据转化成的对象,可以理解为json

FoeEntity返回对象为ResponseEntity对象,包含响应中的一些重要信息,比如响应头响应的状态码响应体

一.ForObject(推荐这个)

@GetMapping("/consumer/payment/get/{id}")
public CommonResult<Payment> getPayment(@PathVariable("id") Long id){
    return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);
}

image-20230114212324751

二.ForEntity

@GetMapping("/consumer/payment/getForEntity/{id}")
public CommonResult<Payment> getPayment2(@PathVariable("id") Long id){
    ResponseEntity<CommonResult> entity =restTemplate.getForEntity(PAYMENT_URL+"/payment/get/"+id, CommonResult.class);
    //成功
    if (entity.getStatusCode().is2xxSuccessful()){
        return entity.getBody();
    }else {
        return new CommonResult<>(444,"get fail");
    }
}

image-20230114212237991

3、负载均衡算法

①.算法有哪些

Rabbion负载均衡算法:

  1. (默认)RoundRobinRule(轮询)
  2. RandomRule(随机)
  3. RetryRule(按照RoundRobinRule即轮询获取服务,如果获取服务失败则在指定时间内进行重试,获取可用的服务)
  4. WeightResponseTimeRule(对RoundRobinRule的拓展,响应速度越快的实例选择的权重越大)
  5. BestAvailableRule(过滤多次故障处于断路器跳闸状态的服务,然后选一个并非量最小的服务)
  6. AvailabilityFilteringRule(先过滤故障实例,然后选择并发量比较小的实例)
  7. ZoneAvoidanceRule(默认规则,复合判断server所在的区域的性能和server的可用性选择服务器)
  8. 1.RoundRobinRule

②.RoundRobinRule原理

负载均衡算法:

rest接口第几次条用数%服务器集群总数=实际的调用位置下标,每次服务重启动后rest接口计数从1开始

例:

总台数:2

List=2 instance

第一次调用:1%2 ---->index=1 list.get(Index)

第二次调用:2%2 ---->index=0 list.get(Index)

第三次调用:3%2 ---->index=1 list.get(Index)

4、替换默认负载均衡算法

自定义的配置类不能放在@ComponentScan所扫描的当前包下以及子包下

否则我们自定义的配置类会被所有Ribbon客户端共享(即多个调用服务会使用同一个IRule规则)

多个调用服务会使用同一个IRule规则:

比如order想要调用payment服务和user服务,调用payment使用轮询,调用user使用随机规则。这样就区分了Ribbon的负载均衡算法

解释:

Springboot启动类:在springcloud这个包下,其中一个注解@SpringBootApplication

image-20230114213855435

如下图所示,@ComponentScan在是springclooud这个类下,所以我们的Ribbon配置类不能放在springcloud包及其子包内

image-20230114214014211

上面的解释理清了Ribbon配置类的位置要求,下面编写配置类

1.新建myrule包,与springcloud包同级

image-20230114214704277

2.编写配置类

@Configuration
public class MyselfRule {
    @Bean
    public IRule myRule(){
        return new RandomRule();//随机规则
    }
}

3.配置Client的负载均衡规则

修改启动类的注解

@SpringBootApplication
@EnableEurekaClient
//name 需要访问的微服务的名称 ,configuration为负载均衡规则的配置类
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration = MyselfRule.class)
public class OrderMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderMain80.class,args);
    }
}

RibbonCilent需要调用CLOUD-PAYMENT-SERVICE

image-20230114215628836

测试:

经过5次调用,可以看到Ribbon的负载均衡算法从默认的轮询替换为了随机

image-20230114220348362

标签:负载,调用,服务,入门,均衡,id,Ribbon
From: https://www.cnblogs.com/zko0/p/17052734.html

相关文章

  • Ribbon和RestTemplate负载均衡
    Ribbon实现负载均衡官方文档:​​https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/2.2.0.M3/reference/html/#spring-cloud-ribbon​​文章目录​​项目......
  • Elasticsearch 入门:安装 curl 及加载案例数据
    curl是利用URL语法在命令行方式下工作的开源文件传输工具。关于curl的介绍,参考官网:​​https://curl.haxx.se/​​安装curlwgethttp://curl.haxx.se/download/curl-7......
  • Elasticsearch 入门:CentOS 5.6 安装 Elasticsearch 5.0
    0.操作系统:CentOSrelease5.6i686athloni386GNU/Linux1.安装javajdk1.8(参考:​​Centos6.5安装java及设置默认jdk版本​​)2.下载安装包:​​​elasticsearch-5.......
  • 230114_50_SpringBoot入门
    主启动类详解packagecom.bill;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;@Spr......
  • [VueJsDev] 快速入门 - vue项目根目录配置文件
    vue项目根目录配置文件:::details目录目录​vue项目根目录配置文件​​​Part.1:package.json-入口文件​​​​Part.2:jsconfig.json-舒适度文件​​​​Part.3......
  • [VueJsDev] 快速入门 - vscode 设置推荐
    vscode设置推荐:::details目录目录​vscode设置推荐​​​Edit.1:GotoLocation​​​​Flow.2:创建tag并送到远程​​:::一些常用设置Edit.1:GotoLocationvscode......
  • [VueJsDev] 快速入门 - vscode 自动格式化
    vscode自动格式化(vue):::details目录目录​vscode自动格式化(vue)​​​Step.1:.editorconfig​​​​Step.2:jsconfig.json​​​​Step.3:.eslintrc.js​​​......
  • [VueJsDev] 快速入门 - vscode 插件推荐
    Vscode插件推荐:::details目录目录​Vscode插件推荐​​​Font.1:字体推荐​​​​Them.2:Ayu主题​​​​Them.3:SpacegrayVSCode​​​​Plug.4:Veturvue2......
  • Apifox入门
    前言本篇博客意在简化官方文档,提炼出使用Apifox必要的一些知识,如果时间充裕,请完整阅读官方文档。1.简介国产版的postman,目前团队人数不设上限,不收费。这也是启用postman......
  • SpringBoot——核心原理入门
    SpringBoot概述BuildAnythingwithSpringBoot:**SpringBootisthestartingpointforbuildingallSpring-basedapplications.SpringBootisdesignedtoget......