Zuul 过滤器

2018-10-04  本文已影响0人  _fan凡

过滤器是Zuul功能的核心部分。它们负责应用的业务逻辑以及执行多种任务。

Incoming

Incoming Filters在请求被代理到原始处理类之前执行。通常大多数业务逻辑在这里执行。例如授权、动态路由、限流、DDos保护,度量。

Endpoint

Endpoint Filters负责处理incoming filters执行之后的请求。Zuul自带了内置构建的过滤器(ProxyEndpoint)来代理请求到后端服务器,所以这类过滤器典型的使用场景就是静态endpoints。例如健康检测响应,静态错误响应,404响应。

Outgoing

Outgoing Filters是接收到后端服务器的响应后进行处理。典型地,该类过滤器更多的用来塑造响应,增加度量。例如保存统计,增加/移除标准头(headers),发送时间到实时流,压缩响应。

Async

过滤器可以通过同步或者异步的方式执行。如果定义的过滤器不会做大量的工作并且没有阻塞或者关闭,则可以通过继承HttpInboundSyncFilter或者HttpOutboundSyncFilter来安全的使用同步顾虑器。
然而,在某些场景下,如果需要从其他服务或者缓存中获取数据或者做大量的计算工作。这种情况下,就不应该阻塞Netty线程,所以应该使用异步的过滤器返回可监视的响应包装。这类的过滤器应该继承HttpInboundFilter或者HttpOutboundFilter。
如:同步过滤器

class Routes extends HttpInboundSyncFilter {

    @Override
    int filterOrder() {
        return 0
    }

    @Override
    boolean shouldFilter(HttpRequestMessage httpRequestMessage) {
        return true
    }

    @Override
    HttpRequestMessage apply(HttpRequestMessage request) {
        SessionContext context = request.getContext()
        String path = request.getPath()
        String host = request.getOriginalHost()

        // Route healthchecks to the healthcheck endpoint.;
        if (path.equalsIgnoreCase("/healthcheck")) {
            context.setEndpoint(Healthcheck.class.getCanonicalName())
        }
        else {
            context.setEndpoint(ZuulEndPointRunner.PROXY_ENDPOINT_FILTER_NAME);
            context.setRouteVIP("api")
        }

        return request
    }
}

异步过滤器:

class SampleServiceFilter extends HttpInboundFilter {
    private static final Logger log = LoggerFactory.getLogger(SampleServiceFilter.class)

    private final SampleService sampleService

    @Inject
    SampleServiceFilter(SampleService sampleService) {
        this.sampleService = sampleService
    }

    @Override
    int filterOrder() {
        return 500
    }


    @Override
    boolean shouldFilter(HttpRequestMessage msg) {
        return sampleService.isHealthy()
    }

    @Override
    Observable<HttpRequestMessage> applyAsync(HttpRequestMessage request) {
        return sampleService.makeSlowRequest().map({ response ->
            log.info("Fetched sample service result: {}", response)

            return request
        })
    }

获取请求体内容

默认情况下Zuul是不缓存请求体内容(body content)的,也就是Zuul接受请求体之前就会将接收到的头信息(headers)流向原始处理类。这里说的流向的行为是非常高效的和有必要的,只要你的过滤器逻辑依赖于头数据(header data)。但是,如果你希望在inbound过滤器中拿到请求体或者在outbound过滤器中拿到响应体内容,则需要明确的告诉Zuul来缓冲内容体(body)。可以在过滤器中通过覆盖needsBodyBuffered()方法来实现:

    @Override
    boolean needsBodyBuffered(HttpResponseMessage input) {
        return true
    }

有用的过滤器

Zuul自带了一些有用的过滤器。

示例过滤器

核心过滤器

上一篇 下一篇

猜你喜欢

热点阅读