八、Ribbon负载均衡服务调用

1、概述

SpringCloud Ribbon 是 基于 Netflix Ribbon实现的一套客户端(服务消费侧)负载均衡工具

Ribbon客户端组件提供一些列完善的配置项,如连接超时,重试等。简单的来说,就是在配置文件中列出Load Balance后面所有的机器,Ribbon会自动帮助你基于某种规则去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法

2、Ribbon负载均衡演示

1)架构说明:

Ribbon 是一个软负载均衡的客户端组件

clipboard

Ribbon在工作时候分为两步:

① 选择EurekaServer , 它优先选择在同一个区域负载较少的Server

② 根据用户指定的策略,在server取到的服务注册列表中选择一个地址。其中Ribbon提供了很多策略:比如轮询,随机和

根据响应时间加权

2)pom文件

spring-cloud-starter-netflix-eureka-client 中 集成了 ribbon

clipboard

3、Ribbon核心组件IRule

1) IRule : 是一个接口

其作用是:根据特定算法从服务列表中选取一个要访问的服务

clipboard

IRule的继承结构如下:

clipboard

IRule的主要实现类:

clipboard

2)如何替换Ribbon默认的轮询规则

clipboard

①、自定义配置类MySelfRule

将IRule的一个实现类添加到spring容器中

@Configuration
public class MySelfRule {

    @Bean
    public IRule myRule(){
        return new RandomRule();
    }
}

【注意】

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

否则我们自定义的这个配置类会被所有的Ribbon客户端所共享,达不到特殊化定制的目的了

clipboard

②、主配置类上添加:

@RibbonClient(name="CLOUD-PAYMENT-SERVICE",configuration = MySelfRule.class)

告诉服务消费者使用的ribbon规则

clipboard

4、Ribbon负载均衡算法

1)RoundRobinRule(轮询算法)原理:

clipboard

2)源码

int nextServerIndex = incrementAndGetModulo(serverCount);

//cas自旋锁 => nextServerCyclicCounter: 第几次请求
private int incrementAndGetModulo(int modulo) {
    for (;;) {
        int current = nextServerCyclicCounter.get();
        int next = (current + 1) % modulo;
        if (nextServerCyclicCounter.compareAndSet(current, next))
            return next;
    }
}
原文地址:https://www.cnblogs.com/houchen/p/14832944.html