Spring Cloud Zuul和Groovy过滤器

时间:2018-03-15 00:10:40

标签: java groovy netflix-zuul spring-cloud-netflix

我有一个基于Spring Cloud Netflix软件包运行的Zuul网关。我还创建了一个Zuul" groovy"基于过滤器,如blog here所示。当我添加groovy文件时,由于IDE /编译器抱怨类路径上没有groovy库,我还必须将下面的jar添加到我的pom.xml中以允许将groovy文件编译到项目中 -

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

从这一点开始,我的groovy过滤器按预期加载,并针对Zuul的每个传入请求进行评估。到目前为止一切都很顺利,除非我尝试修改groovy文件时,除非我重新启动服务器,否则我不会看到对文件的更改是动态的。

我是Groovy的新手。我应该怎么做才能在Netflix Zuul及其过滤器的上下文中利用Groovy过滤器的动态特性。来自Netflix的痛苦Zuul库扫描特定目录中的Groovy过滤器。对于Netflix Zuul的Spring云包装有什么类似的东西吗?

请注意,我已经读过Spring 4支持groovy等动态语言,但使用它需要使用lang:groovy等配置XML文件。

但是,就我而言 - 使用Spring Cloud Netflix库,没有针对groovy类的XML配置文件,我能够让Spring Cloud / Zuul库获得我的groovy类。我无法动态刷新它,并想知道是否有办法做到这一点。

我确实阅读了spring-cloud文档,除了单个语句之外,我没有看到任何关于加载groovy过滤器的信息 - Zuul’s rule engine allows rules and filters to be written in essentially any JVM language, with built in support for Java and Groovy.

请建议。

1 个答案:

答案 0 :(得分:1)

所以,我通过查看github netflix zuul wiki来了解它。

对于其他任何有这个问题但正在寻找简单答案的人,请你去,我节省一些时间:)

步骤1 - 将groovy-all jar添加到classpath

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

步骤2 - 使用文件夹结构

在src / main / resources路径中放置文件
    groovy
    └── pre
    └── route
    └── post

步骤3 - 在我的application.yml -

中配置了Groovy过滤器路径
zuul:
  groovyFiltersPath:
    - groovy/pre
    - groovy/route
    - groovy/post

步骤4 - 在Zuul Spring Boot App中注入yaml配置

@Component
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "zuul")
public class CustomPathZuulFilterConfig {

    private List<String> groovyFiltersPath;

    public List<String> getGroovyFiltersPath() {
        return groovyFiltersPath;
    }

    public void setGroovyFiltersPath(List<String> groovyFiltersPath) {
        this.groovyFiltersPath = groovyFiltersPath;
    }
}

步骤5 - 最后,初始化Groovy过滤器加载器和文件管理器

@Component
public class GroovyFiltersInitializer {

    private Logger logger = LoggerFactory.getLogger(GroovyFiltersInitializer.class);

    @Autowired
    private CustomPathZuulFilterConfig config;

    @PostConstruct
    private void initGroovyFilters() throws Exception {

        List<String> groovyFiltersPath = config.getGroovyFiltersPath();

        if(groovyFiltersPath == null || groovyFiltersPath.size() == 0) {
            return;
        }

        FilterLoader.getInstance().setCompiler(new GroovyCompiler());
        FilterFileManager.setFilenameFilter(new GroovyFileFilter());

        String[] filterDirectoryList = groovyFiltersPath.toArray(new String[0]);
        FilterFileManager.init(5, filterDirectoryList);

        logger.info("Groovy Filter file manager started");
    }
}

现在,应该动态地选择对groovy过滤器的任何更改。

IntelliJ用户特有的 - 要检查是否拾取了对groovy文件的更改,您需要更改调试器“out”目录下的文件,而不是src / main / resources / groovy目录下的文件。这是因为,应用程序运行基于“out”目录的代码。但是,要调试更改 - 您必须在“out”和src / main / resources / groovy目录中进行更改,因为IntelliJ在应用程序运行时不会将文件复制到“out”。希望这是有帮助的。

祝你好运!