负载均衡调用——Ribbon

Ribbon入门使用 Ribbon的简要入门使用 阅读详情

一、简介

1.开源代码库

https://github.com/Netflix/ribbon

2、Ribbon是什么

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

3、Ribbon能干什么

Ribbon是部署在客户端的IPC库,提供以下功能:

  • 客户端负载均衡
  • 容错处理
  • 支持多协议的异步通信。支持HTTP、TCP、UDP协议。
  • 支持缓存和批量处理

Ribbon模块介绍:

Ribbon由多个组件组成,其中一些组件在内部用于生产,随着时间的推移,其中的一些组件已被非OSS解决方案所取代。这是因为Netflix开始着手于针对单一职责模块的RPC更加组件化的体系结构。因此,此时每个Ribbon功能区组件都会受到不同程度的关注。

  • ribbon: Ribbon功能应用入口。使用Ribbon的功能可以通过初始化应用入口,调用接口实现。该模块依赖其他模版实现所需功能,比如容错处理ribbon依赖Histrix。
  • ribbon-loadbalancer:负载均衡功能入口。如果仅需要负载均衡功能,可以使用单独使用该模块。
  • ribbon-eureka:基于Eureka客户端实现可用服务列表管理
  • ribbon-transport: 具备客户端负载均衡能力的,基于RxNetty框架能够支持HTTP、TCP、UDP协议的通信客户端。
  • ribbon-httpclient: 具备客户端负载均衡能力的,基于Apache HttpClient,支持REST风格的HTTP请求客户端。
  • ribbon-core: 客户端配置APIs和其他共享APIs。
  • ribbon-example:使用例子。

从官网源码仓库得知,当前项目已进入维护状态,但有些功能还是在生产中大规模部署的,在将来会被 Spring Cloud Loadbalancer替代(参考:https://spring.io/blog/2018/12/12/spring-cloud-greenwich-rc1-available-now)

3、架构说明

在这里插入图片描述

Ribbon其实就是一个软负载均衡的客户端组件,他可以和其他所需请求的客户端结合使用,和eureka结合只是其中的一个实例。Ribbon在工作的时候分两步:

  1. 先选择EurekaServer,优选选择同一个区域内负载较少的Server;
  2. 根据用户指定的策略,从Server取到的服务注册列表中选择一个地址。

其中Ribbon提供了多种的负载均衡策略,如轮询、随机和根据响应时间加强等。

4、ribbon与nginx对比

Ribbon客户端负载均衡和Nginx服务端负载均衡的区别:

  • Nginx是服务器负载均衡,客户端所有请求都会交给Nginx,然后由Nginx实现转发请求,即负载均衡是由服务端实现的。
  • Ribbon是本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。

负载均衡又分为两类,分别可以对应于Nginx和Ribbon:

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

二、springboot中使用ribbon

1、pom依赖

在服务消费端使用ribbon

ribbon的依赖为:

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    <version>2.2.1.RELEASE</version>
    <scope>compile</scope>
</dependency>

而eureka的依赖为:

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

通过分析我们可以发现后者包含前者,所以通常引入后者即可

在这里插入图片描述

2、ribbon的负载均衡算法

在这里插入图片描述

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

这些负载均衡算法均是抽象类com.netflix.loadbalancer.AbstractLoadBalancerRule的实现,而抽象类实现了IRule接口。

3、ribbon算法的实现

官方文档明确给出了警告:自己自定义的轮询算法配置类不能放在@ComponentScan注解所扫描的当前包下以及子包下,否则自定义的这个配置类就会被所有Ribbon客户端所共享,就打不到特殊化定制的目的了,换句话说,如果这个配置类我们能够被@ComponentScan注解扫描到,那么访问所有的微服务提供方的具体实例时,我们都会采取配置类中的算法,如果要特殊化定制——即指定访问某些微服务提供方时采用配置的轮询算法,那么我们就应该使这个配置类让@ComponentScan注解扫描不到,我们知道,在主启动类的@SpringBootApplication注解中,其实这个注解包含了@SpringBootConfiguration 、@EnableAutoConfiguration、@ComponentScan这三个注解,所以我们写的轮询算法配置类不能和主启动类在同一个包下,所以我们需要建新的包,实现定制轮询算法的配置类

  • 项目结构

在这里插入图片描述

  • 主启动类
package org.jun;

import org.Rule.myRule;
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;

/**
 * @author junfeng.lin
 * @date 2021/2/10 11:45
 */
@SpringBootApplication
@EnableEurekaClient
//访问的微服务名称,采用配置文件中的算法
@RibbonClient(name = "eureka-order" ,configuration = myRule.class)
public class RibbonClient80 {
    public static void main(String[] args) {
        SpringApplication.run(RibbonClient.class ,args);
    }
}

4、负载均衡算法原理(轮询算法)

  • 轮询负载均衡算法原理

    实际调用的服务实例下标 = Rest接口第几次请求数 % 服务器集群总数量

    //获取服务列表的信息(所有服务名)
    List<String> services = discoveryClient.getServices();
          
    //根据微服务名称获取具体服务实例
    List<ServiceInstance> instances = discoveryClient.getInstances("service-nae");
    
  • 轮询负载均衡算法源码分析——choose()方法获取要选择的服务

private AtomicInteger nextServerCyclicCounter;

public RoundRobinRule() {
    //初始化下标为0,是原子类
    this.nextServerCyclicCounter = new AtomicInteger(0);
}

public Server choose(ILoadBalancer lb, Object key) {
    //如果没有开启负载均衡则返回空
    if (lb == null) {
        log.warn("no load balancer");
        return null;
    } else {
        Server server = null;
        int count = 0;

        while(true) {
            if (server == null && count++ < 10) {
                //获取所有存活的服务
                List<Server> reachableServers = lb.getReachableServers();
                //获取所有服务
                List<Server> allServers = lb.getAllServers();
                int upCount = reachableServers.size();
                int serverCount = allServers.size();
                if (upCount != 0 && serverCount != 0) {
                    //获取选中的服务列表的下标
                    int nextServerIndex = this.incrementAndGetModulo(serverCount);
                    //根据下标获取对应的服务
                    server = (Server)allServers.get(nextServerIndex);
                    if (server == null) {
                        Thread.yield();
                    } else {
                        if (server.isAlive() && server.isReadyToServe()) {
                            return server;
                        }

                        server = null;
                    }
                    continue;
                }

                log.warn("No up servers available from load balancer: " + lb);
                return null;
            }
            //如果超过10次获取不到服务则返回空
            if (count >= 10) {
                log.warn("No available alive servers after 10 tries from load balancer: " + lb);
            }

            return server;
        }
    }
}

private int incrementAndGetModulo(int modulo) {
    int current;
    int next;
    do {
        current = this.nextServerCyclicCounter.get();
        next = (current + 1) % modulo;
    } while(!this.nextServerCyclicCounter.compareAndSet(current, next));  //通过自旋锁获取下标值

    return next;
}

5、自定义负载均衡算法

  • 由于使用了自定义的负载均衡算法,则RestTemplcate的负载均衡注解可以去掉
@Configuration
public class ApplicationContextConfig {
    @Bean
//    @LoadBalanced//使用该注解赋予RestTemplate负载均衡的能力
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}
  • 自定义负载均衡算法接口与实现类
import org.springframework.cloud.client.ServiceInstance;

import java.util.List;

/**
 * @author junfeng.lin
 * @date 2021/2/10 11:52
 */
public interface LoadBalancer
{
    ServiceInstance instances(List<ServiceInstance> serviceInstances);
}

import org.springframework.cloud.client.ServiceInstance;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author junfeng.lin
 * @date 2021/2/10 11:52
 */
@Component
public class MyLoadBalancer implements LoadBalancer
{

    private AtomicInteger atomicInteger = new AtomicInteger(0);

    public final int getAndIncrement()
    {
        int current;
        int next;

       do {
            current = this.atomicInteger.get();
            next = current >= 2147483647 ? 0 : current + 1;
        }while(!this.atomicInteger.compareAndSet(current,next));
        System.out.println("服务列表下标为: "+next);
        return current;
    }

    //负载均衡算法:rest接口第几次请求数 % 服务器集群总数量 = 实际调用服务器位置下标  ,每次服务重启动后rest接口计数从0开始。
    @Override
    public ServiceInstance instances(List<ServiceInstance> serviceInstances)
    {
        int index = getAndIncrement() % serviceInstances.size();

        return serviceInstances.get(index);
    }
}
  • 在Controller中使用
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private MyLoadBalancer myLoadBalancer;
@GetMapping("/myLoadBalancerGetPort")
public String myLoadBalancerGetPort() {
    //根据微服务名称获取具体服务实例
    List<ServiceInstance> instances = discoveryClient.getInstances("eureka-order");
    if (instances == null || instances.size() <= 0) {
        return null;
    }
    //调用自定义负载均衡类获取服务对象
    ServiceInstance instance = myLoadBalancer.instances(instances);
    //获取服务对象的统一资源标志符
    URI uri = instance.getUri();
    String port = restTemplate.getForObject(uri + "/getPort", String.class);
    return port;
}
  • 效果:通过debug模式查看,每次都是轮询的方式选择服务列表的服务

在这里插入图片描述
在这里插入图片描述

Ribbon 负载均衡 及 Feign消费者调用服务 Ribbon 负载均衡 及 Feign消费者调用服务微服务调用RibbonRibbon负载均衡Feign简介及应用 本章知识: 1、微服务调用Ribbon 2、Ribbon负载均衡 3、Feign简介及应用 微服务调用Ribbon Ribbon 简介: 我在前面的博客中讲了Eureka服务注册与发现,但是结合Eureka集群的服务调用没讲。 这里的话 就要用到 Ribbon ,结合Eureka,来... 阅读详情

相关推荐

SpringCloudAlibaba整合Ribbon实现负载均衡调用

之所以创建俩个RestTemplate,主要是因为如果只是用@LoadBalanced,注解会在 RestTemplate 中加入拦截器,在将服务名转换成具体的 IP 地址和端口号,并将请求发送到具体的服务实例中,如果调用的服务用的是IP而不是实例名,会报(创建20230428_V1.0_Ribbon_Order,并注册到Nacos注册中心,创建俩个服务20230428_V1.0_Ribbon_User集群分别为不同端口注册到Nacos注册中心,这样订单服务就可以通过RPC访问用户服务查询用户信息了。

大道至简,悟在天成。 976

Ribbon负载均衡服务调用

Ribbon负载均衡服务调用Ribbon 概念 Ribbon 概念 SpringCloud Ribbon 是基于Netflix Ribbon 实现的一套客户端负载均衡工具。简单的说,Ribbon 是Netflix发布的开源项目,主要功能是:提供客户端软件负载均能算法和服务调用。 ...

陌守 8429

Python实战:用MNE-Python从脑电数据中提取P300成分(附完整代码)

本文提供了一份使用MNE-Python从脑电数据中提取P300成分的完整实战指南。通过详细的代码示例,系统讲解了从环境搭建、数据加载、预处理(滤波、分段、伪迹剔除)到P300波形提取、可视化与参数量化的全流程。重点介绍了如何利用零相位滤波和叠加平均技术,从EEG信号中精准分离出反映认知加工的P300事件相关电位,适用于脑机接口与认知神经科学研究。

weixin_29240343的博客 338

ribbon

什么是Ribbon? 是一套客户端负载均衡的工具…负载均衡就是将用户的请求平摊的分配到多个服务器上,从而达到系统的高可用. 如何使用 1.导入ribbon依赖 org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.springframework.cloud spring-cloud-starter-netf...

hhhhhhhr的博客 657

Maya vray 3S皮肤材质球设置与材质节点连接

Maya vray 3S皮肤材质球设置与材质节点连接

WETQETF的博客 2697

泛微E9开发 明细表字段赋值到主表字段,将各类型合计赋值到主表类型合计中

①绑定明细表类型、预计金额字段的值改变事件,每当有值发生改变,就需要重新计算供应商1、供应商2、供应商3的合计,如果不绑定这两个字段的话,会出现计算不及时或计算错误的问题。②当有明细行被删除时,也需要重新计算供应商1、供应商2、供应商3的合计,比如删除了供应商1的明细行,如果不重新计算,那么供应商1的值还是被删之前的值,合计错误。将各类型合计赋值到主表类型合计中。

a_waste_only的博客 3836

SpringCloud微服务之——Ribbon

Ribbon简介 需要解决的问题: ① 如何在配置Eureka Client注册中心时不去硬编码Eureka Server的地址? ② 在微服务不同模块间进行通信时,如何不去硬编码服务提供者的地址? ③ 当部署多个相同微服务时,如何实现请求时的负载均衡? 实现负载均衡方式1:通过服务器端实现负载均衡(nginx) 实现负载均衡方式2:通过客户端实现负载均衡。 Ribbon是什么? Ribbon是Netflix发布的云中间层服务开源项目,其主要功能是提供客户端实现负载均衡算法。Ribbon客户端组件提供一系

linchusen的博客 798

Vivado ILA抓DDR信号(各种IO信号:差分、ISERDES、IOBUFDS等)

Vivado ILA抓DDR信号(各种IO信号:差分、ISERDES、IOBUFDS等)

千歌叹尽执夏的博客 1097

SpringBoot实战(十九)集成Ribbon

SpringBoot实战(十九)集成Ribbon

ACGkaka的博客 2644

AI预测彩票,使用chatgpt和lstm神经网络(文末附源码)

AI预测彩票,使用chatgpt和lstm神经网络(文末有彩蛋)

淘淘小窝 1万+

【推荐100个unity插件】unity易于使用模块化设计的天空、体积云和天气系统——Enviro 3

Enviro 3是一款功能强大的Unity天空与天气系统插件,提供动态天空、体积云、天气模拟等丰富功能。安装时需将预制体拖入场景并配置主相机,URP支持需激活深度纹理和添加渲染特性。模块化设计允许自由添加/移除时间、光照、雾效等模块,并通过API控制参数。推荐配合色调映射(如ACES模式)获得最佳视觉效果。插件支持季节、温湿度模拟及闪电风暴等特效,适用于需要逼真环境渲染的Unity项目。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2094

【SpringCloud】Eureka基于Ribbon负载均衡的调用链路流程分析

为什么很多公司都开始摒弃Eureka?

懒羊羊的博客 1万+

【Proteus仿真】用24C04与1602LCD设计的简易加密电子密码锁

【Proteus仿真】用24C04与1602LCD设计的简易加密电子密码锁

perseverance51博客 1121

Ribbon负载均衡调用

八、Ribbon负载均衡调用 8.1 是什么 ? Spring cloud Ribbon 是基于Netfilix Ribbon 实现一套 客户端 负载均衡工具。 简单的说, Ribbon 是 Netflix 发布开源项目。 主要是提供客户端软件负载均衡算法和服务调用。 Ribbon客户端提供一系列完善的配置项如连接超时。 重连等。 简单的来说。 就是在配置文件中加入一个LoadBalanced(简称LB),后面所有的机器ribbon自动会帮我们基于魔种规则(轮询 随机连接)进行连接机器 8.2 有什么功

m0_46425463的博客 278

Agentic RL: 大模型后训练 SFT、PPO和GRPO

本文介绍了从LLM训练到Agentic RL的发展过程。传统LLM训练包括预训练和后训练两个阶段,其中后训练通过监督微调、奖励建模和强化学习等技术优化模型表现。针对智能体在复杂任务中的不足,提出了Agentic RL新范式,将LLM嵌入强化学习框架,通过多步交互、工具使用和环境反馈来优化长期目标。相比传统单轮对话优化(PBRFT),Agentic RL具有状态包含历史上下文、行动类型多样、动态状态转移等特点,更适合解决需要多步推理和规划的任务。这种新方法为开发更强大的智能体系统提供了可能。

Cachel Wood的博客 698

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ribbon之服务调用与负载均衡

一、ribbon服务调用 ribbon的服务调用是通过spring 的拦截RestTemplete的请求地址中的服务名称,通过服务名称找到所有的微服务来进行调用。 1.1 在RestTemplete上标注 @SpringBootApplication @EntityScan("com.yan.order.entity") @EnableDiscoveryClient public class Or...

qq_37119960的博客 302

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Ribbon:Spring Cloud负载均衡与服务调用组件(非常详细)

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程​​Ribbon 是一套基于 Netflix Ribbon 实现的客户端负载均衡和服务调用工具。Netflix Ribbon 是 Netflix 公司发布的开源组件,其主要功能是提供客户端的负载均衡算法和服务调用。

了解➔熟悉➔掌握➔精通 1378

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

负载均衡 Ribbon 与 Fegin 远程调用原理

文章目录 一、什么是负载均衡 二、Ribbon 负载均衡 2.1 Ribbon 使用 2.2 Ribbon 实现原理 (★) 2.3 Ribbon 负载均衡算法 三、Feign 远程调用 3.1 Feign 简述 3.2 Feign 的集成 3.3 Feign 实现原理 (★)

秀岩的博客 1958

ribbon负载均衡及feign消费者调用服务

微服务调用Ribbon 简介 前面讲了eureka服务注册与发现,但是结合eureka集群的服务调用没讲。 这里的话 就要用到Ribbon,结合eureka,来实现服务的调用; Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端的行为。为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很...

weixin_44222066的博客 292

Ribbon负载均衡及Feign消费者调用服务

Ribbon负载均衡及Feign消费者调用服务微服务调用Ribbon简介Ribbon负载均衡Feign简介及应用简介应用新建一个Feign消费者项目; 微服务调用Ribbon 简介 前面讲了eureka服务注册与发现,但是结合eureka集群的服务调用没讲。 这里的话 就要用到Ribbon,结合eureka,来实现服务的调用; Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和T...

qq_43514335的博客 186

【JAVA】Ribbon负载均衡和服务调用

Ribbon负载均衡和服务调用

weixin_37559642的博客 947

微服务调用Ribbon+Ribbon负载均衡+Feign简介及应用

微服务调用Ribbon 简介 前面讲了eureka服务注册与发现,但是结合eureka集群的服务调用没讲。 这里的话 就要用到Ribbon,结合eureka,来实现服务的调用; Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端的行为。 为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多负载均衡算法,例如轮询、随机等。当然,我们也可为Ribbon实现自定义的负载均衡算法。 在Spring C

Lzxccas的博客 746

SpringCloud——Ribbon 负载均衡服务调用

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

时光·漫步的博客 357

Eureka & Ribbon实现服务调用和负载均衡

Ribbon是什么 Spring cloud Ribbon是基于Netflix Ribbon实现的一套客户端服务调用以及负载均衡的工具。 Ribbon + Eureka + RestTemplate Eureka已经集成了Ribbon Ribbon在工作时分成三步: 优先选择在同一个区域内负载较少的Eureka Server(当Eureka Server是集群的时候) 从选择的Eureka Server中获取服务注册列表(服务发现),并将信息缓存起来 根据用户配置的负载均衡策略,从第二步获取到的服务注册

qq_17690301的博客 1027
上一篇: 服务注册与发现——Consul
下一篇: 服务调用——OpenFeign
jf-lin
博客等级 码龄7年 37粉丝 49原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值