@EnableZuulProxy не работает под сервлетом 2,5 контейнера. Есть ли какое-либо обходное решение, чтобы получить весенний облачный зууль, работающий под сервлетом 2,5 контейнера?Весеннее облако Zuul с servlet-api 2.5
Также я не смог найти обработчик аннотации @EnableZuulProxy. Укажите класс, который поддерживает @EnableZuulProxy, чтобы я мог лучше понять, что делает эта аннотация.
ответ
Весеннее облако предназначено для работы на сервлете 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
@EnableZuulProxy
от Spring Cloud, которое основано на Spring Boot, которое является Servlet 3.0 и выше. Если вам нужно использовать Servlet 2.5, вы можете напрямую использовать API Netflix.
@EnableZuulProxy
мета-аннотируется @Import(ZuulProxyConfiguration.class)
, так что, я думаю, это то, что вы имеете в виду, когда говорите «propesses»? Если вы не знаете, что такое @Import
, пойдите и прочитайте весну.
Thx. Я мог бы запустить Spring-Boot с сервлетом 2.5, следуя инструкциям здесь. https://docs.spring.io/spring-boot/docs/current/reference/html/howto-traditional-deployment.html - так задается вопросом, существует ли аналогичное обходное решение для zuul? –
Нет, нет. – spencergibb
Есть способ заставить его работать, но он взломан. – aglassman