系列七、Ribbon

一、Ribbon

1.1、概述

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

1.2、spring-cloud-starter-alibaba-nacos-discovery默认集成了Ribbon

1.3、官网

html 复制代码
https://github.com/Netflix/ribbon/wiki/Getting-Started

1.4、Ribbon进入维护模式怎么办

未来的替代方案:Spring Cloud LoadBalancer。

1.5、功能

1.5.1、LB

LB的全称是Load Balance,中文意思为负载均衡,简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA(高可用),常见的负载均衡有软件Nginx,LVS,硬件 F5等。

1.5.2、Ribbon本地负载均衡 vs Nginx服务端负载均衡

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

1.5.3、集中式LB

即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至服务的提供方;

1.5.4、进程内LB

将LB逻辑集成到消费方,消费方从服务注册中心获取有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址;

1.6、 Ribbon工作原理

Ribbon在工作时分成两步:

第一步:从注册中心查询可用的服务列表;

第二步:根据用户指定的策略,从可用的服务列表中选择一个地址。其中Ribbon提供了多种策略:比如轮询、随机和根据响应时间加权。原理图如下:

小总结:Ribbon其实就是一个软负载均衡的客户端组件,它可以和其他所需请求的客户端结合使用,和Nacos结合只是其中的一个实例,也可以和Eureka结合;

1.7、核心组件IRule

1.7.1、概述

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

1.7.2、继承结构

1.7.3、组件介绍

(1)com.netflix.loadbalancer.RoundRobinRule:轮询

(2)com.netflix.loadbalancer.RandomRule:随机

(3)com.netflix.loadbalancer.RetryRule:先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试,获取可用的服务

(4)com.netflix.loadbalancer.WeightedResponseTimeRule:对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择

(5)BestAvailableRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务

(6)AvailabilityFilteringRule:先过滤掉故障实例,再选择并发较小的实例

(7)ZoneAvoidanceRule:默认规则,复合判断server所在区域的性能和server的可用性选择服务器

1.7.4、IRule原理

负载均衡算法: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

依次类推......

1.8、如何使用

(1)导入依赖:

<!-- nacos 服务注册&发现 -->

<dependency>

<groupId>com.alibaba.cloud</groupId>

<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>

</dependency>

(2)配置Bean:

MyRandom代码:

java 复制代码
/**
 * @Author : 一叶浮萍归大海
 * @Date: 2024/1/3 9:00
 * @Description:
 */
public class MyRandomRule extends AbstractLoadBalancerRule {

    @Override
    public Server choose(Object key) {
        // 获取当前请求的服务实例
        ILoadBalancer loadBalancer = this.getLoadBalancer();
        List<Server> servers = loadBalancer.getReachableServers();
        int index = ThreadLocalRandom.current().nextInt(servers.size());

        return servers.get(index);
    }

    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {

    }


}

(3)主启动类添加注解

java 复制代码
/**
 * @Author : 一叶浮萍归大海
 * @Date: 2024/1/3 8:39
 * @Description:
 */
@RibbonClients(value = {
        @RibbonClient(name = "stock-service-nacos",configuration = MyRibbonConfig.class)
})
@SpringBootApplication
public class OrderServiceRibbon8001MainApplication {

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


}

1.9、参考

(1)Ribbon负载均衡(二)Ribbon负载均衡策略_ribbon irule接口没有了-CSDN博客

(2)spring cloud 2020.0.1 LoadBalancer负载均衡算法切换-CSDN博客

相关推荐
跳跳的向阳花24 天前
03-08、SpringCloud第八章,升级篇,负载均衡与服务调用Ribbon和OpenFeign
spring cloud·ribbon·负载均衡
BestandW1shEs1 个月前
快速理解微服务中Ribbon的概念
微服务·ribbon
yours_Gabriel1 个月前
【微服务】 Eureka和Ribbon
java·微服务·eureka·ribbon
跳跳的向阳花1 个月前
03-03、SpringCloud第三章,负载均衡Ribbon和Feign
spring cloud·ribbon·负载均衡
吴冰_hogan1 个月前
Ribbon 入门实战指南
后端·spring cloud·ribbon·springcloud
一叶飘零_sweeeet1 个月前
Ribbon 与 Feign:微服务调用中的差异探究
spring·spring cloud·ribbon
快乐非自愿1 个月前
Spring Cloud Ribbon 实现“负载均衡”的详细配置说明
spring cloud·ribbon·负载均衡
ChinaRainbowSea1 个月前
4. Spring Cloud Ribbon 实现“负载均衡”的详细配置说明
java·spring boot·后端·spring·spring cloud·ribbon·负载均衡
白总Server1 个月前
JVM 处理多线程并发执行
jvm·后端·spring cloud·微服务·ribbon·架构·数据库架构
白总Server1 个月前
Swagger UI
后端·ui·spring cloud·ribbon·架构·scala·1024程序员节