From b80fce8c102e94f5e72f42a024fa7055c9ba8fd0 Mon Sep 17 00:00:00 2001 From: lbw Date: Tue, 12 Jan 2021 22:15:19 +0800 Subject: [PATCH] =?UTF-8?q?:bug:=20Fixing=20a=20bug.=20#2264=20=E7=81=B0?= =?UTF-8?q?=E5=BA=A6=E5=8F=91=E5=B8=83=E8=AE=BE=E7=BD=AE=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7=E6=97=B6=E6=97=A0=E6=B3=95=E8=B4=9F=E8=BD=BD=E5=9D=87?= =?UTF-8?q?=E8=A1=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :bug: Fixing a bug. #2264 灰度发布设置版本号时无法负载均衡 --- .../gray/rule/GrayRoundRobinLoadBalancer.java | 42 ++++++++++++------- .../spring-configuration-metadata.json | 2 +- 2 files changed, 29 insertions(+), 15 deletions(-) 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 082e51829..d49f099c8 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 @@ -1,22 +1,30 @@ package com.pig4cloud.pigx.common.gray.rule; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + 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.pig4cloud.pigx.common.core.constant.CommonConstants; import lombok.extern.slf4j.Slf4j; +import reactor.core.publisher.Mono; + import org.springframework.beans.factory.ObjectProvider; import org.springframework.cloud.client.ServiceInstance; -import org.springframework.cloud.client.loadbalancer.*; +import org.springframework.cloud.client.loadbalancer.DefaultRequestContext; +import org.springframework.cloud.client.loadbalancer.DefaultResponse; +import org.springframework.cloud.client.loadbalancer.EmptyResponse; +import org.springframework.cloud.client.loadbalancer.Request; +import org.springframework.cloud.client.loadbalancer.RequestData; +import org.springframework.cloud.client.loadbalancer.Response; import org.springframework.cloud.loadbalancer.core.NoopServiceInstanceListSupplier; import org.springframework.cloud.loadbalancer.core.RoundRobinLoadBalancer; import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier; import org.springframework.http.HttpHeaders; -import reactor.core.publisher.Mono; - -import java.util.List; -import java.util.Map; /** * @author lengleng @@ -53,7 +61,7 @@ public class GrayRoundRobinLoadBalancer extends RoundRobinLoadBalancer { // 注册中心无可用实例 抛出异常 if (CollUtil.isEmpty(instances)) { - log.warn("No instance available "); + log.warn("No instance available serviceId: {}", serviceId); return new EmptyResponse(); } @@ -67,18 +75,24 @@ public class GrayRoundRobinLoadBalancer extends RoundRobinLoadBalancer { } // 遍历可以实例元数据,若匹配则返回此实例 - for (ServiceInstance instance : instances) { + List serviceInstanceList = instances.stream().filter(instance -> { NacosServiceInstance nacosInstance = (NacosServiceInstance) instance; Map metadata = nacosInstance.getMetadata(); String targetVersion = MapUtil.getStr(metadata, CommonConstants.VERSION); - if (reqVersion.equalsIgnoreCase(targetVersion)) { - log.debug("gray requst match success :{} {}", reqVersion, nacosInstance); - return new DefaultResponse(nacosInstance); - } - } + return reqVersion.equalsIgnoreCase(targetVersion); + }).collect(Collectors.toList()); - // 降级策略,使用轮询策略 - return super.choose(request).block(); + // 存在 随机返回 + if (CollUtil.isNotEmpty(serviceInstanceList)) { + ServiceInstance instance = RandomUtil.randomEle(serviceInstanceList); + + log.debug("gray instance available serviceId: {} , instanceId: {}", serviceId, instance.getInstanceId()); + return new DefaultResponse(instance); + } + else { + // 不存在,降级策略,使用轮询策略 + return super.choose(request).block(); + } } } diff --git a/pigx-common/pigx-common-gray/src/main/resources/META-INF/spring-configuration-metadata.json b/pigx-common/pigx-common-gray/src/main/resources/META-INF/spring-configuration-metadata.json index 182991096..55988467b 100755 --- a/pigx-common/pigx-common-gray/src/main/resources/META-INF/spring-configuration-metadata.json +++ b/pigx-common/pigx-common-gray/src/main/resources/META-INF/spring-configuration-metadata.json @@ -4,7 +4,7 @@ "name": "gray.rule.enabled", "type": "java.lang.Boolean", "defaultValue": false, - "sourceType": "com.pig4cloud.pigx.common.gray.GrayRibbonLoadBalancerConfiguration", + "sourceType": "com.pig4cloud.pigx.common.gray.GrayLoadBalancerAutoConfiguration", "description": "是否开启灰度路由功能" } ],