【微服务架构】本地负载均衡的实现(基于随机算法)

devtools/2025/3/26 10:41:06/

前言

负载均衡
  • 概念:一种将网络流量或业务请求均匀分配到多个服务器或服务实例上的技术,旨在提高系统的可用性、性能和可伸缩性
  • 作用:
    • 提高性能:通过将请求分散到多个实例上,避免单个实例因请求过多而过载,从而提高系统的整体处理能力。
    • 增强可用性:当某一实例发生故障时,负载均衡器可以自动将流量重定向到其他健康的实例,确保服务仍然可用。
    • 实现可伸缩性:可以根据系统的负载情况,动态地添加或删除服务实例,以适应业务需求的变化。
  • 实现方式
负载均衡
  • 概念:是一种软件或硬件设备,用于在多个服务器或服务实例之间分发网络流量或业务请求。

常见负载均衡算法【策略】

  • 随机算法
    • 随机选取集群中的一台服务器访问。
    • 随着客户端调用服务端的次数增多,其实际效果越来越接近于平均分配调用量到后端的每一台服务器。
  • 轮询算法默认
    • 按顺序向每个服务实例发送请求,适用于系统中的节点处理能力相同的情况。
  • 权重算法
    • 给配置高、负载低的机器配置更高的权重,让其处理更多的请求;
    • 而配置低、负载高的机器,给其分配较低的权重,降低其系统负载。

通俗理解

  • 微服务架构中,为保证项目的高可用性【如故障转移】和可拓展性【如动态服务注册】,通常需要对特定服务进行集群;
  • 而调用服务者[消费者]通过RPC远程调用目标服务[生产者]的接口时则存在:"具体应该调用集群中的哪个服务?"的问题;
  • 此时需要通过负载均衡实现具体服务的调用[目标服务实例的筛选];
简单概述

负载均衡 = 负载均衡器 + 负载均衡算法【策略】 —》 按特定策略从服务集群中挑选一个服务实例【服务器】调用。


实践(以随机算法为例)

package com.xiaohan.loadbalance;/*** @program: SpringCloud_Demo* @description: 本地负载均衡器的实现:随机算法* @author: 韩小豪* @create: 2025-01-04 13:46**/import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Component;import java.util.List;
import java.util.Random;/*** 随机算法实现* 实现自定义的本地负载均衡接口【策略模式】*/
@Component
public class RandomLoadBalance implements LoadBalance {  @Autowiredprivate DiscoveryClient discoveryClient;  //用以从服务注册中心的Server端获取已注册的目标服务的ip地址和端口号@Overridepublic ServiceInstance getInstance(String serviceId) {//获取目标服务可用的所有实例【可用的ip地址和端口号】//根据服务名称(id)从注册中心中获取其的地址和端口号:返回数组,因为目标服务可能做集群List<ServiceInstance> serviceInstances = discoveryClient.getInstances(serviceId);//判空if (serviceInstances == null || serviceInstances.isEmpty()) {  //没有可用服务return null;}/*** 随机算法思想:设置随机数的取值范围,形参可以直接传入目标服务的可用实例数* 例:当目标服务存在两个可用实例时:数组下标为0和1* 此时random.nextInt(2)只会在0、1之间随机取值,而不会取到2*/Random random = new Random();int index = random.nextInt(serviceInstances.size());//返回服务列表中具体要调用的服务实例return serviceInstances.get(index);}
}

结语

  • 了解原理和具体实现才利于更好使用【理解 > 会用
  • 基于轮训和权重算法的实现见首页文章后续更新

http://www.ppmy.cn/devtools/171327.html

相关文章

GMII 接口

文章目录 概述硬件拓扑GMII 接口站管理接口发送数据时序接收数据时序参考 本文为笔者学习以太网对网上资料归纳整理所做的笔记&#xff0c;文末均附有参考链接&#xff0c;如侵权&#xff0c;请联系删除。 概述 GMII 是千兆网的MII接口&#xff0c;这个也有相应的 RGMII 接口&…

笔试专题(三)

文章目录 字符串中找出连续最长的数字串题解代码 拼三角题解代码 字符串中找出连续最长的数字串 题目链接 题解 1. 考察双指针 模拟 2. 算法思路&#xff1a;给定一个i 0&#xff0c;让i&#xff0c;如果遇到数字字符就创建一个变量j i&#xff0c;让j去遍历&#xff0c…

Rust从入门到精通之进阶篇:20.项目实践

项目实践 在本章中,我们将把前面学到的所有 Rust 知识整合起来,构建一个完整的应用程序。通过实际项目,你将学习如何组织代码、处理依赖关系、实现功能以及测试和部署 Rust 应用程序。我们将构建一个命令行待办事项管理器(Todo CLI),它具有添加、列出、完成和删除任务的…

深入理解指针(2)(C语言版)

文章目录 前言一、数组名的理解二、使用指针访问数组三、一维数组传参的本质四、冒泡排序五、二级指针六、指针数组七、指针数组模拟二维数组总结 前言 在上一篇文章中&#xff0c;我们初步了解了指针的基本概念和用法。今天&#xff0c;我们将继续深入探索指针在数组、函数传…

Uniapp使用大疆SDK打包离线原生插件二

上一篇讲了如何下载及配置原生插件&#xff0c;今天深入的了解下如何将java代码的SDK引入Uniapp 一、配置libs: 在Android开发中&#xff0c;libs目录通常用于存放项目所需的第三方库文件。 将sdk中的包lib.5plus.base-release.aar、android-gif-drawable-release1.2.23.aa…

日志截断/日志中途清空/不停止程序

使用场景&#xff1a; nohup ./abc.sh > 123.log 2>&1 & 若想在不停止程序的前提下减小 123.log 的占用空间或者对日志进行分割&#xff0c;可采用如下方法&#xff1a; 1. 手动截断日志 可以手动截断日志文件&#xff0c;把文件内容清空&#xff0c;但保留文…

100天精通Python(爬虫篇)——第122天:基于selenium接管已启动的浏览器(反反爬策略)

文章目录 1、问题描述2、问题推测3、解决方法3.1 selenium自动启动浏览器3.2 selenium接管已启动的浏览器3.3 区别总结4、代码实战4.1 手动方法(手动打开浏览器输入账号密码)4.2 自动方法(.bat文件启动的浏览器)1、问题描述 使用selenium自动化测试爬取pdd的时候,通过携带…

Android 12.0 WiFi连接默认设置静态IP地址功能实现

1.前言 在12.0的系统rom定制化开发中,在定制化某些功能开发中,在wifi模块中,有产品需要要求设置wifi静态ip功能,而系统中wifi连接 后ip是动态的,每次开机后 连接wifi的ip就是不固定的,所以产品需要采用固定ip,就需要实现静态ip功能 2.WiFi连接默认设置静态IP地址功能实…