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 323b13a1f50f4a3e7de8c1064dbda1de6af9b01a..f01ae3e4d6f20889ba3d55ee3208c66d1ba0a250 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 a99049b19d615f279106ff552aa81ce654056d75..f3f37a3b7a2e2a592a9dfd6a0be3b24a75be8d85 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 a08767d5f3324c77ef2e16034dd3751553a1151e..334dc037a3090505bf31cae7c60516d34c06a136 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 8e4b8af4d61e5f96ab6c094d46c335d782e35b80..59e4005899260d025b55c2c78f1c9945fa773da1 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.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.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.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(); + 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 057b549dfcfd2fc2b452ab2f77f38b81da8a7fb0..7c2c7ba6c8bc67fdb787c0e624432ab310262631 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 231513a54b956745eb6d54161f518e12ee84aba8..981c5bfa8156519c7ac7a1a8dc7831dbedba4a3a 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 0bf861e9757ae4dac6471c835a62d0bee39a0d12..53365202d25aee183d5c183eaa51cd4085b36fa7 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 0cc99c77b1f39cf2e695e8e49a8d1707a54f9673..aae5c1fb8477dbc61ad70d7c2f13df0ee529fa8e 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 6fed5f8523b934bc6f7f32a98b18defaa2c303f4..23cf0e393802880b2be3c87c8a8d098ff0601546 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 f901ae0229d419d6e709a176712679f152573ff0..408eaf735ac789de8140f8c125147e0a5b631c02 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,35 +10,33 @@ 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(); } - 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(); } 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); + } + } } } - @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 new file mode 100644 index 0000000000000000000000000000000000000000..ca67e61978412a2a064b2307f51b05189c22281c --- /dev/null +++ b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/InOrderBalancingHolder.java @@ -0,0 +1,68 @@ +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 extends LoadBalancingHolder { + /** + * 应用列表 + */ + private final Set applications; + + /** + * 下一个需要执行的 + */ + 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()); + } 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()); + } + } + } + } + + /** + * 修正执行顺序 + * + * @param size 当前执行的大小 + */ + private void fixInOrderIndex(int size) { + if (inOrderAtomicInteger.get() == size) { + inOrderAtomicInteger = new AtomicInteger(0); + } + } + +} 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 82693eaa8045fda13f50fbd0fad933bee6b2e635..70c2c22bf10770b907a593076307c1fddfb19457 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,35 +1,31 @@ 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(); } - 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); @@ -37,18 +33,13 @@ 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); + } } } } - @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 df1d19a9cdf470af638f4ed7377e87b8c85620d9..13d4e5c94555d891223d77fca29d6cf7768fd2fa 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,12 +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; + + /** + * 设置下一个 + */ + 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 new file mode 100644 index 0000000000000000000000000000000000000000..6375e3c230272b508e70b1844c8fea701ed15912 --- /dev/null +++ b/client/src/main/java/cn/icanci/loopstack/ras/client/cache/loadbalancing/model/RandomBalancingHolder.java @@ -0,0 +1,51 @@ +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 extends LoadBalancingHolder { + /** + * 应用列表 + */ + private final Set applications; + + 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); + } + } + } + } + +} 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 adaef62ecc7cf0b9461171e9745edcbe6854f0b6..0000000000000000000000000000000000000000 --- 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