2015-12-22 4 views
1
  1. @EnableZuulProxy не работает под сервлетом 2,5 контейнера. Есть ли какое-либо обходное решение, чтобы получить весенний облачный зууль, работающий под сервлетом 2,5 контейнера?Весеннее облако Zuul с servlet-api 2.5

  2. Также я не смог найти обработчик аннотации @EnableZuulProxy. Укажите класс, который поддерживает @EnableZuulProxy, чтобы я мог лучше понять, что делает эта аннотация.

ответ

2

Весеннее облако предназначено для работы на сервлете 3.0. При этом можно получить @EnableZuulProxy, работающий на сервлет 2.5. Я должен был выяснить, хак для этого, как я должен был получить эту работу в Tomcat 6.

Основная проблема связана с ZuulConfiguration.class, который имеет метод:

@Bean 
@ConditionalOnMissingBean(name = "zuulServlet")  
public ServletRegistrationBean zuulServlet() { ... } 

вопрос здесь заключается в том, что ServletRegistrationBean использует javax.servlet.Registration$Dynamic, который недоступен до сервлета 3.0. В результате получается NoClassDefFoundError.

Чтобы обойти это, используйте проект spring-boot-legacy, чтобы сначала зарегистрировать DispatcherServlet. Во-вторых, вам придется вручную создать сервлет zuul.

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 

    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>com.dm.gateway.microservicegateway.Application</param-value> 
    </context-param> 

    <listener> 
     <listener-class>org.springframework.boot.legacy.context.web.SpringBootContextLoaderListener</listener-class> 
    </listener> 

    <filter> 
     <filter-name>ContextLifecycleFilter</filter-name> 
     <filter-class>com.netflix.zuul.context.ContextLifecycleFilter</filter-class> 
    </filter> 


    <filter-mapping> 
     <filter-name>ContextLifecycleFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <servlet> 
     <servlet-name>appServlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextAttribute</param-name> 
      <param-value>org.springframework.web.context.WebApplicationContext.ROOT</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet> 
     <servlet-name>zuul</servlet-name> 
     <servlet-class>com.netflix.zuul.http.ZuulServlet</servlet-class> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>appServlet</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 

</web-app> 

Я нашел лучший способ, чтобы удалить автоматическую регистрацию сервлета, чтобы просто сделать точную копию ZuulConfig называется ZuulOverrideConfig и удалить метод zuulServlet(). Это связано с тем, что ZuulProxyConfiguration расширяет ZuulConfiguration и, казалось, создавал компонент, даже когда я пытался его переопределить. Я не на 100% слежу за механиками, поэтому может быть лучший способ.

Второе изменение, которое я сделал в ZuulOverrideConfig, должно было вызвать расширенную реализацию ZuulFilterInitializer, называемую «LegacyZuulFilterInitializer». Это связано с тем, что по какой-то причине сервлет Зуула был разбит на куски и мог быть вызван, но фильтры не были загружены. Это расширение является взломанным способом загрузки фильтров.

Дальше, я создал копию ZuulProxyConfiguration под названием ZuulLegacyProxyConfiguraiton и имел ее удлинение ZuulOverrideConfig.class.

Наконец, я аннотировал класс Application следующим образом.

@EnableCircuitBreaker 
@EnableDiscoveryClient 
@Import(ZuulLegacyProxyConfiguration.class) 
@SpringBootApplication 
public class Application {....} 

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

Это использование Spring Cloud 1.1.4.RELEASE

Gist of all the code.

2

@EnableZuulProxy от Spring Cloud, которое основано на Spring Boot, которое является Servlet 3.0 и выше. Если вам нужно использовать Servlet 2.5, вы можете напрямую использовать API Netflix.

@EnableZuulProxy мета-аннотируется @Import(ZuulProxyConfiguration.class), так что, я думаю, это то, что вы имеете в виду, когда говорите «propesses»? Если вы не знаете, что такое @Import, пойдите и прочитайте весну.

+0

Thx. Я мог бы запустить Spring-Boot с сервлетом 2.5, следуя инструкциям здесь. https://docs.spring.io/spring-boot/docs/current/reference/html/howto-traditional-deployment.html - так задается вопросом, существует ли аналогичное обходное решение для zuul? –

+0

Нет, нет. – spencergibb

+0

Есть способ заставить его работать, но он взломан. – aglassman