首页 > 其他分享 >Ribbon-Loadbalancer自定义负载均衡策略:本地优先+偏向服务器优先

Ribbon-Loadbalancer自定义负载均衡策略:本地优先+偏向服务器优先

时间:2024-10-15 11:35:14浏览次数:7  
标签:优先 java 自定义 chosen netInterface server import Ribbon

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;
        }
    }
}

标签:优先,java,自定义,chosen,netInterface,server,import,Ribbon
From: https://www.cnblogs.com/gtnotgod/p/18467093

相关文章

  • VsCode 如何自定义代码片段(Code Snippet)
    前言在现代前端开发中,提高工作效率是每个开发者的追求。VisualStudioCode(Vscode)作为一款强大的代码编辑器,提供了许多让开发者高效编程的功能,其中自定义代码片段(CodeSnippet)便是一个重要的工具。通过自定义代码片段,你可以快速插入常用的代码模板,大幅减少重复工作量。本......
  • HTML DOM 教程---操作自定义属性(2)
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width=d......
  • 任务类型和字段自定义,支撑个性化业务管理
    一句话介绍任务类型和任务字段自定义,面向企业内部不同业务部门,在管理各自任务的时候有不同信息管理差异的场景。企业根据自己的任务管理需求,自定义任务类型,配置不同的任务字段,解决差异化的任务管理场景。应用场景某互联网企业,企业内部有研发部,有销售部研发部通常需要管理以下......
  • Bison遇到冲突的默认行为&用户自定义优先级
    Bison遇到冲突的默认行为&用户自定义优先级在使用Bison进行语法分析时,如果在语法规则中存在冲突,Bison会根据默认的优先级和结合性规则进行决策,选择某个特定的行为来解决冲突。Bison中常见的冲突主要包括两类:移入-规约冲突(shift-reduceconflict)规约-规约冲突(reduce-reduce......
  • 【vue+printJs】前端打印, 自定义字体大小, 自定义样式, 封装共享样式
    效果示例思维导图目录1,基本使用1,依赖下载2,页面导入3,修改字体大小(可行但不推荐)2,自定义样式,字体大小1,修改字体大小(推荐)2,自定义样式3,封装共享样式3,去除页面页脚内容4,测试案例demo,直接cv可用5,print-js的其他参数说明1,基本使用1,依......
  • C语言——自定义类型
    目录一、结构体        1、结构体的定义与声明        2、结构体变量的定义和初始化        3、结构体的自引用         4、结构体的内存对齐         5、为什么要结构体的内存对齐                1、性能......
  • [java/spring/web] 深入理解:Spring @ExceptionHandler => 自定义应用异常处理器(Appli
    1概述:Spring@ExceptionHandler∈spring-web作用ExceptionHandler是Spring框架(spring-web模块)提供的一个注解,用于处理应用程序中的异常。当应用程序中发生异常时,ExceptionHandler将优先地拦截异常并处理它,然后将处理结果返回到前端。该注解可用于类级别和方法级别,以......
  • 在 LaTeX 中,默认的 `enumerate` 环境会输出 “1. 2. 3.“ 这样的编号。如果你想将编号
    在LaTeX中,默认的enumerate环境会输出“1.2.3.”这样的编号。如果你想将编号格式改为(1)(2)(3)这种样式,你可以通过enumerate包进行自定义。在导言区导入enumerate包:\usepackage{enumerate}在enumerate环境中使用\renewcommand来自定义编号格式为带括号的样式......
  • 如何在cnblogs的发文中使用自定义地址作为发文链接
    要知道在cnblogs中发表内容后其默认的链接地址都是一串数字的形式,比如本篇的默认地址:https://www.cnblogs.com/xyz/p/18461898但是为了让发表的内容更有个性化,于是我们可以指定发文内容的链接地址,也就是自定义发文内容的链接地址,具体方法为在发表时指定slug地址,具体如下:如果......
  • Qt自定义一个圆角对话框
    如何得到一个圆角对话框?步骤:1、继承自QDiaglog2、去掉系统自带的边框3、设置背景透明,不设置4个角会有多余的部分出现颜色4、对话框内部添加1个QWidget,给这个widget设置圆角,并添加到布局中让他充满对话框5、后续对话框的所有内容都添加在这个widget里面举例:#ifndefRO......