Ribbon负载均衡多种策略及自定义IRule

2024-04-19 10:48

本文主要是介绍Ribbon负载均衡多种策略及自定义IRule,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

所有代码都在github上:https://github.com/demonruin/cloud2020/tree/master

 

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

LB(负载均衡)分为 集中式LB 和 进程内LB

集中式LB

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

进程内 LB

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

 

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

Ribbon 在工作时分为两步:

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

第二步在根据用户执行的策略,在从server 取到的服务注册列表中选择一个地址。

其中 Ribbon 提供了多种策略:比如轮询、随机和更具响应时间加权。

其中策略有以下七种

com.netflix.loadbalancer.RoundRobinRule 

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

而IRule可以根据特定算法从中选取一个要方位的服务,下面就举例通过Ribbon的核心组件IRule实现自定义策略选择:

注意:

官方文档明确给出了警告

这个自定义配置类不能放在 @CommpomentScan 所扫描的当前包下以及子包下,否则我们自定义的这个规则类会被所有的 Ribbon 客户端共享,达不到特殊定制化的目的。

1、新建package--->com.king.myrule与启动类包分开,并新建myRule配置类

package com.king.myrule;import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** created by king on 2020/4/15 10:56 上午*/
@Configuration
public class MyRule {@Beanpublic IRule getMyRule(){return  new RandomRule();}
}

2、主启动类添加@RibbonClient注解,RibbonClient中的name值要和配置中心的服务名保持一致,大小写注意,configuration值为       自定义myrule类

package com.king.springcloud;import com.king.myrule.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;/*** created by king on 2020/4/13 3:41 下午* RibbonClient中的name值要和配置中心的服务名保持一致,大小写注意*/
@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name="CLOUD-PAYMENT-SERVICE",configuration = MyRule.class)
public class OrderMain80 {public static void main(String[] args) {SpringApplication.run(OrderMain80.class,args);}
}

3、然后通过请求测试即可,附一个测试请求demo

package com.king.springcloud.controller;import com.king.springcloud.entities.CommonResult;
import com.king.springcloud.entities.Payment;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import javax.annotation.Resource;/*** created by king on 2020/4/13 3:53 下午*/
@RestController
@Slf4j
public class OrderController {private static final String PAYMENT_URL_PRE="http://CLOUD-PAYMENT-SERVICE/";//    @Resourceprivate RestTemplate restTemplate;@GetMapping(value="/consumer/payment/get/{id}")public CommonResult<Payment> getPayment(@PathVariable("id") Long id){return restTemplate.getForObject(PAYMENT_URL_PRE+"/payment/get/"+id,CommonResult.class);}@GetMapping(value="/consumer/payment/getEntity/{id}")public CommonResult<Payment> getPaymentEntity(@PathVariable("id") Long id){ResponseEntity<CommonResult> forEntity = restTemplate.getForEntity(PAYMENT_URL_PRE + "/payment/get/" + id, CommonResult.class);log.info("forEntity实体内容:"+forEntity.toString());if(forEntity.getStatusCode().is2xxSuccessful()){return forEntity.getBody();}else{return new CommonResult<Payment>(444,"请求失败");}}}

 

这篇关于Ribbon负载均衡多种策略及自定义IRule的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/917329

相关文章

nginx 负载均衡配置及如何解决重复登录问题

《nginx负载均衡配置及如何解决重复登录问题》文章详解Nginx源码安装与Docker部署,介绍四层/七层代理区别及负载均衡策略,通过ip_hash解决重复登录问题,对nginx负载均衡配置及如何... 目录一:源码安装:1.配置编译参数2.编译3.编译安装 二,四层代理和七层代理区别1.二者混合使用举例

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

C#读写文本文件的多种方式详解

《C#读写文本文件的多种方式详解》这篇文章主要为大家详细介绍了C#中各种常用的文件读写方式,包括文本文件,二进制文件、CSV文件、JSON文件等,有需要的小伙伴可以参考一下... 目录一、文本文件读写1. 使用 File 类的静态方法2. 使用 StreamReader 和 StreamWriter二、二进

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

SpringBoot中4种数据水平分片策略

《SpringBoot中4种数据水平分片策略》数据水平分片作为一种水平扩展策略,通过将数据分散到多个物理节点上,有效解决了存储容量和性能瓶颈问题,下面小编就来和大家分享4种数据分片策略吧... 目录一、前言二、哈希分片2.1 原理2.2 SpringBoot实现2.3 优缺点分析2.4 适用场景三、范围分片

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam

Python中提取文件名扩展名的多种方法实现

《Python中提取文件名扩展名的多种方法实现》在Python编程中,经常会遇到需要从文件名中提取扩展名的场景,Python提供了多种方法来实现这一功能,不同方法适用于不同的场景和需求,包括os.pa... 目录技术背景实现步骤方法一:使用os.path.splitext方法二:使用pathlib模块方法三

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri