From eb7d482d68b6b18c7fc56812dcdf2ba846444121 Mon Sep 17 00:00:00 2001 From: icanci Date: Sat, 4 Feb 2023 20:29:05 +0800 Subject: [PATCH 1/3] in order --- .../loadbalancing/InOrderLoadBalancing.java | 35 ++++++++- .../model/FirstLoadBalancingHolder.java | 3 +- .../model/InOrderBalancingHolder.java | 77 +++++++++++++++++++ .../model/LastLoadBalancingHolder.java | 3 +- .../model/LoadBalancingHolder.java | 5 ++ 5 files changed, 119 insertions(+), 4 deletions(-) create mode 100644 client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/InOrderBalancingHolder.java diff --git a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/InOrderLoadBalancing.java b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/InOrderLoadBalancing.java index 8e4b8af..48d4a27 100644 --- a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/InOrderLoadBalancing.java +++ b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/InOrderLoadBalancing.java @@ -1,10 +1,16 @@ package cn.icanci.loopstack.ras.client.cache.loadbalancing; +import cn.icanci.loopstack.ras.client.cache.loadbalancing.model.InOrderBalancingHolder; import cn.icanci.loopstack.ras.client.cache.model.ApplicationValue; +import cn.icanci.loopstack.ras.client.cache.model.ClientApplicationValue; import cn.icanci.loopstack.ras.common.enums.LoadBalanceTypeEnum; +import java.util.Map; import java.util.Optional; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; /** @@ -16,19 +22,44 @@ import org.springframework.stereotype.Service; @Service @LoadBalancingBean(LoadBalanceTypeEnum.IN_ORDER) public class InOrderLoadBalancing extends LoadBalancingCache implements LoadBalancing { + /** + * 数据缓存结果模型 + */ + private static Map HOLDER = new ConcurrentHashMap<>(); @Override public void init() { + // 1.根据路由表,找到所有的指定路由方式 + if (isLbAppEmpty()) { + return; + } + Set applicationValues = filterLbType(LoadBalanceTypeEnum.IN_ORDER); + if (CollectionUtils.isEmpty(applicationValues)) { + return; + } + Map tempMap = new ConcurrentHashMap<>(); + // 2.遍历应用表,构建缓存 + for (ClientApplicationValue applicationValue : applicationValues) { + String appId = applicationValue.getAppId(); + Set apps = applicationValue.getApplicationValues(); + tempMap.put(appId, new InOrderBalancingHolder(apps)); + } + // 3.替换 + HOLDER = tempMap; } @Override public void refresh() { - + init(); } @Override public Optional route(String appId) { - return Optional.empty(); + InOrderBalancingHolder holder = HOLDER.get(appId); + if (holder == null) { + return Optional.empty(); + } + return Optional.ofNullable(holder.getNext()); } } diff --git a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/FirstLoadBalancingHolder.java b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/FirstLoadBalancingHolder.java index f901ae0..687d2e9 100644 --- a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/FirstLoadBalancingHolder.java +++ b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/FirstLoadBalancingHolder.java @@ -26,7 +26,8 @@ public class FirstLoadBalancingHolder implements LoadBalancingHolder { setNext(); } - private void setNext() { + @Override + public void setNext() { Optional optional = applications.stream().filter(app -> app.getOnline() == 0 && app.getIsDelete() == 0).findFirst(); if (optional.isPresent()) { this.next = optional.get(); diff --git a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/InOrderBalancingHolder.java b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/InOrderBalancingHolder.java new file mode 100644 index 0000000..c4a660a --- /dev/null +++ b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/InOrderBalancingHolder.java @@ -0,0 +1,77 @@ +package cn.icanci.loopstack.ras.client.cache.loadbalancing.model; + +import cn.icanci.loopstack.ras.client.cache.model.ApplicationValue; + +import java.util.List; +import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +import org.apache.commons.collections4.CollectionUtils; + +/** + * @author icanci + * @since 1.0 Created in 2023/02/04 17:44 + */ +public class InOrderBalancingHolder implements LoadBalancingHolder { + /** + * 应用列表 + */ + private final Set applications; + + /** + * 下一个需要被调用的 + */ + private ApplicationValue next; + + /** + * 下一个需要执行的 + */ + private AtomicInteger inOrderAtomicInteger = new AtomicInteger(0); + + public InOrderBalancingHolder(Set applications) { + this.applications = applications; + setNext(); + } + + /** + * 设置下一个需要加载的数据 + */ + @Override + public void setNext() { + // 这里获取的顺序不会出现问题,因为每次构建都处理了最新的数据 + List apps = applications.stream().filter(app -> app.getOnline() == 0 && app.getIsDelete() == 0).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(apps)) { + this.next = apps.get(inOrderAtomicInteger.incrementAndGet()); + fixInOrderIndex(apps.size()); + } else { + apps = applications.stream().filter(app -> app.getOnline() == 0).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(apps)) { + this.next = apps.get(inOrderAtomicInteger.incrementAndGet()); + fixInOrderIndex(apps.size()); + } + } + } + + /** + * 修正执行顺序 + * + * @param size 当前执行的大小 + */ + private void fixInOrderIndex(int size) { + if (inOrderAtomicInteger.get() == size) { + inOrderAtomicInteger = new AtomicInteger(0); + } + } + + @Override + public ApplicationValue getNext() { + // 先拿出下一个 + ApplicationValue tmpNext = next; + // 设置下一个 + setNext(); + // 返回当前的 + return tmpNext; + } + +} diff --git a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/LastLoadBalancingHolder.java b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/LastLoadBalancingHolder.java index 82693ea..933daa8 100644 --- a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/LastLoadBalancingHolder.java +++ b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/LastLoadBalancingHolder.java @@ -29,7 +29,8 @@ public class LastLoadBalancingHolder implements LoadBalancingHolder { setNext(); } - private void setNext() { + @Override + public void setNext() { List apps = applications.stream().filter(app -> app.getOnline() == 0 && app.getIsDelete() == 0).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(apps)) { this.next = apps.get(apps.size() - 1); diff --git a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/LoadBalancingHolder.java b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/LoadBalancingHolder.java index df1d19a..e91ae6c 100644 --- a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/LoadBalancingHolder.java +++ b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/LoadBalancingHolder.java @@ -10,6 +10,11 @@ import cn.icanci.loopstack.ras.client.cache.model.ApplicationValue; */ public interface LoadBalancingHolder { + /** + * 设置下一个 + */ + void setNext(); + /** * 获取下一个需要被调用的ApplicationValue * -- Gitee From 754c520f640bfceb82a0dc4f074dc58b6029e638 Mon Sep 17 00:00:00 2001 From: icanci Date: Sat, 4 Feb 2023 20:43:59 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ConsistencyHashLoadBalancing.java | 8 +-- .../FastestCallSpeedLoadBalancing.java | 8 +-- .../loadbalancing/FirstLoadBalancing.java | 10 +-- .../loadbalancing/InOrderLoadBalancing.java | 10 +-- .../loadbalancing/LastLoadBalancing.java | 12 +--- .../LeastFrequentlyUsedLoadBalancing.java | 12 ++-- .../LeastRecentlyUsedLoadBalancing.java | 12 ++-- .../loadbalancing/LoadBalancingCache.java | 36 ++++++++++ .../loadbalancing/RandomLoadBalancing.java | 37 +++++++++-- .../model/FirstLoadBalancingHolder.java | 9 ++- .../model/InOrderBalancingHolder.java | 6 ++ .../model/LastLoadBalancingHolder.java | 5 ++ .../model/RandomBalancingHolder.java | 66 +++++++++++++++++++ 13 files changed, 178 insertions(+), 53 deletions(-) create mode 100644 client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/RandomBalancingHolder.java diff --git a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/ConsistencyHashLoadBalancing.java b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/ConsistencyHashLoadBalancing.java index 323b13a..f01ae3e 100644 --- a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/ConsistencyHashLoadBalancing.java +++ b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/ConsistencyHashLoadBalancing.java @@ -1,10 +1,8 @@ package cn.icanci.loopstack.ras.client.cache.loadbalancing; -import cn.icanci.loopstack.ras.client.cache.model.ApplicationValue; +import cn.icanci.loopstack.ras.client.cache.loadbalancing.model.LoadBalancingHolder; import cn.icanci.loopstack.ras.common.enums.LoadBalanceTypeEnum; -import java.util.Optional; - import org.springframework.stereotype.Service; /** @@ -28,7 +26,7 @@ public class ConsistencyHashLoadBalancing extends LoadBalancingCache implements } @Override - public Optional route(String appId) { - return Optional.empty(); + protected LoadBalancingHolder getHolder(String appId) { + return null; } } diff --git a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/FastestCallSpeedLoadBalancing.java b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/FastestCallSpeedLoadBalancing.java index a99049b..f3f37a3 100644 --- a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/FastestCallSpeedLoadBalancing.java +++ b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/FastestCallSpeedLoadBalancing.java @@ -1,10 +1,8 @@ package cn.icanci.loopstack.ras.client.cache.loadbalancing; -import cn.icanci.loopstack.ras.client.cache.model.ApplicationValue; +import cn.icanci.loopstack.ras.client.cache.loadbalancing.model.LoadBalancingHolder; import cn.icanci.loopstack.ras.common.enums.LoadBalanceTypeEnum; -import java.util.Optional; - import org.springframework.stereotype.Service; /** @@ -26,7 +24,7 @@ public class FastestCallSpeedLoadBalancing extends LoadBalancingCache implements } @Override - public Optional route(String appId) { - return Optional.empty(); + protected LoadBalancingHolder getHolder(String appId) { + return null; } } diff --git a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/FirstLoadBalancing.java b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/FirstLoadBalancing.java index a08767d..334dc03 100644 --- a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/FirstLoadBalancing.java +++ b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/FirstLoadBalancing.java @@ -1,12 +1,12 @@ package cn.icanci.loopstack.ras.client.cache.loadbalancing; import cn.icanci.loopstack.ras.client.cache.loadbalancing.model.FirstLoadBalancingHolder; +import cn.icanci.loopstack.ras.client.cache.loadbalancing.model.LoadBalancingHolder; import cn.icanci.loopstack.ras.client.cache.model.ApplicationValue; import cn.icanci.loopstack.ras.client.cache.model.ClientApplicationValue; import cn.icanci.loopstack.ras.common.enums.LoadBalanceTypeEnum; import java.util.Map; -import java.util.Optional; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -55,11 +55,7 @@ public class FirstLoadBalancing extends LoadBalancingCache implements LoadBalanc } @Override - public Optional route(String appId) { - FirstLoadBalancingHolder holder = HOLDER.get(appId); - if (holder == null) { - return Optional.empty(); - } - return Optional.ofNullable(holder.getNext()); + protected LoadBalancingHolder getHolder(String appId) { + return HOLDER.get(appId); } } diff --git a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/InOrderLoadBalancing.java b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/InOrderLoadBalancing.java index 48d4a27..59e4005 100644 --- a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/InOrderLoadBalancing.java +++ b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/InOrderLoadBalancing.java @@ -1,12 +1,12 @@ package cn.icanci.loopstack.ras.client.cache.loadbalancing; import cn.icanci.loopstack.ras.client.cache.loadbalancing.model.InOrderBalancingHolder; +import cn.icanci.loopstack.ras.client.cache.loadbalancing.model.LoadBalancingHolder; import cn.icanci.loopstack.ras.client.cache.model.ApplicationValue; import cn.icanci.loopstack.ras.client.cache.model.ClientApplicationValue; import cn.icanci.loopstack.ras.common.enums.LoadBalanceTypeEnum; import java.util.Map; -import java.util.Optional; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -55,11 +55,7 @@ public class InOrderLoadBalancing extends LoadBalancingCache implements LoadBala } @Override - public Optional route(String appId) { - InOrderBalancingHolder holder = HOLDER.get(appId); - if (holder == null) { - return Optional.empty(); - } - return Optional.ofNullable(holder.getNext()); + protected LoadBalancingHolder getHolder(String appId) { + return HOLDER.get(appId); } } diff --git a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/LastLoadBalancing.java b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/LastLoadBalancing.java index 057b549..7c2c7ba 100644 --- a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/LastLoadBalancing.java +++ b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/LastLoadBalancing.java @@ -1,12 +1,12 @@ package cn.icanci.loopstack.ras.client.cache.loadbalancing; import cn.icanci.loopstack.ras.client.cache.loadbalancing.model.LastLoadBalancingHolder; +import cn.icanci.loopstack.ras.client.cache.loadbalancing.model.LoadBalancingHolder; import cn.icanci.loopstack.ras.client.cache.model.ApplicationValue; import cn.icanci.loopstack.ras.client.cache.model.ClientApplicationValue; import cn.icanci.loopstack.ras.common.enums.LoadBalanceTypeEnum; import java.util.Map; -import java.util.Optional; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -50,19 +50,13 @@ public class LastLoadBalancing extends LoadBalancingCache implements LoadBalanci HOLDER = tempMap; } - - @Override public void refresh() { init(); } @Override - public Optional route(String appId) { - LastLoadBalancingHolder holder = HOLDER.get(appId); - if (holder == null) { - return Optional.empty(); - } - return Optional.ofNullable(holder.getNext()); + protected LoadBalancingHolder getHolder(String appId) { + return HOLDER.get(appId); } } diff --git a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/LeastFrequentlyUsedLoadBalancing.java b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/LeastFrequentlyUsedLoadBalancing.java index 231513a..981c5bf 100644 --- a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/LeastFrequentlyUsedLoadBalancing.java +++ b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/LeastFrequentlyUsedLoadBalancing.java @@ -1,12 +1,10 @@ package cn.icanci.loopstack.ras.client.cache.loadbalancing; -import cn.icanci.loopstack.ras.client.cache.model.ApplicationValue; -import cn.icanci.loopstack.ras.common.enums.LoadBalanceTypeEnum; - -import java.util.Optional; - import org.springframework.stereotype.Service; +import cn.icanci.loopstack.ras.client.cache.loadbalancing.model.LoadBalancingHolder; +import cn.icanci.loopstack.ras.common.enums.LoadBalanceTypeEnum; + /** * @author icanci * @since 1.0 Created in 2023/01/30 19:36 @@ -26,7 +24,7 @@ public class LeastFrequentlyUsedLoadBalancing extends LoadBalancingCache impleme } @Override - public Optional route(String appId) { - return Optional.empty(); + protected LoadBalancingHolder getHolder(String appId) { + return HOLDER.get(appId); } } diff --git a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/LeastRecentlyUsedLoadBalancing.java b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/LeastRecentlyUsedLoadBalancing.java index 0bf861e..5336520 100644 --- a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/LeastRecentlyUsedLoadBalancing.java +++ b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/LeastRecentlyUsedLoadBalancing.java @@ -1,12 +1,10 @@ package cn.icanci.loopstack.ras.client.cache.loadbalancing; -import cn.icanci.loopstack.ras.client.cache.model.ApplicationValue; -import cn.icanci.loopstack.ras.common.enums.LoadBalanceTypeEnum; - -import java.util.Optional; - import org.springframework.stereotype.Service; +import cn.icanci.loopstack.ras.client.cache.loadbalancing.model.LoadBalancingHolder; +import cn.icanci.loopstack.ras.common.enums.LoadBalanceTypeEnum; + /** * @author icanci * @since 1.0 Created in 2023/01/30 19:36 @@ -26,7 +24,7 @@ public class LeastRecentlyUsedLoadBalancing extends LoadBalancingCache implement } @Override - public Optional route(String appId) { - return Optional.empty(); + protected LoadBalancingHolder getHolder(String appId) { + return HOLDER.get(appId); } } diff --git a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/LoadBalancingCache.java b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/LoadBalancingCache.java index 0cc99c7..aae5c1f 100644 --- a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/LoadBalancingCache.java +++ b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/LoadBalancingCache.java @@ -1,9 +1,12 @@ package cn.icanci.loopstack.ras.client.cache.loadbalancing; import cn.icanci.loopstack.ras.client.cache.MetaCacheHolder; +import cn.icanci.loopstack.ras.client.cache.loadbalancing.model.LoadBalancingHolder; +import cn.icanci.loopstack.ras.client.cache.model.ApplicationValue; import cn.icanci.loopstack.ras.client.cache.model.ClientApplicationValue; import cn.icanci.loopstack.ras.common.enums.LoadBalanceTypeEnum; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -19,11 +22,44 @@ import org.apache.commons.collections4.CollectionUtils; */ public abstract class LoadBalancingCache extends MetaCacheHolder { + /** + * app是否是空 + * + * @return 返回App是不是空 + */ protected static boolean isLbAppEmpty() { return CollectionUtils.isEmpty(LD_APPLICATIONS); } + /** + * 进行过滤 + * + * @param loadBalanceType loadBalanceType + * @return 返回过滤类型 + */ protected static Set filterLbType(LoadBalanceTypeEnum loadBalanceType) { return LD_APPLICATIONS.stream().filter(value -> value.getLoadBalanceType() == loadBalanceType).collect(Collectors.toSet()); } + + /** + * 进行路由 + * + * @param appId appId + * @return 返回路由参数 + */ + public Optional route(String appId) { + LoadBalancingHolder holder = getHolder(appId); + if (holder == null) { + return Optional.empty(); + } + return Optional.ofNullable(holder.getNext()); + } + + /** + * 获取Holder对象 + * + * @param appId appId + * @return 返回负载holder + */ + protected abstract LoadBalancingHolder getHolder(String appId); } diff --git a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/RandomLoadBalancing.java b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/RandomLoadBalancing.java index 6fed5f8..23cf0e3 100644 --- a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/RandomLoadBalancing.java +++ b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/RandomLoadBalancing.java @@ -1,10 +1,16 @@ package cn.icanci.loopstack.ras.client.cache.loadbalancing; +import cn.icanci.loopstack.ras.client.cache.loadbalancing.model.LoadBalancingHolder; +import cn.icanci.loopstack.ras.client.cache.loadbalancing.model.RandomBalancingHolder; import cn.icanci.loopstack.ras.client.cache.model.ApplicationValue; +import cn.icanci.loopstack.ras.client.cache.model.ClientApplicationValue; import cn.icanci.loopstack.ras.common.enums.LoadBalanceTypeEnum; -import java.util.Optional; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; /** @@ -16,19 +22,40 @@ import org.springframework.stereotype.Service; @Service @LoadBalancingBean(LoadBalanceTypeEnum.RANDOM) public class RandomLoadBalancing extends LoadBalancingCache implements LoadBalancing { + /** + * 数据缓存结果模型 + */ + private static Map HOLDER = new ConcurrentHashMap<>(); @Override public void init() { - + // 1.根据路由表,找到所有的指定路由方式 + if (isLbAppEmpty()) { + return; + } + Set applicationValues = filterLbType(LoadBalanceTypeEnum.FIRST); + + if (CollectionUtils.isEmpty(applicationValues)) { + return; + } + Map tempMap = new ConcurrentHashMap<>(); + // 2.遍历应用表,构建缓存 + for (ClientApplicationValue applicationValue : applicationValues) { + String appId = applicationValue.getAppId(); + Set apps = applicationValue.getApplicationValues(); + tempMap.put(appId, new RandomBalancingHolder(apps)); + } + // 3.替换 + HOLDER = tempMap; } @Override public void refresh() { - + init(); } @Override - public Optional route(String appId) { - return Optional.empty(); + protected LoadBalancingHolder getHolder(String appId) { + return HOLDER.get(appId); } } diff --git a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/FirstLoadBalancingHolder.java b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/FirstLoadBalancingHolder.java index 687d2e9..695e8c7 100644 --- a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/FirstLoadBalancingHolder.java +++ b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/FirstLoadBalancingHolder.java @@ -33,7 +33,14 @@ public class FirstLoadBalancingHolder implements LoadBalancingHolder { this.next = optional.get(); } else { optional = applications.stream().filter(app -> app.getOnline() == 0).findFirst(); - optional.ifPresent(applicationValue -> this.next = applicationValue); + if (optional.isPresent()) { + optional.ifPresent(applicationValue -> this.next = applicationValue); + } else { + optional = applications.stream().filter(app -> app.getOnline() == 1).findFirst(); + if (optional.isPresent()) { + optional.ifPresent(applicationValue -> this.next = applicationValue); + } + } } } diff --git a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/InOrderBalancingHolder.java b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/InOrderBalancingHolder.java index c4a660a..e843065 100644 --- a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/InOrderBalancingHolder.java +++ b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/InOrderBalancingHolder.java @@ -49,6 +49,12 @@ public class InOrderBalancingHolder implements LoadBalancingHolder { if (CollectionUtils.isNotEmpty(apps)) { this.next = apps.get(inOrderAtomicInteger.incrementAndGet()); fixInOrderIndex(apps.size()); + } else { + apps = applications.stream().filter(app -> app.getOnline() == 1).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(apps)) { + this.next = apps.get(inOrderAtomicInteger.incrementAndGet()); + fixInOrderIndex(apps.size()); + } } } } diff --git a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/LastLoadBalancingHolder.java b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/LastLoadBalancingHolder.java index 933daa8..bf929b7 100644 --- a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/LastLoadBalancingHolder.java +++ b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/LastLoadBalancingHolder.java @@ -38,6 +38,11 @@ public class LastLoadBalancingHolder implements LoadBalancingHolder { apps = applications.stream().filter(app -> app.getOnline() == 0).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(apps)) { this.next = apps.get(apps.size() - 1); + } else { + apps = applications.stream().filter(app -> app.getOnline() == 1).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(apps)) { + this.next = apps.get(apps.size() - 1); + } } } } diff --git a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/RandomBalancingHolder.java b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/RandomBalancingHolder.java new file mode 100644 index 0000000..6c87705 --- /dev/null +++ b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/RandomBalancingHolder.java @@ -0,0 +1,66 @@ +package cn.icanci.loopstack.ras.client.cache.loadbalancing.model; + +import cn.icanci.loopstack.ras.client.cache.model.ApplicationValue; + +import java.util.List; +import java.util.Random; +import java.util.Set; +import java.util.stream.Collectors; + +import org.apache.commons.collections4.CollectionUtils; + +/** + * @author icanci + * @since 1.0 Created in 2023/02/04 17:44 + */ +public class RandomBalancingHolder implements LoadBalancingHolder { + /** + * 应用列表 + */ + private final Set applications; + + /** + * 下一个需要被调用的 + */ + private ApplicationValue next; + + public RandomBalancingHolder(Set applications) { + this.applications = applications; + setNext(); + } + + /** + * 设置下一个需要加载的数据 + */ + @Override + public void setNext() { + List apps = applications.stream().filter(app -> app.getOnline() == 0 && app.getIsDelete() == 0).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(apps)) { + int index = new Random().nextInt(apps.size()); + this.next = apps.get(index); + } else { + apps = applications.stream().filter(app -> app.getOnline() == 0).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(apps)) { + int index = new Random().nextInt(apps.size()); + this.next = apps.get(index); + } else { + apps = applications.stream().filter(app -> app.getOnline() == 1).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(apps)) { + int index = new Random().nextInt(apps.size()); + this.next = apps.get(index); + } + } + } + } + + @Override + public ApplicationValue getNext() { + // 先拿出下一个 + ApplicationValue tmpNext = next; + // 设置下一个 + setNext(); + // 返回当前的 + return tmpNext; + } + +} -- Gitee From 2e8cd59c78676505ee678a047a956d97f2493d6d Mon Sep 17 00:00:00 2001 From: icanci Date: Sat, 4 Feb 2023 20:51:32 +0800 Subject: [PATCH 3/3] =?UTF-8?q?LoadBalancingHolder=20=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/FirstLoadBalancingHolder.java | 12 +---------- .../model/InOrderBalancingHolder.java | 17 +-------------- .../model/LastLoadBalancingHolder.java | 21 +++---------------- .../model/LoadBalancingHolder.java | 20 ++++++++++++++---- .../model/RandomBalancingHolder.java | 17 +-------------- .../loadbalancing/model/package-info.java | 7 ------- 6 files changed, 22 insertions(+), 72 deletions(-) delete mode 100644 client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/package-info.java diff --git a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/FirstLoadBalancingHolder.java b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/FirstLoadBalancingHolder.java index 695e8c7..408eaf7 100644 --- a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/FirstLoadBalancingHolder.java +++ b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/FirstLoadBalancingHolder.java @@ -10,17 +10,12 @@ import java.util.Set; * @author icanci * @since 1.0 Created in 2023/02/04 17:44 */ -public class FirstLoadBalancingHolder implements LoadBalancingHolder { +public class FirstLoadBalancingHolder extends LoadBalancingHolder { /** * 应用列表 */ private final Set applications; - /** - * 下一个需要被调用的 - */ - private ApplicationValue next; - public FirstLoadBalancingHolder(Set applications) { this.applications = applications; setNext(); @@ -44,9 +39,4 @@ public class FirstLoadBalancingHolder implements LoadBalancingHolder { } } - @Override - public ApplicationValue getNext() { - return next; - } - } diff --git a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/InOrderBalancingHolder.java b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/InOrderBalancingHolder.java index e843065..ca67e61 100644 --- a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/InOrderBalancingHolder.java +++ b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/InOrderBalancingHolder.java @@ -13,17 +13,12 @@ import org.apache.commons.collections4.CollectionUtils; * @author icanci * @since 1.0 Created in 2023/02/04 17:44 */ -public class InOrderBalancingHolder implements LoadBalancingHolder { +public class InOrderBalancingHolder extends LoadBalancingHolder { /** * 应用列表 */ private final Set applications; - /** - * 下一个需要被调用的 - */ - private ApplicationValue next; - /** * 下一个需要执行的 */ @@ -70,14 +65,4 @@ public class InOrderBalancingHolder implements LoadBalancingHolder { } } - @Override - public ApplicationValue getNext() { - // 先拿出下一个 - ApplicationValue tmpNext = next; - // 设置下一个 - setNext(); - // 返回当前的 - return tmpNext; - } - } diff --git a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/LastLoadBalancingHolder.java b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/LastLoadBalancingHolder.java index bf929b7..70c2c22 100644 --- a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/LastLoadBalancingHolder.java +++ b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/LastLoadBalancingHolder.java @@ -1,29 +1,24 @@ package cn.icanci.loopstack.ras.client.cache.loadbalancing.model; -import cn.icanci.loopstack.ras.client.cache.model.ApplicationValue; - import java.util.List; import java.util.Set; import java.util.stream.Collectors; import org.apache.commons.collections4.CollectionUtils; +import cn.icanci.loopstack.ras.client.cache.model.ApplicationValue; + /** * * @author icanci * @since 1.0 Created in 2023/02/04 17:44 */ -public class LastLoadBalancingHolder implements LoadBalancingHolder { +public class LastLoadBalancingHolder extends LoadBalancingHolder { /** * 应用列表 */ private final Set applications; - /** - * 下一个需要被调用的 - */ - private ApplicationValue next; - public LastLoadBalancingHolder(Set applications) { this.applications = applications; setNext(); @@ -47,14 +42,4 @@ public class LastLoadBalancingHolder implements LoadBalancingHolder { } } - @Override - public ApplicationValue getNext() { - // 先拿出下一个 - ApplicationValue tmpNext = next; - // 设置下一个 - setNext(); - // 返回当前的 - return tmpNext; - } - } diff --git a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/LoadBalancingHolder.java b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/LoadBalancingHolder.java index e91ae6c..13d4e5c 100644 --- a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/LoadBalancingHolder.java +++ b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/LoadBalancingHolder.java @@ -8,17 +8,29 @@ import cn.icanci.loopstack.ras.client.cache.model.ApplicationValue; * @author icanci * @since 1.0 Created in 2023/02/04 17:44 */ -public interface LoadBalancingHolder { +public abstract class LoadBalancingHolder { + + /** + * 下一个需要被调用的 + */ + protected ApplicationValue next; /** * 设置下一个 */ - void setNext(); + public abstract void setNext(); /** * 获取下一个需要被调用的ApplicationValue - * + * * @return ApplicationValue */ - ApplicationValue getNext(); + public ApplicationValue getNext() { + // 先拿出下一个 + ApplicationValue tmpNext = next; + // 设置下一个 + setNext(); + // 返回当前的 + return tmpNext; + } } diff --git a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/RandomBalancingHolder.java b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/RandomBalancingHolder.java index 6c87705..6375e3c 100644 --- a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/RandomBalancingHolder.java +++ b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/RandomBalancingHolder.java @@ -13,17 +13,12 @@ import org.apache.commons.collections4.CollectionUtils; * @author icanci * @since 1.0 Created in 2023/02/04 17:44 */ -public class RandomBalancingHolder implements LoadBalancingHolder { +public class RandomBalancingHolder extends LoadBalancingHolder { /** * 应用列表 */ private final Set applications; - /** - * 下一个需要被调用的 - */ - private ApplicationValue next; - public RandomBalancingHolder(Set applications) { this.applications = applications; setNext(); @@ -53,14 +48,4 @@ public class RandomBalancingHolder implements LoadBalancingHolder { } } - @Override - public ApplicationValue getNext() { - // 先拿出下一个 - ApplicationValue tmpNext = next; - // 设置下一个 - setNext(); - // 返回当前的 - return tmpNext; - } - } diff --git a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/package-info.java b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/package-info.java deleted file mode 100644 index adaef62..0000000 --- a/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * LoadBalancing 算法执行模型 - * - * @author icanci - * @since 1.0 Created in 2023/02/01 09:37 - */ -package cn.icanci.loopstack.ras.client.cache.loadbalancing.model; \ No newline at end of file -- Gitee