给灰度发布增加API链接参数筛选功能

pull/172/head
zhengyouxiancq 2025-03-04 15:54:32 +08:00
parent 54517a5125
commit 917a652491
1 changed files with 17 additions and 3 deletions

View File

@ -51,12 +51,22 @@ public class GrayLoadBalancer implements ReactorServiceInstanceLoadBalancer {
public Mono<Response<ServiceInstance>> 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<String, String> 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<ServiceInstance> getInstanceResponse(List<ServiceInstance> instances, HttpHeaders headers) {
private Response<ServiceInstance> getInstanceResponse(List<ServiceInstance> instances, HttpHeaders headers, java.util.Map<String, String> 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<ServiceInstance> chooseInstances;
String version = version1;
if (StrUtil.isEmpty(version)) {
chooseInstances = instances;
} else {