【SpringCloud NetFlix】网关Zuul(四)功能进阶

这里写图片描述

数字越小,优先级越高

自定义过滤器
  • shouldFilter方法
  • 优先级

自定义ZuulFilter:

public class MyFilter extends ZuulFilter {

    //判断要不要继续执行;ture为总是要执行
    public boolean shouldFilter() {
        return true;
    }

    public Object run() {
        System.out.println("执行 MyFilter 过滤器");
        return null;
    }

    @Override
    public String filterType() {
        return FilterConstants.ROUTE_TYPE;
    }

    //设置该过滤器的优先级为最优先执行
    @Override
    public int filterOrder() {
        return 1;
    }

}

注入到Spring容器

@Configuration
public class FilterConfig {
    @Bean
    public MyFilter myFilter() {
        return new MyFilter();
    }
}
过滤器动态加载

引入依赖

<dependency>
    <groupId>org.codehaus.groovy</groupId>
    <artifactId>groovy-all</artifactId>
    <version>2.4.12</version>
</dependency>

主启动类加入动态扫描配置

    @PostConstruct
    public void zuulInit() {
        FilterLoader.getInstance().setCompiler(new GroovyCompiler());
        // 读取配置,获取脚本根目录
        String scriptRoot = System.getProperty("zuul.filter.root", "groovy/filters");
        // 获取刷新间隔
        String refreshInterval = System.getProperty("zuul.filter.refreshInterval", "5");
        if (scriptRoot.length() > 0) scriptRoot = scriptRoot + File.separator;
        try {
            FilterFileManager.setFilenameFilter(new GroovyFileFilter());
            //扫描该根目录(scriptRoot)下的pre、route、post的过滤器
            FilterFileManager.init(Integer.parseInt(refreshInterval), scriptRoot + "pre", 
                    scriptRoot + "route", scriptRoot + "post");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

新建和主启动类中配一致的动态加载过滤器的目录,如下:

这里写图片描述
项目全部启动后,动态的忘post\pre\route里面装入基于ZuulFilter的过滤器类,会实现动态加载。

@EnableZuulServer和@EnableZuulProxy区别

经过的过滤器不一样

这里写图片描述

这里写图片描述

@EnableZuulServer不具有调用集群能力和简单路由功能

动态路由在配置中心统一管理
  • 配置文件同步

  • 配置动态加载
    以上为疯狂SpringCloud微服务架构实战学习笔记
    感谢杨恩雄老师:https://my.oschina.net/JavaLaw

猜你喜欢

转载自blog.csdn.net/zlt995768025/article/details/81708382