From 917a652491e3ca1c84b5c9073d63b31785760f4e Mon Sep 17 00:00:00 2001 From: zhengyouxiancq Date: Tue, 4 Mar 2025 15:54:32 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=99=E7=81=B0=E5=BA=A6=E5=8F=91=E5=B8=83?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0API=E9=93=BE=E6=8E=A5=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E7=AD=9B=E9=80=89=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gateway/filter/grey/GrayLoadBalancer.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/yudao-gateway/src/main/java/cn/iocoder/yudao/gateway/filter/grey/GrayLoadBalancer.java b/yudao-gateway/src/main/java/cn/iocoder/yudao/gateway/filter/grey/GrayLoadBalancer.java index 452e5fdb0..50f38dcff 100644 --- a/yudao-gateway/src/main/java/cn/iocoder/yudao/gateway/filter/grey/GrayLoadBalancer.java +++ b/yudao-gateway/src/main/java/cn/iocoder/yudao/gateway/filter/grey/GrayLoadBalancer.java @@ -51,12 +51,22 @@ public class GrayLoadBalancer implements ReactorServiceInstanceLoadBalancer { public Mono> choose(Request request) { // 获得 HttpHeaders 属性,实现从 header 中获取 version HttpHeaders headers = ((RequestDataContext) request.getContext()).getClientRequest().getHeaders(); + //从requet中取得链接参数列表 + java.net.URI uri = ((RequestDataContext) request.getContext()).getClientRequest().getUrl(); + java.util.Map queryParams = java.util.stream.Stream.of(uri.getQuery().split("&")) + .filter(s -> !s.isEmpty()) + .map(s -> s.split("=")) + .collect(java.util.stream.Collectors.toMap( + arr -> arr[0], + arr -> arr.length > 1 ? arr[1] : "", + (existing, replacement) -> existing + )); // 选择实例 ServiceInstanceListSupplier supplier = serviceInstanceListSupplierProvider.getIfAvailable(NoopServiceInstanceListSupplier::new); - return supplier.get(request).next().map(list -> getInstanceResponse(list, headers)); + return supplier.get(request).next().map(list -> getInstanceResponse(list, headers,queryParams)); } - private Response getInstanceResponse(List instances, HttpHeaders headers) { + private Response getInstanceResponse(List instances, HttpHeaders headers, java.util.Map queryParams) { // 如果服务实例为空,则直接返回 if (CollUtil.isEmpty(instances)) { log.warn("[getInstanceResponse][serviceId({}) 服务实例列表为空]", serviceId); @@ -64,8 +74,12 @@ public class GrayLoadBalancer implements ReactorServiceInstanceLoadBalancer { } // 筛选满足 version 条件的实例列表 - String version = headers.getFirst(VERSION); + String version1 = headers.getFirst(VERSION); + if(StrUtil.isEmpty(version1)) { + version1 = queryParams.get("version"); + } List chooseInstances; + String version = version1; if (StrUtil.isEmpty(version)) { chooseInstances = instances; } else {