手写SpringCloud系列-负载均衡算法实现

news2024/11/28 4:50:32

手写SpringCLoud项目地址,求个star
github:https://github.com/huangjianguo2000/spring-cloud-lightweight
gitee:https://gitee.com/huangjianguo2000/spring-cloud-lightweigh

一:什么是负载均衡

最开始的系统访问量很少,就一个单机就足够,随着系统越来越大,访问量越来越大,系统逐渐变为微服务架构体系,同一个功能需要多台服务器同时提供服务,这个时候我们的请求具体落在哪台服务器就成了一个需要思考的问题,如何使资源合理分配就是负载均衡要解决的问题
在这里插入图片描述
常见的负载均衡算法包括轮询(Round Robin)、加权轮询、最少连接(Least Connections)、最短响应时间,固定IP访问等等。

  1. 轮询(Round Robin): 这是一种最简单的负载均衡算法,请求按顺序依次分配到每个服务器。每个请求都会被依次发送到不同的服务器,然后从头开始。这种算法适用于服务器性能相对均衡的情况。
  2. 加权轮询(Weighted Round Robin): 这是轮询算法的一种变体,服务器可以设置不同的权重,权重越高的服务器会获得更多的请求。这样可以根据服务器的性能来分配负载,提高性能更高的服务器的工作负荷。
  3. 最少连接(Least Connections): 这种算法会将请求发送到当前连接数最少的服务器上。这意味着负载均衡器会优先将请求分配给负载较轻的服务器,以实现更均衡的负载。
  4. 最短响应时间(Least Response Time): 在这种算法中,负载均衡器会选择具有最短响应时间的服务器来处理请求。这可以确保请求被尽快处理,从而提高用户体验。
  5. 随机(Random): 这是一种随机分配请求的算法,每个请求被随机发送到一个服务器上。尽管随机算法相对简单,但无法确保负载均衡的效果。
  6. IP 哈希(IP Hash): 这种算法基于客户端的 IP 地址,将同一客户端的请求始终分配给同一台服务器。这对于需要保持会话一致性的应用很有用。

二:轮询负载均衡算法实现

轮询很简单,我们记录当前请求下标,下一次请求的时候就请求下标加1位置的服务实例即可。

1.定义一个接口

public interface LoadBalancer{
    /**
     * 获取远程服务的IP地址和端口的完整地址 http://xxx:port
     * @param serviceName 服务名称
     * @return
     */
    String getPath(String serviceName);
}

2.定义一个抽象类,实现getPath方法,同时定义模板方法。


/**
 * 定义模板方法
 */
public  abstract class AbstractLoadBalancer implements LoadBalancer{

    private static final Logger logger = LoggerFactory.getLogger(AbstractLoadBalancer.class);

    @Override
    public String getPath(String serviceName) {
        List<ServiceInstance> instances = getInstances(serviceName);

        if (instances.isEmpty()) {
            LoggerUtils.printIfErrorEnabled(logger,"No instances available");
            return null;
        }
        ServiceInstance instance = selectInstance(serviceName, instances);

        return "http://" + instance.getHost() + ":" + instance.getPort();
    }

    /**
     * 根据服务名称获取实例
     */
    protected abstract List<ServiceInstance> getInstances(String serviceName);

    /**
     * 选择实例
     */
    protected abstract ServiceInstance selectInstance(String serviceName,List<ServiceInstance> instances);
}

3.实现基于轮询的负载均衡算法

/**
 * 基于轮询的负载均衡器
 */
public class DefaultLoadBalancer extends AbstractLoadBalancer{

    /**
     * Spring context
     */
    private DiscoveryClient discoveryClient;

    /**
     * 记录轮询下标
     */
    private Map<String, AtomicInteger> selectMap;

    /**
     * 拿到服务发现客户端
     */
    public DefaultLoadBalancer(ApplicationContext applicationContext){
        this.discoveryClient = applicationContext.getBean(DiscoveryClient.class);
        selectMap = new ConcurrentHashMap<>();
    }

    /**
     * 获取服务名称对应的所有实例
     * @param serviceName
     * @return
     */
    @Override
    protected List<ServiceInstance> getInstances(String serviceName) {
        return discoveryClient.getInstances(serviceName);
    }

    /**
     * 选择一个实例
     */
    @Override
    protected ServiceInstance selectInstance(String serviceName, List<ServiceInstance> instances) {
        AtomicInteger atomicInteger = selectMap.get(serviceName);
        if(atomicInteger == null){
            atomicInteger = new AtomicInteger(0);
        }
        // index++
        atomicInteger.incrementAndGet();
        if(atomicInteger.get() >= instances.size()){
            atomicInteger.compareAndSet(atomicInteger.get(), 0);
        }
        selectMap.put(serviceName, atomicInteger);
        return instances.get(atomicInteger.get() % instances.size());
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/858346.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

研究生阶段如何进入一个领域——兼李芒老师教育技术导论解读

文章 https://devpress.csdn.net/hpc/64c8bb57bfca273ff3549881.html

svg的图片怎么通过修改源码修改其颜色

这里有一张svg的图片&#xff0c;如下&#xff1a; 原svg的代码(在IDE中打开)如下&#xff1a; svg代码如下&#xff1a; <?xml version"1.0" standalone"no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN""http://www.w…

最好用的六款虚拟机软件

下面&#xff0c;我将介绍目前市面上适合个人用户使用的六款最佳虚拟化软件&#xff0c;让你可以更好的选择。 01 — VMware Workstation Vmware作为全球最知名的虚拟化企业&#xff0c;至今已有超过20年的发展历史。在针对个人用户的产品上&#xff0c;Vmware提供了适用于A…

前端性能优化介绍与常见方法(一)

这是一个没有套路的前端博主&#xff0c;热衷各种前端向的骚操作&#xff0c;经常想到哪就写到哪&#xff0c;如果有感兴趣的技术和前端效果可以留言&#xff5e;博主看到后会去代替大家踩坑的&#xff5e; 主页: oliver尹的主页 格言: 跌倒了爬起来就好&#xff5e; 目录 一、…

ios swift alert 自定义弹框 点击半透明部分弹框消失

文章目录 1.BaseAlertVC2.BindFrameNumAlertVC 1.BaseAlertVC import UIKitclass BaseAlertVC: GLBaseViewController {let centerView UIView()override func viewDidLoad() {super.viewDidLoad()view.backgroundColor UIColor(displayP3Red: 0, green: 0, blue: 0, alpha:…

Dubbo 服务发布注册、订阅消费 流程

一、Dubbo服务发布 dubbo的服务提供者注册一共经历以下三个阶段 1) 配置 Dubbo 框架在服务注解这个后置处理器&#xff08;ServiceAnnotationPostProcessor&#xff09;中&#xff0c;利用扫描器&#xff0c;把含有 DubboService 注解的类对应的 Bean 定义收集到了一块&#…

【观察】张建林:走出“舒适区”,愿做智能运维的“布道者”

在出任科来研发中心副总经理一职之前&#xff0c;张建林在行业内已有着非常资深的“履历”&#xff0c;他曾任招商银行数据中心系统运行、应用管理负责人&#xff0c;招行资深工程师&#xff0c;对应用全生命周期的智能化运维具有非常丰富的理论研究与实战经验&#xff0c;还曾…

世界山系、火山和地震的分布

声明&#xff1a;来源网络&#xff0c;仅供学习&#xff01;

CentOS-6.3安装MySQL集群

安装要求 安装环境&#xff1a;CentOS-6.3 安装方式&#xff1a;源码编译安装 软件名称&#xff1a;mysql-cluster-gpl-7.2.6-linux2.6-x86_64.tar.gz 下载地址&#xff1a;http://mysql.mirror.kangaroot.net/Downloads/ 软件安装位置&#xff1a;/usr/local/mysql 数据存放位…

HCIP的重发布实验

实验要求&#xff1a; 1 两个协议间进行多点双向重发布 2 R7的环回没有宣告在OSPF中而是后期发布进入的 3 解决环路&#xff0c;所有路径选择最优&#xff0c;且存在备份 一、IP配置 R1&#xff1a; R2&#xff1a; R3&#xff1a; R4&#xff1a; R5&#xff1a; R6&#…

数字万用表测量基础知识--其他DMM测量

概览 DMM&#xff08;即数字万用表&#xff09;是一种电气测试和测量仪器&#xff0c;可测量直流和交流信号的电压、电流和电阻。本文介绍如何正确使用和理解数字万用表(DMM)。 其他DMM测量 许多DMM还具有两个额外的测量功能&#xff1a;二极管测试和连续性测试。 连续性测试…

使用pip安装opencv,出现Cannot unpack file xxx的问题的解决

学完机器学习和深度学习后&#xff0c;开始学习计算机视觉&#xff0c;在安装opencv时出现以下问题&#xff1a; ERROR: Cannot unpack file C:\Users\User\AppData\Local\Temp\pip-unpack-9vgxq6np\simple.html (downloaded from C:\Users\User\AppData\Local\Temp\pip-req-bu…

英码国产高配边缘计算盒子上市!搭载TPU处理器BM1684X,适配麒麟系统,支持OTA升级!

随着人工智能技术不断深入实际应用场景&#xff0c;加速各行各业场景应用落地&#xff0c;边缘计算的重要性越发凸显。相较于传统的集中式云计算&#xff0c;边缘计算在距离数据源或用户更近的地方提供计算能力&#xff0c;不仅满足了对实时性要求较高的场景应用需求&#xff0…

汽车及汽车零部件行业云MES解决方案

汽配行业现状&#xff1a; 随着经济全球化进程加快&#xff0c;一直走在智能化改造&#xff0c;数字化转型前沿的汽车行业企业&#xff0c;面临的信息化需求也日益增加&#xff0c;不管德系&#xff0c;美系还是日系供应链的各大厂商&#xff0c;均将企业信息化&#xff0c;数字…

虚幻5中Lumen提供哪些功能以及如何工作的

虚幻引擎 5 中的 Lumen 是一个完全动态的全局照明和反射系统。它可以在虚幻引擎 5 中使用&#xff0c;因此创作者无需自行设置。它是为下一代控制台和建筑可视化等高端可视化而设计的。那么它提供了哪些功能以及如何工作&#xff1f; 全局照明 当光离开光源时&#xff0c;它会…

宿舍管理系统--前后端分离式项目架构流程复盘

文章目录 &#x1f412;个人主页&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;【&#x1f387;前端】先创建Vue-cli项目&#xff08;版本2.6.10&#xff0c;仅包含babel&#xff09;&#xff0c;请选择此项目并创建 【整理简化项目模板】【&#x1f380;创建路由】…

代码评审(Code Review)规范

一、目的 Code Review是一种用来确认方案设计和代码实现的质量保证机制&#xff0c;通过这个机制我们 可以对代码、测试过程和注释进行检查。 Code Review主要用来在软件工程过程中改进代码质量&#xff0c;通过Code Review可以达到 如下目的&#xff1a; 1) 在项目早期就能够…

Nevron Diagram for .NET Crack

Nevron Diagram for .NET Crack Nevron Diagram for.NET可帮助您快速轻松地在.NET Windows窗体和ASP.NET应用程序中集成和显示复杂的图表。这是一个完整的绘图解决方案&#xff0c;包含许多交互功能、形状、自动布局和令人惊叹的视觉效果&#xff0c;并配备了现成的控件&#x…

Java代码判断ip、端口是否可用

一、简介 使用的是java自带的Socket类进行检测端口号是否可用&#xff0c;两个代码&#xff0c;一个是检测的工具类&#xff0c;另一个是调用工具类传递相关的的参数&#xff1b; 请求的结果&#xff1a;&#xff08;当前Ip可用&#xff0c;端口号不可用&#xff09; 二、检…

Docker容器挖矿应急实例

01、概述 很多开源组件封装成容器镜像进行容器化部署在提高应用部署效率和管理便捷性的同时&#xff0c;也带来了一些安全挑战。一旦开源系统出现安全漏洞&#xff0c;基于资产测绘就很容易关联到开源组件&#xff0c;可能导致被批量利用。 在本文中&#xff0c;我们将分享一个…