带有 Spring Boot 和 Netflix Zuul 的简单反向代理

Simple Reverse Proxy with Spring Boot and Netflix Zuul

我正在寻求使用 Spring 引导实现一个简单的反向代理,即:

我看过 @EnableZuulProxy 注释提供的功能,但它似乎太重量级了,因为我不想使用 Eureka、Ribbon 或 Hystrix。但是,@EnableZuulServer 在配置上有点简单。

任何人都可以提供我所追求的示例吗? Netflix Zuul 是正确的选择还是我应该查看另一个库?

谢谢!

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

简单反向代理服务器

使用 Spring 不使用 Ribbon、Eureka 或 Hystrix 的启动设置简单的反向代理很容易。

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

ribbon.eureka.enabled=false

然后像这样在配置中定义路由:

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

其中 <route_name> 是路由的任意名称,<route_path> 是使用 Ant 样式路径匹配的路径。

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

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

自定义过滤器

您还可以通过扩展和实施 ZuulFilter class 并将其作为 @Bean 添加到您的 @Configuration class.

再举一个具体的例子:

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();
  }

}