【问题标题】:Simple Reverse Proxy with Spring Boot and Netflix Zuul使用 Spring Boot 和 Netflix Zuul 的简单反向代理
【发布时间】:2017-02-28 13:17:22
【问题描述】:

我希望用 Spring Boot 实现一个简单的反向代理:

  • 轻松添加路线
  • 能够为每个路由添加自定义身份验证
  • 根据需要添加额外的标题

我查看了@EnableZuulProxy 注释提供的设施,但它似乎太重了,因为我不想使用 Eureka、Ribbon 或 Hystrix。但是,@EnableZuulServer 对配置有点轻描淡写。

谁能提供一个我所追求的例子? Netflix Zuul 是正确的选择吗,还是我应该看看另一个库?

谢谢!

【问题讨论】:

    标签: spring-boot spring-cloud netflix netflix-zuul


    【解决方案1】:

    简单的反向代理服务器

    使用没有 Ribbon、Eureka 或 Hystrix 的 Spring Boot 可以轻松设置简单的代理反向。

    只需使用 @EnableZuulProxy 注释您的主应用程序类并在您的配置中设置以下属性:

    ribbon.eureka.enabled=false
    

    然后在您的配置中定义您的路线,如下所示:

    zuul.routes.<route_name>.path=<route_path>    
    zuul.routes.<route_name>.url=http://<url_to_host>/
    

    其中&lt;route_name&gt; 是您的路由的任意名称,&lt;route_path&gt; 是使用 Ant 样式路径匹配的路径。

    所以一个具体的例子是这样的

    zuul.routes.userservice.path=users/**
    zuul.routes.userservice.url=http://localhost:9999/
    

    自定义过滤器

    您还可以通过扩展和实现ZuulFilter 类并将其作为@Bean 添加到您的@Configuration 类来实现您的自定义身份验证和任何其他标头。

    再举一个具体的例子:

    public class MyFilter extends ZuulFilter {
    
      @Override
      public String filterType() {
        // can be pre, route, post, and error
        return "pre";
      }
    
      @Override
      public int filterOrder() {
        return 0;
      }
    
      @Override
      public boolean shouldFilter() {
        return true;
      }
    
      @Override
      public Object run() {
        // RequestContext is shared by all ZuulFilters
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
    
        // add custom headers
        ctx.addZuulRequestHeader("x-custom-header", "foobar");    
    
        // additional custom logic goes here
    
        // return isn't used in current impl, null is fine
        return null;
      }
    
    }
    

    然后

    @Configuration
    public class GatewayApplication {
    
      @Bean
      public MyFilter myFilter() {
        return new myFilter();
      }
    
    }
    

    【讨论】:

      【解决方案2】:

      Zuul 是一个不错的选择。我不确定其他替代方案,但我们已经开始构建 Zuul 过滤器(前/后和路由),可以拦截请求并根据您的需要进行所有前/后处理和路由。与 Zuul 一起使用 Eureka、Ribbon 和 Hysterix 并不是强制性的。

      【讨论】:

      • 您能否提供任何将请求路由到不同来源的示例?
      • 我们正在尝试通过引用可以在 application.yml cloud.spring.io/spring-cloud-netflix/spring-cloud-netflix.html 中定义的 URL 模式来实现这一点
      • @yahthirigan 您是否正在编写自定义“预”过滤器来解析 YAML 文件?如果是这样,您是否将其传递给 spring-cloud-netflix 项目已经定义的“路由”过滤器?
      • 我们的预过滤器不会解析 YAML,但会对传入的请求执行某些操作。就像您需要添加自定义标头一样。然后,我们将其留给已经存在的路由过滤器,以将其路由到 zuul 路由中配置的实际端点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-30
      • 2019-05-23
      • 1970-01-01
      • 2019-01-27
      • 2019-10-29
      相关资源
      最近更新 更多