我有一个基于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.
请建议。
答案 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”。希望这是有帮助的。
祝你好运!