Ribbon
2023年11月18日大约 4 分钟约 712 字
Ribbon 介绍
Ribbon 是什么
- Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端负载均衡的工具。
- Ribbon 主要功能是提供客户端负载均衡算法和服务调用
- Ribbon 客户端组件提供一系列完善的配置项如连接超时,重试等。
- Ribbon 会基于某种规则(如简单轮询,随机连接等)去连接指定服务
- 程序员很容易使用 Ribbon 的负载均衡算法实现负载均衡
- 一句话: Ribbon: 负载均衡+RestTemplate 调用
官网
https://github.com/Netflix/ribbon
Ribbon 进入维护状态

Ribbon 目前进入维护模式, 未来替换方案 是 Spring Cloud LoadBalancer
LB(Load Balance)
- 集中式 LB
即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5,也可以是 软件,如Nginx),由该设施负责把访问请求通过某种策略转发至服务的提供方;
LB(Load Balance 负载均衡)
- 进程内 LB
将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些服务地址可用,然后再 从这些地址中选择出一个合适的服务地址。
Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获 取到服务提供方的地址
前面 member-consumer 轮询负载访问 10000/10002 底层就是 Ribbon 默认的轮询负载算法
Ribbon 原理
Ribbon 架构图&机制

Ribbon 机制
- 先选择 EurekaServer,它优先选择在同一个区域内负载较少的 server
- 再根据用户指定的策略,在从 server 取到的服务注册列表中选择一个地址
- Ribbon 提供了多种策略∶ 比如轮询、随机和根据响应时间加权。
Ribbon 常见负载算法

替换负载均衡算法-应用实例
需求分析
- 需求: 将默认的轮询算法改成随机算法 RandomRule
- 浏览器输入 :
http://localhost/member/consumer/get/1
- 要求 访问的 10000/10002 端口的服务是随机的
代码实现
创建 member-service-consumer-80 com/lzw/springcloud/config/RibbonRule.java
package com.lzw.springcloud.config;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author LiAng
* @time 2022/11/5 22:17
* RibbonRule: 配置自己的负载均衡算法
*/
@Configuration
public class RibbonRule {
//配置注入自己的负载均衡算法
@Bean
public IRule myRibbonRule(){
//这里返回的是 RandomRule;
return new RandomRule();
}
}
修改 member-service-consumer-80 com/lzw/springcloud/MemberConsumerApplication.java
package com.lzw.springcloud;
import com.lzw.springcloud.config.RibbonRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
/**
* @author LiAng
* @time 2022/9/1 20:52
*/
//@EnableEurekaClient 将程序标识为 eureka client
@EnableEurekaClient
@SpringBootApplication
@EnableDiscoveryClient // 启用服务发现
//指定 Ribbon 的负载均衡算法
@RibbonClient(name = "MEMBER_SERVICE_PROVIDER_URL", configuration = RibbonRule.class)
public class MemberConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(MemberConsumerApplication.class,args);
}
}