Ribbon 核心顶层抽象

package com.netflix.loadbalancer;
public interface IRule {
Server choose(Object var1); void setLoadBalancer(ILoadBalancer var1); ILoadBalancer getLoadBalancer();
}

继承 IRule 实现 choose 方法

默认实现

我们这里说明现有的集成扩展从写

BestAvailableRule

选择一个最小的并发请求的server


import com.netflix.loadbalancer.BestAvailableRule;
import com.netflix.loadbalancer.Server; import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List; /**
* 本地优先策略:尽可能选择本地(相同IP)的服务提供者
*/
public class LocalPreferedRule extends BestAvailableRule { /**
* 本机IP地址{搜索本地网卡优先}
*/
private List<String> ips = new ArrayList<>(); /**
* 偏向的IP地址||除了本地优先之外,尽可能少去选择其他开发者的主机
* 未找到本地优先时偏向使用测试公共环境{10.130.1.11/13/14/15/18/19}
*/
private String biasIp = "10.130.1.1"; public LocalPreferedRule() {
getIpAddress();
} public void getIpAddress() {
try {
Enumeration<NetworkInterface> allNetInterfaces = NetworkInterface.getNetworkInterfaces();
InetAddress ip = null;
while (allNetInterfaces.hasMoreElements()) {
NetworkInterface netInterface = allNetInterfaces.nextElement();
if (netInterface.isLoopback() || netInterface.isVirtual() || !netInterface.isUp()) {
continue;
} else {
Enumeration<InetAddress> addresses = netInterface.getInetAddresses();
while (addresses.hasMoreElements()) {
ip = addresses.nextElement();
if (ip != null && ip instanceof Inet4Address) {
ips.add(ip.getHostAddress());
}
}
}
}
} catch (Exception e) {
System.err.println("IP地址获取失败" + e.toString());
}
} @Override
public Server choose(Object key) {
List<Server> serverList = getLoadBalancer().getAllServers();
Server chosen = null;
for (Server server : serverList) {
if (ips.contains(server.getHost())) {
chosen = server;
}
if (chosen == null && server.getHost().contains(biasIp)) {
chosen = server;
}
}
if (chosen == null) {
return super.choose(key);
} else {
return chosen;
}
}
}

Ribbon-Loadbalancer自定义负载均衡策略:本地优先+偏向服务器优先的更多相关文章

  1. Ribbon自带负载均衡策略比较

    Ribbon自带负载均衡策略比较 策略名 策略声明 策略描述 实现说明 BestAvailableRule public class BestAvailableRule extends ClientC ...

  2. Ribbon自带负载均衡策略

    IRule这是所有负载均衡策略的父接口,里边的核心方法就是choose方法,用来选择一个服务实例. AbstractLoadBalancerRuleAbstractLoadBalancerRule是一 ...

  3. gRPC负载均衡(自定义负载均衡策略)

    前言 上篇文章介绍了如何实现gRPC负载均衡,但目前官方只提供了pick_first和round_robin两种负载均衡策略,轮询法round_robin不能满足因服务器配置不同而承担不同负载量,这篇 ...

  4. 【Ribbon篇四】自定义负载均衡策略(4)

    官方文档特别指出:自定义的负载均衡配置类不能放在 @componentScan 所扫描的当前包下及其子包下,否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,也就是说我们达不到特殊化定制 ...

  5. 撸一撸Spring Cloud Ribbon的原理-负载均衡策略

    在前两篇<撸一撸Spring Cloud Ribbon的原理>,<撸一撸Spring Cloud Ribbon的原理-负载均衡器>中,整理了Ribbon如何通过负载均衡拦截器植 ...

  6. Ribbon自定义负载均衡策略,在网关实现类似Ip_hash的负载均衡,ribbon给单个服务配置属性

    背景: 我需要在网关实现一种功能,某个用户的请求永远打在后台指定的服务,也就是根据ip地址进行负载均衡 原理: 在ribbon的配置类下: 那我们自己创建一个IRule的实现类,模仿ZoneAvoid ...

  7. spring cloud中通过配置文件自定义Ribbon负载均衡策略

    一.Ribbon中的负载均衡策略 1.Ribbon中支持的负载均衡策略 AvailabilityFilteringRule:过滤掉那些因为一直连接失败的被标记为circuit tripped的后端se ...

  8. 自定义Ribbon的负载均衡策略

    自定义负载均衡策略 官方文档指出:自定义的负载均衡配置类不能放在 @componentScan 所扫描的当前包下及其子包下,否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,也就是说我们 ...

  9. Spring Cloud Ribbon 中的 7 种负载均衡策略

    负载均衡通器常有两种实现手段,一种是服务端负载均衡器,另一种是客户端负载均衡器,而我们今天的主角 Ribbon 就属于后者--客户端负载均衡器. 服务端负载均衡器的问题是,它提供了更强的流量控制权,但 ...

  10. 每天学点SpringCloud(三):自定义Eureka集群负载均衡策略

    相信看了 每天学点SpringCloud(一):简单服务提供者消费者调用,每天学点SpringCloud(二):服务注册与发现Eureka这两篇的同学都了解到了我的套路,没错,本篇博客同样是为了解决上 ...

随机推荐

  1. IDEA利用阿里云插件部署Springboot项目

    下载插件 搜索 Alibaba Cloud Toolkit 插件,并安装. IDEA增加Run/Debug Configurations Add New Configuration - Deploy ...

  2. [转]E1接口介绍

    E1 通道本来设计用来传输电话的,每个 E1(带宽 2.048M)可以传 30 路电话,后来扩大的应用范围,可以用作传网络,串口等不同的业务:E1 是一个基本的传输单元,其最终还是通过光纤来传输的,如 ...

  3. 基于开源IM即时通讯框架MobileIMSDK:RainbowChat v11.7版已发布

    关于RainbowChat RainbowChat是一套基于开源IM聊天框架 MobileIMSDK 的产品级移动端IM系统.RainbowChat源于真实运营的产品,解决了大量的屏幕适配.细节优化. ...

  4. clip-retrieval检索本地数据集

    clip-retrieval检索本地数据集 from clip_retrieval.clip_client import ClipClient, Modality from tqdm import t ...

  5. 2025-01-01:优质数对的总数Ⅰ。用go语言,给定两个整数数组 nums1 和 nums2,分别长度为 n 和 m,以及一个正整数 k。 如果 nums1 数组中的元素 nums1[i] 能被

    2025-01-01:优质数对的总数Ⅰ.用go语言,给定两个整数数组 nums1 和 nums2,分别长度为 n 和 m,以及一个正整数 k. 如果 nums1 数组中的元素 nums1[i] 能被 ...

  6. 视频分析框架VideoPipe完整介绍

    (2024年4月编写) github地址 https://github.com/sherlockchou86/video_pipe_c 作者微信 zhzhi78(备注 videopipe),拉群交流( ...

  7. klippy — reactor模块

    该模块负责管理事件的注册.调度和处理,充当事件驱动的核心引擎,驱动整个klippy系统的运行. 该模块提供了一个统一的接口register_callback,使各个模块能够注册自己的回调函数以响应特定 ...

  8. ofd轻阅读超大文件优化方案

    本人使用Typescript开发了一款ofd 阅读器,参见文章<ofd轻阅读>.web端实现阅读功能有两种方案: ofd转svg:使用h5 canvas. 两种方案各有优劣,本人采用了ca ...

  9. 深入理解第三范式(3NF):数据库设计中的重要性与实践

    title: 深入理解第三范式(3NF):数据库设计中的重要性与实践 date: 2025/1/17 updated: 2025/1/17 author: cmdragon excerpt: 在数据库 ...

  10. codeblocks调试时怎样查看全局变量?

    问题: 办法: watch窗口下面第一列输入 ::c