给灰度发布增加API链接参数筛选功能
parent
54517a5125
commit
917a652491
|
@ -51,12 +51,22 @@ public class GrayLoadBalancer implements ReactorServiceInstanceLoadBalancer {
|
||||||
public Mono<Response<ServiceInstance>> choose(Request request) {
|
public Mono<Response<ServiceInstance>> choose(Request request) {
|
||||||
// 获得 HttpHeaders 属性,实现从 header 中获取 version
|
// 获得 HttpHeaders 属性,实现从 header 中获取 version
|
||||||
HttpHeaders headers = ((RequestDataContext) request.getContext()).getClientRequest().getHeaders();
|
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);
|
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)) {
|
if (CollUtil.isEmpty(instances)) {
|
||||||
log.warn("[getInstanceResponse][serviceId({}) 服务实例列表为空]", serviceId);
|
log.warn("[getInstanceResponse][serviceId({}) 服务实例列表为空]", serviceId);
|
||||||
|
@ -64,8 +74,12 @@ public class GrayLoadBalancer implements ReactorServiceInstanceLoadBalancer {
|
||||||
}
|
}
|
||||||
|
|
||||||
// 筛选满足 version 条件的实例列表
|
// 筛选满足 version 条件的实例列表
|
||||||
String version = headers.getFirst(VERSION);
|
String version1 = headers.getFirst(VERSION);
|
||||||
|
if(StrUtil.isEmpty(version1)) {
|
||||||
|
version1 = queryParams.get("version");
|
||||||
|
}
|
||||||
List<ServiceInstance> chooseInstances;
|
List<ServiceInstance> chooseInstances;
|
||||||
|
String version = version1;
|
||||||
if (StrUtil.isEmpty(version)) {
|
if (StrUtil.isEmpty(version)) {
|
||||||
chooseInstances = instances;
|
chooseInstances = instances;
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue