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. Linux服务器环境安装mysql

    背景 1.安装环境:kvm虚拟机 2.运行环境:linux 3.架构:x86 4.安装mysql版本:mysql-5.7 1.安装准备 # Mysql官网 https://downloads.mysq ...

  2. 关于存入sessionStorage中boolean值拿出来为字符串

    上面是html部分,然后定义了变量 定义方法 在mounted中获取,然后刷新页面,打印类型为字符串 解决办法

  3. Solution Set - “如果惊蛰随梦远走”

    目录 0.「UR #15」「UOJ #226」奥林匹克环城马拉松 1.「UR #22」「UOJ #682」月球铁轨 2.「NOI Simu.」箭头 3.「CF 830E」Perpetual Motio ...

  4. GIMP 开源、免费,功能强大的图像编辑软件

    引言 万事开头难,打造个人网站,图片处理是必不可少的,老王的电脑还是 10 年前配置的,日常使用倒还流畅,但要是使用 Photoshop 就有些吃力,特别是越新的版本.然后,发现 GIMP 这个开源的 ...

  5. Java接口-详解

    一.基本概念 接口(Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合.接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法. 如果一个类只由 ...

  6. NoSQL和SQL的区别、使用场景与选型比较

    什么是NoSQL NoSQL,指的是非关系型的数据库.NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称,它具有非关系型.分布式.不提供ACID的数 ...

  7. Paillier算法

    介绍 1999年欧密会上,首次提出Paillier算法,2001年,Damgard等人对该方案简化,推出当前最优的Paillier方案. 加密方案 Carmichael函数 困难问题 合数剩余类问题( ...

  8. Svelte 最新中文文档翻译(4)—— 符文(Runes)下

    前言 Svelte,一个非常"有趣".用起来"很爽"的前端框架.从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 ...

  9. 为Delphi配置多套环境

    假设我们使用Delphi6开发了一个投资系统,在开发过程中我们使用了indy控件.到目前为止投资系统已经发了若干个版本,如投资系统1.0.投资系统1.2.投资系统1.5.投资系统2.0.投资系统2.3 ...

  10. 基于生成式AI的访问控制, 迁移传统安全策略到基于LLM的风险分类器

    基于规则的风险分类 风险分类是网络安全系统的核心能力之一,它将访问请求和命令映射到其风险级别/类别:高(High).中(Medium).低(Low).目前,即便是在大规模环境中,风险分类器仍主要采用基 ...