Канарское развертывание Spring Cloud - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть весенний облачный микро-сервис с Zuul, работающим на докере.

Требование:

Я хочу создать развертывание канаре с особыми требованиями, так как у нас будет x клиентов, и я хочу канареяпроверить с определенными клиентами (используя электронную почту или имя пользователя).

Можно ли настроить шлюз для маршрутизации запросов на новую версию микросервиса для этих клиентов y?

1 Ответ

0 голосов
/ 14 февраля 2019

Таким образом, вы можете сделать это с помощью конфигурации или динамической маршрутизации, но я думаю, что во-первых, 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;
    }
}
...