Spring Cloud Netflix:使用 Zuul Servlet 在 Zuul 配置中发生了什么?

Spring Cloud Netflix: Whats happening in ZuulConfiguration with the ZuulServlet?

查看 ZuulConfiguration,我看到以下内容:

@Bean
public ZuulController zuulController() {
    return new ZuulController();
}

@Bean
public ServletRegistrationBean zuulServlet() {
    return new ServletRegistrationBean(new ZuulServlet(),
            this.zuulProperties.getServletPattern());
}   

ZuulController 包装 ZuulServlet 并管理其生命周期,就好像它是一个 Spring 控制器一样。令我震惊的是 ZuulConfiguration class 无论如何都会使用 ServletRegistrationBean 注册 servlet。也许我想错了,但我认为你会做一个或另一个。有人可以解释为什么两者都是必要的吗?

使用此配置,ZuulServlet 运行 是真正的 servlet(由嵌入式 servlet 容器所知)、控制器(委托给 servlet)还是两者?

谢谢,

约书亚

来自this commit

允许在 Zuul 代理中流式传输多部分请求

事实证明,Zuul 的多部分请求很糟糕 几乎完全来自 Spring 中的多部分处理 DispatcherServlet。此更改使代理路由可用 在替代路径 /zuul/ (其中 /zuul 是 zuul.servletPath 的默认值)。我有 使用 main 方法测试那些上传了 800MB 文件的文件 FormZuulServletProxyApplicationTests 和主要的 观察是没有 OutOfMemory 错误(没有人尝试 下载完整的请求正文)。它适用于功能区 并使用简单的 (HttpClient) 过滤器。带丝带的你 如果你想上传文件将需要设置一些超时 这么大,例如在测试中查看 application.yml:

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 60000
ribbon:
  ConnectTimeout: 3000
  ReadTimeout: 60000

您需要在 "Transfer-Encoding: chunked" 传入请求。 Chrome 默认不这样做 显然,但我能够用 curl 进行测试,例如

$ curl -v -H "Transfer-Encoding: chunked" \
  -F "file=@mylarg.iso" \
  localhost:9999/zuul/direct/file

通过 DispatcherServlet 的旧代理路径仍然存在 可用(为了向后兼容和方便 在上下文路径的根目录中提供可用路径)。