Skip to main content
Version: 2.4.2

自定义条件策略

说明#

  • 本文介绍如何对 org.apache.shenyu.plugin.base.condition.judge.PredicateJudge 进行自定义扩展。
  • 条件谓语是选择器中连接数据和规则的桥梁,作用是筛选出符合条件的请求。
  • 目前已经存在包括 match, =, regex, contains, TimeBefore, TimeAfter, exclude 共七个条件谓语。
  • 用户可以参考 judge 模块,新增自己的条件谓语,如果有好的公用插件,可以向官网提交 pr

扩展#

  • 新建一个工程,引入如下依赖:
<dependencies>    <dependency>        <groupId>org.apache.shenyu</groupId>        <artifactId>shenyu-plugin-base</artifactId>        <version>${project.version}</version>    </dependency></dependencies>
  • 新增类 CustomPredicateJudge,实现 org.apache.shenyu.plugin.base.condition.judge.PredicateJudge 接口,添加注解 org.apache.shenyu.spi.Join
/** * custom predicate judge. */@Joinpublic class CustomPredicateJudge implements PredicateJudge {
    @Override    public Boolean judge(final ConditionData conditionData, final String realData) {        // 自定义条件策略    }}
  • 在工程的META-INF/services目录创建 org.apache.shenyu.plugin.base.condition.judge.PredicateJudge 文件,并添加如下内容:
script
${spi name}=${custom class path}

${spi name} 表示 spi 的名称, ${custom class path} 表示该类的全限定名。比如:

script
custom=xxx.xxx.xxx.CustomPredicateJudge
  • 将工程打包,拷贝到网关 (bootstrap-bin) 的 libext-lib 目录。

  • Apache ShenYu 网关管理系统 --> 基础配置 --> 字典管理, 找到字典编码为 OPERATOR,新增一条数据,注意字典名称要为: ${spi name},图中的示例是 custom

字典类型:operator

字典编码:OPERATOR

字典名称:${spi name},填写自定义spi的名称;

字典值:使用时,下拉框的值,不要和现有的重复;

字典描述或备注信息:描述信息;

排序: 排序;

状态:打开或关闭。

  • 在添加选择器或规则时,就可以使用自定义的条件策略:

示例#

  • 添加 GroovyPredicateJudgeSpELPredicateJudge 扩展。
/** * Groovy predicate judge. */@Joinpublic class GroovyPredicateJudge implements PredicateJudge {        @Override    public Boolean judge(final ConditionData conditionData, final String realData) {        return (Boolean) Eval.me(conditionData.getParamName(), realData, conditionData.getParamValue());    }}
/** * SpEL predicate judge. */@Joinpublic class SpELPredicateJudge implements PredicateJudge {        private static final ExpressionParser EXPRESSION_PARSER = new SpelExpressionParser();        @Override    public Boolean judge(final ConditionData conditionData, final String realData) {        Expression expression = EXPRESSION_PARSER.parseExpression(conditionData.getParamValue().replace('#' + conditionData.getParamName(), realData));        return expression.getValue(Boolean.class);    }}
  • 更新 org.apache.shenyu.plugin.base.condition.judge.PredicateJudge, 添加:
script
Groovy=xxx.xxx.xxx.GroovyPredicateJudgeSpEL=xxx.xxx.xxx.SpELPredicateJudge