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 {