Можно ли использовать прерыватель цепи hystrix с zuul?

Я знаю, что с помощью application.yml я могу изменить URL-адрес, который вызывает микросервис, но я сомневаюсь, как я могу реализовать zuul с помощью hystrix Circuit Brake? У меня есть класс, который расширяет ZuulFilter, и в моем методе запуска я пытаюсь выполнить hystrixCommand примерно так:

@Override
public Object run() {
    RequestContext ctx = RequestContext.getCurrentContext();
    HttpServletRequest request = ctx.getRequest();

    HystrixCommand<String> hystrixCommand = new HystrixCommand<String>(HystrixCommandGroupKey.Factory.asKey(request.getRequestURL().toString())) {
        @Override
        protected String run() throws Exception {
            RestTemplate restTemplate = new RestTemplate();
            String responseBody = restTemplate.getForObject(request.getRequestURL().toString(), String.class); 
            return responseBody;
        }

        @Override
        protected String getFallback() {
            return "No response from server";
        }
    };

    String response = hystrixCommand.execute();

    RequestContext.getCurrentContext().setResponseBody(response);
    return null;
}

Но как я могу сказать hystrixCommand использовать метод getFallback, если фактический URL-адрес не работает? Я думал вызвать тот же URL-адрес, но я думаю, что если я это сделаю, он будет выполнять бесконечный цикл или я не понимаю?

Заранее спасибо.

ОБНОВЛЕНИЕ

Это весь мой класс фильтров

package com.filter;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URI;

import javax.servlet.http.HttpServletRequest;
import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.springframework.web.client.RestTemplate;

public class ZuulHttpFilter extends ZuulFilter{

    @Override
    public String filterType() {
        return "pre";
    }

    @Override
    public int filterOrder() {
        return 10000;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();

        HystrixCommand<String> hystrixCommand = new HystrixCommand<String>(HystrixCommandGroupKey.Factory.asKey(request.getRequestURL().toString())) {
            @Override
            protected String run() throws Exception {
                  RestTemplate restTemplate = new RestTemplate();
                  String responseBody = restTemplate.getForObject(request.getRequestURL().toString(), String.class); 
                  return responseBody;
            }

            @Override
            protected String getFallback() {
                return "No response from server";
            }
        };

        String response = hystrixCommand.execute();

        RequestContext.getCurrentContext().setResponseBody(response);
        return null;
    }
    }

person Alan Gaytan    schedule 07.12.2016    source источник


Ответы (1)


Вы видели этот вопрос? Фактически, Hystrix javadoc говорит, что он должен выполнять откат автоматически:

Возвращает: R Результат выполнения run() или откат от getFallback(), если команда по какой-либо причине не удалась.

person Igor Deruga    schedule 07.12.2016
comment
Да, на самом деле мой пример похож на тот, что в ссылке, но когда он выполняет метод запуска внутри hystrixCommand, он зависает, позвольте мне обновить вопрос, чтобы увидеть весь класс - person Alan Gaytan; 07.12.2016
comment
Можете ли вы попробовать использовать конструктор HystrixCommand с параметром тайм-аута? HystrixCommand (группа HystrixCommandGroupKey, выполнение intIsolationThreadTimeoutInMilliseconds) - person Igor Deruga; 08.12.2016
comment
это не работает :(, я изменил свой код, чтобы использовать метод, который вызывает мой URL-адрес, и в этот метод добавить hystrixCommand, я не знаю, правильно ли это сделать, но для меня это работает - person Alan Gaytan; 09.12.2016