Ribbon

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套 客户端 负载均衡 的工具。

简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供 客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。

负载均衡 + RestTemplate 调用

将 LB 逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。

Ribbon 就属于进程内 LB,他只是一个类库,集成于消费方进程,消费方通过他来获取到服务提供方的地址。

  • 第一步:选择 EurekaServer,他优先选择在同一区域内负载较少的 server。
  • 第二步:再根据用户指定的策略,从 server 取到服务注册列表中选择一个地址。
  • 策略:轮询、随机和根据响应时间加权。

IRule:根据特定算法中从服务列表中选取一个要访问的服务。

  • com.netflix.loadbalancer.RoundRobinRule:轮询;
  • com.netflix.loadbalancer.RandomRule:随机;
  • com.netflix.loadbalancer.RetryRule:先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试,获取可用的服务;
  • WeightedResponseTimeRule:对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择;
  • BestAvailableRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务 ,然后选择一个并发量最小的服务;
  • AvailabilityFilteringRule:先过滤掉故障实例,再选择并发较小的实例;
  • ZoneAvoidanceRule:默认规则,复合判断server所在区域的性能和server的可用性选择服务器;

这个自定义配置类不能放在 @ComponentScan(启动类的同级或子级) 所扫描的当前包下以及子包下,否则我们自定义的这个配置类就会被所有的 Ribbon 客户端所共享,达不到特殊化定制的目的了。

package com.atguigu.myrule;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MySelfRule {

    @Bean
    public IRule myRule() {
        // 定义为随机
        return new RandomRule();
    }

}
package com.atguigu.springcloud;

import com.atguigu.myrule.MySelfRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;

@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = MySelfRule.class)
public class OrderMain80 {

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

}

@RibbonClient(name = “CLOUD-PAYMENT-SERVICE”, configuration = MySelfRule.class)
主要就是这一行注释:
name:客户端的名称,也就是需要请求的地址;
configuration:功能区客户端的自定义;

负载均衡算法:rest 接口第几次请求数 % 服务器集群总数量 = 实际调用服务器位置下标,每次服务重启动后 rest 接口计数从 1 开始。

List instances = discobveryClient.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;

如此类推…….

Original: https://www.cnblogs.com/lhnstart/p/16158103.html
Author: 李小龙他哥
Title: Ribbon

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/588702/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java面向对象(四)

    Java面向对象(四) Java面向对象(四) – 十一、package 关键字(拓展) 11.1 package 关键字的使用: 11.2 包的作用: 11.3 Ja…

    Java 2023年6月9日
    063
  • 5.0.SpringBoot整合Kafka(工具安装ZK)

    我们在使用Kafka的时候,是依赖于zookeeper的,所以我们先安装好工具在去集成,这样之后也能直接跑起来。 我是Windows系统所以直接安装Win版本的zk和Kafka(M…

    Java 2023年6月9日
    065
  • 基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.0.0版)

    TableGo_20210212 v7.0.0 正式版发布,此次版本更新如下:1、新增对DB2数据库的支持2、新增按字段生成文件,支持把字段、JSON、XML数据转换成任何代码3、…

    Java 2023年6月9日
    069
  • JVM内存结构的组成、各部分功能作用

    一、程序计数器 作用:是记住下一条jvm指令的执行地址 特点: 是线程私有的 不会存在內存溢出 二、虚拟机栈 每个线程运行时所需要的内存,称为虚拟机栈每个栈由多个栈帧(Frame)…

    Java 2023年6月8日
    065
  • 关于Springboot配置多数据源,这篇笔记太详细了!

    关于springboot配置多数据源,整理了这篇笔记,分享给有需要的小伙伴们,视频看的动力节点王鹤老师讲的springboot 目录结构 1. DataSourceConfigur…

    Java 2023年6月7日
    072
  • Java 面试题集锦

    第一阶段 1、重载(overload)和重写(overwrite)区别 重写:子类继承父类,子类重写父类的方法。重载: 2、StringBuffer、StringBuilder、S…

    Java 2023年6月9日
    058
  • springframework的ReflectionUtils反射工具类功能举例

    import com.shein.dms.common.BasicCase; import com.shein.dms.utils.MathUtils; import com.sh…

    Java 2023年5月30日
    070
  • 人生苦短,我用python

    今天开始自学Python。 找到神圣传说中的Python官网:https://www.python.org/,安装了Python3.6.5。 安装步骤省略。 安装requests库…

    Java 2023年6月7日
    083
  • 从零开始自己动手写阻塞队列

    从零开始自己动手写阻塞队列 前言 在我们平时编程的时候一个很重要的工具就是容器,在本篇文章当中主要给大家介绍阻塞队列的原理,并且在了解原理之后自己动手实现一个低配版的阻塞队列。 需…

    Java 2023年6月8日
    081
  • 利用docker部署oxidized网络设备备份系统

    随着网络设备的增多,通过人手备份网络设备倍感压力,而且效率低。有编程基础的人可能会通过Python的parimiko 或者netmiko 连接到设备操作 把文件通过ftp 上传到F…

    Java 2023年6月8日
    0161
  • Java基础知识点整理(2021年最新版)

    看了网上很多关于Java基础知识点整理的文章,但是感觉都不是很好,要么不全面,要么不准确,要么排版太乱了,所以今天整理了一份Java基础知识点整理(2021年最新版),希望对大家有…

    Java 2023年5月29日
    051
  • Arthas之实例操作

    Arthas之实例操作 1. 静态类属性操作 获取public静态属性 ognl -c 7cd84586 ‘@com.system.framework.ArtahsDemoClas…

    Java 2023年6月13日
    078
  • MyBatis的二级缓存

    二级缓存的原理 二级缓存的原理和一级缓存一样,第一次查询会将数据放到缓存中,然后第二次查询直接去缓存读取。 但是一级缓存是基于 SqlSession 的,二级缓存是基于 mappe…

    Java 2023年6月5日
    0108
  • SpringBoot自定义starter

    一、starter的构成 xxx-starter—–>xxx-starter-autoconfigurer 启动器—–>…

    Java 2023年5月30日
    074
  • Java中的命名规则

    在查找java命名规则时,未在国内相关网站查找到较为完整的文章,这是一篇国外程序开发人员写的java命名规则的文章,原文是英文写的,为了便于阅读,遂翻译为汉语,以便帮助国内开发者有…

    Java 2023年6月15日
    075
  • AQS源码阅读

    AQS-获取资源: AQS-释放资源: posted @2022-06-22 17:07 無名之徒 阅读(9 ) 评论() 编辑 Original: https://www.cnb…

    Java 2023年6月13日
    067
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球