Канарское развертывание Spring Cloud
У меня есть весенний облачный микросервис с Zuul, работающим на докере.
Требование:
Я хочу создать канареечное развертывание с особыми требованиями, так как у нас будет x клиентов, и я хочу протестировать канарейку с y конкретными клиентами (используя электронную почту или имя пользователя).
Могу ли я настроить шлюз для маршрутизации запросов к новой версии микросервиса для этих клиентов?
1 ответ
Таким образом, вы можете сделать это с помощью конфигурации или динамической маршрутизации, но я думаю, что во-первых, idom не подходит для общей части, каждый клиент должен определять его снова и снова, но второй вариант более хорош
@Component
public class PostFilter extends ZuulFilter {
private static final String REQUEST_PATH = "/special-customer-product-request-url";
private static final String TARGET_SERVICE = "special-customer-service";
private static final String HTTP_METHOD = "POST or GET";
private final DiscoveryClient discoveryClient;
public PostOrdersFilter(DiscoveryClient discoveryClient) {
this.discoveryClient = discoveryClient;
}
@Override
public String filterType() {
return "route";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
String method = request.getMethod();
String requestURI = request.getRequestURI();
return HTTP_METHOD.equalsIgnoreCase(method) && requestURI.startsWith(REQUEST_PATH);
}
@Override
public Object run() {
RequestContext context = RequestContext.getCurrentContext();
List<ServiceInstance> instances = discoveryClient.getInstances(TARGET_SERVICE);
try {
if (instances != null && instances.size() > 0) {
context.setRouteHost(instances.get(0).getUri().toURL());
} else {
throw new IllegalStateException("Target service instance not found!");
}
} catch (Exception e) {
throw new IllegalArgumentException("Couldn't get service URL!", e);
}
return null;
}
}