gpt4 book ai didi

java - 带有 servlet-api 2.5 的 Spring Cloud Zuul

转载 作者:行者123 更新时间:2023-11-29 03:01:48 26 4
gpt4 key购买 nike

  1. @EnableZuulProxy 在 servlet 2.5 容器下不起作用。是否有任何解决方法可以让 spring-cloud zuul 在 servet 2.5 容器下工作?

  2. 我也找不到@EnableZuulProxy 的注解处理器。请提供propesses @EnableZuulProxy 的类,以便我更好地理解此注释的真正作用。

最佳答案

Spring Cloud 旨在运行在 servlet 3.0 上。也就是说,有可能让@EnableZuulProxy 在 servlet 2.5 上运行。我必须为此想出一个 hack,因为我必须让它在 Tomcat 6 中工作。

主要问题是由于 ZuulConfiguration.class,它有以下方法:

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

这里的问题是 ServletRegistrationBean 使用 javax.servlet.Registration$Dynamic,直到 Servlet 3.0 才可用。这会导致 NoClassDefFoundError

要解决此问题,请使用 spring-boot-legacy项目首先要注册一个DispatcherServlet。其次,您必须手动创建一个 zuul servlet。

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>

我找到了删除自动 servlet 注册的最佳方法,就是逐字复制名为 ZuulOverrideConfigZuulConfig,然后删除 zuulServlet() 方法。这是因为 ZuulProxyConfiguration 扩展了 ZuulConfiguration,即使我试图覆盖它,它似乎也创建了 bean。我不是 100% 了解这背后的机制,所以可能有更好的方法。

我在 ZuulOverrideConfig 中做的第二个更改是调用 ZuulFilterInitializer 的扩展实现,称为“LegacyZuulFilterInitializer”。这是因为出于某种原因,Zuul servlet 被装箱,并且能够被调用,但没有引导过滤器。这个扩展是让过滤器引导的一种 hacky 方式。

接下来,我创建了一个名为 ZuulLegacyProxyConfiguraitonZuulProxyConfiguration 副本,并让它扩展了 ZuulOverrideConfig.class

最后,我对Application类进行了如下注解。

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

在所有这些 hack 之后,实现最终按预期工作。我不建议长时间使用它,因为它很老套。迁移到新版本时,您不会自动获得配置类更新,而且我不能保证不会随机破坏某些东西!

这是使用 Spring Cloud 1.1.4.RELEASE

Gist of all the code.

关于java - 带有 servlet-api 2.5 的 Spring Cloud Zuul,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34418958/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com