From e5a5c115da60cf125b478b9e5b5b3f589024d0df Mon Sep 17 00:00:00 2001 From: lbw Date: Wed, 8 Jun 2022 12:31:28 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20Introducing=20new=20features.=20?= =?UTF-8?q?=E7=81=B0=E5=BA=A6=E8=B7=AF=E7=94=B1=E6=94=AF=E6=8C=81=E6=A0=B9?= =?UTF-8?q?=E6=8D=AEnacos=20=E6=9D=83=E9=87=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GrayReactiveLoadBalancerClientFilter.java | 5 +-- .../gateway/rule/VersionGrayLoadBalancer.java | 30 +++++++------- .../gray/rule/GrayRoundRobinLoadBalancer.java | 39 +++++++++++++++++-- 3 files changed, 53 insertions(+), 21 deletions(-) diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/filter/GrayReactiveLoadBalancerClientFilter.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/filter/GrayReactiveLoadBalancerClientFilter.java index 791dd6eb5..aa69d7ddc 100644 --- a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/filter/GrayReactiveLoadBalancerClientFilter.java +++ b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/filter/GrayReactiveLoadBalancerClientFilter.java @@ -46,14 +46,11 @@ public class GrayReactiveLoadBalancerClientFilter extends ReactiveLoadBalancerCl private GatewayLoadBalancerProperties loadBalancerProperties; - private LoadBalancerProperties properties; - private GrayLoadBalancer grayLoadBalancer; public GrayReactiveLoadBalancerClientFilter(GatewayLoadBalancerProperties loadBalancerProperties, LoadBalancerProperties properties, GrayLoadBalancer grayLoadBalancer) { - super(null, loadBalancerProperties, properties); - this.properties = properties; + super(null, loadBalancerProperties); this.grayLoadBalancer = grayLoadBalancer; this.loadBalancerProperties = loadBalancerProperties; } diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/rule/VersionGrayLoadBalancer.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/rule/VersionGrayLoadBalancer.java index 45c152e21..affdc83f5 100644 --- a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/rule/VersionGrayLoadBalancer.java +++ b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/rule/VersionGrayLoadBalancer.java @@ -19,7 +19,7 @@ package com.pig4cloud.pigx.common.gateway.rule; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.map.MapUtil; -import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.nacos.client.naming.utils.Chooser; import com.alibaba.nacos.client.naming.utils.Pair; import com.pig4cloud.pigx.common.core.constant.CommonConstants; @@ -62,16 +62,16 @@ public class VersionGrayLoadBalancer implements GrayLoadBalancer { } // 获取请求version,无则随机返回可用实例 String reqVersion = request.getHeaders().getFirst(CommonConstants.VERSION); - if (CharSequenceUtil.isBlank(reqVersion)) { - //过滤出不含VERSION实例 + if (StrUtil.isBlank(reqVersion)) { + // 过滤出不含VERSION实例 List versionInstanceList = instances.stream() .filter(instance -> !instance.getMetadata().containsKey(CommonConstants.VERSION)) .collect(Collectors.toList()); - if(CollUtil.isEmpty(versionInstanceList)){ - //根据权重获取实例 + if (CollUtil.isEmpty(versionInstanceList)) { + // 根据权重获取实例 return randomByWeight(instances); } - //根据权重获取实例 + // 根据权重获取实例 return randomByWeight(versionInstanceList); } // 遍历可以实例元数据,若匹配则返回此实例 @@ -80,10 +80,10 @@ public class VersionGrayLoadBalancer implements GrayLoadBalancer { .equalsIgnoreCase(MapUtil.getStr(instance.getMetadata(), CommonConstants.VERSION))) .collect(Collectors.toList()); if (CollUtil.isEmpty(availableList)) { - //根据权重获取实例 + // 根据权重获取实例 return randomByWeight(instances); } - //根据权重获取实例 + // 根据权重获取实例 return randomByWeight(availableList); } @@ -92,17 +92,19 @@ public class VersionGrayLoadBalancer implements GrayLoadBalancer { * @param serviceInstances 服务实例集合 * @return 服务实例:ServiceInstance */ - protected ServiceInstance randomByWeight(final List serviceInstances){ - if(serviceInstances.size()==1){ + protected ServiceInstance randomByWeight(final List serviceInstances) { + if (serviceInstances.size() == 1) { return serviceInstances.get(0); - }else { + } + else { List> hostsWithWeight = new ArrayList<>(); for (ServiceInstance serviceInstance : serviceInstances) { - if ("true".equals(serviceInstance.getMetadata().getOrDefault("nacos.healthy","true"))) { - hostsWithWeight.add(new Pair<>(serviceInstance, Double.parseDouble(serviceInstance.getMetadata().getOrDefault("nacos.weight","1")))); + if ("true".equals(serviceInstance.getMetadata().getOrDefault("nacos.healthy", "true"))) { + hostsWithWeight.add(new Pair<>(serviceInstance, + Double.parseDouble(serviceInstance.getMetadata().getOrDefault("nacos.weight", "1")))); } } - Chooser vipChooser = new Chooser<>("www.taobao.com",hostsWithWeight); + Chooser vipChooser = new Chooser<>("www.taobao.com", hostsWithWeight); return vipChooser.randomWithWeight(); } } diff --git a/pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/rule/GrayRoundRobinLoadBalancer.java b/pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/rule/GrayRoundRobinLoadBalancer.java index 33e48e346..4ad5f8c22 100755 --- a/pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/rule/GrayRoundRobinLoadBalancer.java +++ b/pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/rule/GrayRoundRobinLoadBalancer.java @@ -2,9 +2,10 @@ package com.pig4cloud.pigx.common.gray.rule; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.cloud.nacos.NacosServiceInstance; +import com.alibaba.nacos.client.naming.utils.Chooser; +import com.alibaba.nacos.client.naming.utils.Pair; import com.pig4cloud.pigx.common.core.constant.CommonConstants; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.ObjectProvider; @@ -16,6 +17,7 @@ import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier; import org.springframework.http.HttpHeaders; import reactor.core.publisher.Mono; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -73,7 +75,16 @@ public class GrayRoundRobinLoadBalancer extends RoundRobinLoadBalancer { String reqVersion = headers.getFirst(CommonConstants.VERSION); if (StrUtil.isBlank(reqVersion)) { - return super.choose(request).block(); + // 过滤出不含VERSION实例 + List versionInstanceList = instances.stream() + .filter(instance -> !instance.getMetadata().containsKey(CommonConstants.VERSION)) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(versionInstanceList)) { + // 根据权重获取实例 + return new DefaultResponse(randomByWeight(instances)); + } + // 根据权重获取实例 + return new DefaultResponse(randomByWeight(versionInstanceList)); } // 遍历可以实例元数据,若匹配则返回此实例 @@ -86,7 +97,7 @@ public class GrayRoundRobinLoadBalancer extends RoundRobinLoadBalancer { // 存在 随机返回 if (CollUtil.isNotEmpty(serviceInstanceList)) { - ServiceInstance instance = RandomUtil.randomEle(serviceInstanceList); + ServiceInstance instance = randomByWeight(serviceInstanceList); log.debug("gray instance available serviceId: {} , instanceId: {}", serviceId, instance.getInstanceId()); return new DefaultResponse(instance); @@ -97,4 +108,26 @@ public class GrayRoundRobinLoadBalancer extends RoundRobinLoadBalancer { } } + /** + * 根据nacos设置的权重返回实例 + * @param serviceInstances 服务实例集合 + * @return 服务实例:ServiceInstance + */ + protected ServiceInstance randomByWeight(final List serviceInstances) { + if (serviceInstances.size() == 1) { + return serviceInstances.get(0); + } + else { + List> hostsWithWeight = new ArrayList<>(); + for (ServiceInstance serviceInstance : serviceInstances) { + if ("true".equals(serviceInstance.getMetadata().getOrDefault("nacos.healthy", "true"))) { + hostsWithWeight.add(new Pair<>(serviceInstance, + Double.parseDouble(serviceInstance.getMetadata().getOrDefault("nacos.weight", "1")))); + } + } + Chooser vipChooser = new Chooser<>("www.taobao.com", hostsWithWeight); + return vipChooser.randomWithWeight(); + } + } + }