2016-06-29 4 views
3

Я использую библиотеки библиотеки Hystrix Netflix, чтобы выступать в качестве автоматического выключателя при подключении к удаленным службам в клиенте REST, который я создаю. Я хотел бы настроить мониторинг потока событий и мониторинга панели мониторинга через библиотеки, которые они предоставляют. Посмотрев на их пример приложения here, кажется, что мне нужно применить свои сервлет-фильтры и классы сервлета к моему веб-приложению.Использование Hystrix Java Servlet & Servlet Filter в Джерси 2

Я использую Spring Boot с Джерси 2 и подключаю свои ресурсы и фильтры в файле JerseyConfig.java (без web.xml). Я знаю, что фильтры Джерси не совпадают с фильтрами сервлетов, и я пытаюсь объединить их вместе.

Итак, как вы берете фильтр сервлетов Java и заставляете его работать как фильтр Джерси и как вы берете Java-сервлет и заставляете его работать как ресурс Джерси?

Моя нынешняя стратегия для сервлетов заключается в том, чтобы обернуть их так. Один для каждого.

@Path("/hystrix.stream") 
public class HystrixResource extends HystrixUtilizationSseServlet { 

    @Context 
    HttpServletRequest httpRequest; 

    @Context 
    HttpServletResponse httpResponse; 

    //This returns void because it is a text/stream output that must remain open, 
    //so the httpResponse is continually written to until the conenction is closed 
    @GET 
    public void doGet() throws ServletException, IOException { 
     doGet(httpRequest, httpResponse); 
    } 
} 

Возможно, это работает, но по какой-то причине данные по существу пусты. Я предполагаю, что причина в том, что фильтры не работают.

data: {"type":"HystrixUtilization","commands":{},"threadpools":{}} 

Менее ясно мне, как обернуть Servlet фильтры, потому что они ожидают, что различные входы и выходы, чем в Джерси ContainerRequestFilter. Следующая реализация в моем JerseyConfig, кажется, ничего не делает, потому что журналы не указывают, что фильтры регистрируются, и я не могу сломать строки в этих файлах в режиме отладки.

@Component 
@ApplicationPath("/") 
public class JerseyConfig extends ResourceConfig { 
    private static final Logger LOGGER = Logger.getLogger("JerseyConfig"); 
    public JerseyConfig(){ 
     //filter to provide a bridge between JAX-RS and Spring request attributes 
     register(RequestContextFilter.class); 
     register(SpringComponentProvider.class); 
     //handles custom serialization 
     register(new ObjectMapperContextResolver()); 
     //try to register the filters - which doesn't work because these aren't Jersey Filters 
     register(HystrixRequestContextServletFilter.class); 
     register(HystrixRequestLogViaResponseHeaderServletFilter.class); 
     registerResources(); 

     /* 
     * Enable the logging filter to see the HTTP response for each request. 
     */ 
     register(new LoggingFilter(LOGGER, true)); 
    } 
} 

ответ

0

Альтернативный маршрут и тот, с которым я в конечном итоге перешел, заключается в использовании стартовых облачных/загрузочных стартеров, если вы находитесь в проекте Spring Boot. Это помешало мне явно определить компоненты и фильтры, как показано в другом ответе. В конце концов, в основном работала из коробки.

<dependency> 
     <groupId>org.springframework.cloud</groupId> 
     <artifactId>spring-cloud-starter-hystrix</artifactId> 
     <exclusions> 
      <!--We're running our Jersey server w/ Jackson 2. This import uses Jackson 1.x and creates a breaking conflict.--> 
      <exclusion> 
       <groupId>javax.ws.rs</groupId> 
       <artifactId>jsr311-api</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.cloud</groupId> 
     <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-actuator</artifactId> 
    </dependency> 

Ссылка Circuit Breaker руководство по началу работы. Единственным вопросом, с которым я столкнулся, был конфликт Jackson 1 против Jackson 2 и был способен добавить исключение библиотеки. Раньше у меня в основном была библиотека библиотеки Hystrix, но ничего не было сделано, чтобы заставить ее работать.

1

Сервлеты и фильтры сервлета не должны быть зарегистрированы в конфигурации Джерси. Они просто будут проигнорированы. Вместо этого вы должны зарегистрировать их с помощью Spring Boot с ServletRegistrationBean и FilterRegistrationBean.

В вас конфигурации Spring, вы можете сделать что-то вроде

@Bean 
public ServletRegistrationBean someServlet() { 
    ServletRegistrationBean registration = ServletRegisrationBean(
      new HystrixMetricsStreamServlet(), "/hystrix.stream"); 
    registration.setName("HystrixMetricsStreamServlet"); 
    return registration; 
} 

@Bean 
public FilterRegistrationBean someFilter() { 
    FilterRegistrationBean registration = new FilterRegistrationBean(); 
    registration.setFilter(new HystrixRequestContextServletFilter()); 
    registration.setUrlPatterns(Arrays.asList("/*")); 
    registration.setName("HystrixRequestContextServletFilter"); 
    // you can also set the order of filters if you need to 
    return registration; 
} 

Также:

  • вам не нужно зарегистрировать SpringComponentProvider. Это автоматически регистрируется.
  • Если вы получаете 404 на попытке получить доступ к сервлету, зарегистрированному таким образом, это произойдет из-за того, что вы используете картографию Jersey /* по умолчанию, которая вызывает весь запрос. Вы можете изменить отображение или зарегистрировать Джерси в качестве фильтра для пересылки не найденных запросов. См. this post
+0

Hi @peeskillet. Спасибо за ваш ответ.Я не показываю страницы через весеннюю паутину, так будет ли применима ваша реакция? – th3morg

+0

Что обслуживающие страницы имеют отношение ко всему? Вы отметили Spring Boot, поэтому я даю вам решение Spring Boot. Я не вижу, где страницы обслуживания подходят для решения проблемы. –

+0

Спасибо @peeskillet. Я смог получить эту работу на основе вашего предложения. Потенциально важно отметить, что сервлет для hystrix.stream должен быть HystrixMetricsStreamServlet, а не HystrixUtilizationSseServlet. Я попытаюсь сделать это редактирование. Во-вторых, никакие данные не будут присутствовать до выполнения команды. Итак, если вы перезапустите приложение, ваши данные будут пустыми, пока запросы не пройдут через ваши HystrixCommands. Благодаря! – th3morg

 Смежные вопросы

  • Нет связанных вопросов^_^