0606-Zuul构建API Gateway-Zuul过滤器以及禁用Zuul过滤器

一、概述

  针对Spring Cloud的Zuul配备了许多在代理和服务器模式下默认启用的ZuulFilter bean。

  有关启用的可能过滤器,请参阅zuul过滤器包。 

二、Zuul过滤器使用

2.1、传统过滤器:java.servlet.Filter

package javax.servlet;

import java.io.IOException;

public interface Filter {

    public void init(FilterConfig filterConfig) throws ServletException;

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;

    public void destroy();
}

2.2、ZuulFilter过滤器类型与生命周期

  Zuul大部分功能是同过过滤器实现。有四种:

  1》PRE,在请求被路由之前调用,可利用这种过滤器实现身份认证、在集群中选择请求的微服务、记录调试信息等

  2》ROUTING,这种过滤器将请求路由到微服务。用于构建发送给微服务的请求,并使用apache httpclient或Netfilx Ribbon请求微服务

  3》POST,在路由到微服务以后执行,可用来为响应添加标准的HTTP HEADER、收集统计信息和指标,将响应从微服务发送个客户段等

  4》ERROR,在其他阶段发生错误是、时执行该过滤器

  参看地址:http://techblog.netfilx.com/2013/06/announcing-zuul-edge-service-in-cloud.html

    https://github.com/Netflix/zuul/wiki/how-it-works

生命周期图

  

 2.3、代码开发

PreZuulFilter

package com.lhx.cloud;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;

public class PreZuulFilter extends ZuulFilter {
    private static final Logger log = LoggerFactory.getLogger(PreZuulFilter.class);

    @Override
    public Object run() {
        // 具体执行
        HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
        String host = request.getRemoteHost();
        PreZuulFilter.log.warn("请求主机:" + host);
        return null;
    }

    @Override
    public boolean shouldFilter() {
        // 是否执行次过滤器
        return true;
    }

    @Override
    public int filterOrder() {
        // 执行顺序 ,数值越大 越后执行
        return 1;
    }

    @Override
    public String filterType() {
        // 执行类型
        return "pre";
    }
}

注意要将被类扫描进去

    @Bean
    public PreZuulFilter pre() {
        return new PreZuulFilter();
    }

2.4、参看代码

包:spring-cloud-netflix-core-1.4.4.RELEASE.jar下的zuul的filter

2.5、禁用Zuul的Filter

  禁用过滤器:zuul.<SimpleClassName>.<filterType>.disable=true

  按照惯例,过滤器后面的包是Zuul过滤器类型。示例禁用 org.springframework.cloud.netflix.zuul.filters.post.SendResponseFilter 设置zuul.SendResponseFilter.post.disable=true.

猜你喜欢

转载自www.cnblogs.com/bjlhx/p/9069621.html