From bd6cb06d7e11b825ff424eb903289bc00f6052b0 Mon Sep 17 00:00:00 2001 From: wind Date: Fri, 21 Apr 2023 21:12:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E5=B9=B3=E6=BB=91=E5=8A=A0=E6=9D=83=E7=AE=97=E6=B3=95=E7=9A=84?= =?UTF-8?q?=E8=B4=9F=E8=BD=BD=E5=9D=87=E8=A1=A1=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/sms4j/core/load/LoadServer.java | 48 +++++++++++++ .../org/dromara/sms4j/core/load/SmsLoad.java | 70 +++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 sms4j-core/src/main/java/org/dromara/sms4j/core/load/LoadServer.java create mode 100644 sms4j-core/src/main/java/org/dromara/sms4j/core/load/SmsLoad.java diff --git a/sms4j-core/src/main/java/org/dromara/sms4j/core/load/LoadServer.java b/sms4j-core/src/main/java/org/dromara/sms4j/core/load/LoadServer.java new file mode 100644 index 00000000..fc51de41 --- /dev/null +++ b/sms4j-core/src/main/java/org/dromara/sms4j/core/load/LoadServer.java @@ -0,0 +1,48 @@ +package org.dromara.sms4j.core.load; + +import org.dromara.sms4j.api.SmsBlend; + +public class LoadServer { + private SmsBlend smsServer; + private int weight; + private int currentWeight; + + protected LoadServer(SmsBlend smsServer, int weight, int currentWeight) { + this.smsServer = smsServer; + this.weight = weight; + this.currentWeight = currentWeight; + } + + protected SmsBlend getSmsServer() { + return smsServer; + } + + protected int getWeight() { + return weight; + } + + protected int getCurrentWeight() { + return currentWeight; + } + + /** + * 设置 smsServer + */ + protected void setSmsServer(SmsBlend smsServer) { + this.smsServer = smsServer; + } + + /** + * 设置 weight + */ + protected void setWeight(int weight) { + this.weight = weight; + } + + /** + * 设置 currentWeight + */ + protected void setCurrentWeight(int currentWeight) { + this.currentWeight = currentWeight; + } +} diff --git a/sms4j-core/src/main/java/org/dromara/sms4j/core/load/SmsLoad.java b/sms4j-core/src/main/java/org/dromara/sms4j/core/load/SmsLoad.java new file mode 100644 index 00000000..46c400db --- /dev/null +++ b/sms4j-core/src/main/java/org/dromara/sms4j/core/load/SmsLoad.java @@ -0,0 +1,70 @@ +package org.dromara.sms4j.core.load; + +import org.dromara.sms4j.api.SmsBlend; + +import java.util.*; + +/** + * SmsLoad + *

自定义的一个平滑加权负载服务,可以用于存放多个短信实现负载 + * @author :Wind + * 2023/4/21 20:49 + **/ +public class SmsLoad { + // 服务器列表,每个服务器有一个权重和当前权重 + private static final List LoadServers = new ArrayList<>(); + + private SmsLoad() { + } + + /** + * addLoadServer + *

添加服务及其权重 + *

添加权重应注意,不要把某个权重设置的与其他权重相差过大,否则容易出现无法负载,单一选择的情况 + * @param LoadServer 短信实现 + * @param weight 权重 + * @author :Wind + */ + public static void addLoadServer(SmsBlend LoadServer, int weight) { + LoadServers.add(new LoadServer(LoadServer, weight, weight)); + } + + /** + * removeLoadServer + *

移除短信服务 + * @param LoadServer 要移除的服务 + * @author :Wind + */ + public static void removeLoadServer(SmsBlend LoadServer) { + for (int i = 0; i < LoadServers.size(); i++) { + if (LoadServers.get(i).getSmsServer().equals(LoadServer)) { + LoadServers.remove(i); + break; + } + } + } + + // 获取一个服务 + public static SmsBlend getLoadServer() { + int totalWeight = 0; + LoadServer selectedLoadServer = null; + // 计算所有服务器的权重总和,并选择当前权重最大的服务器 + for (LoadServer LoadServer : LoadServers) { + totalWeight += LoadServer.getWeight(); + int currentWeight = LoadServer.getCurrentWeight() + LoadServer.getWeight(); + LoadServer.setCurrentWeight(currentWeight); + if (selectedLoadServer == null || LoadServer.getCurrentWeight() > selectedLoadServer.getCurrentWeight()) { + selectedLoadServer = LoadServer; + } + } + // 如果没有服务器,则返回空 + if (selectedLoadServer == null) { + return null; + } + // 更新选择的服务器的当前权重,并返回其地址 + int i = selectedLoadServer.getCurrentWeight() - totalWeight; + selectedLoadServer.setCurrentWeight(i); + return selectedLoadServer.getSmsServer(); + } +} +