自定义条件策略

    • 本文介绍如何对 进行自定义扩展。
    • 条件谓语是选择器中连接数据和规则的桥梁,作用是筛选出符合条件的请求。
    • 目前已经存在包括 match, =, regex, contains, TimeBefore, TimeAfter, exclude 共七个条件谓语。
    • 用户可以参考 模块,新增自己的条件谓语,如果有好的公用插件,可以向官网提交 pr
    • 新建一个工程,引入如下依赖:
    • 新增类 CustomPredicateJudge,实现 org.apache.shenyu.plugin.base.condition.judge.PredicateJudge 接口,添加注解 org.apache.shenyu.spi.Join
    1. /**
    2. * custom predicate judge.
    3. */
    4. @Join
    5. @Override
    6. public Boolean judge(final ConditionData conditionData, final String realData) {
    7. // 自定义条件策略
    8. }
    • 在工程的META-INF/services目录创建 org.apache.shenyu.plugin.base.condition.judge.PredicateJudge 文件,并添加如下内容:
    1. custom=xxx.xxx.xxx.CustomPredicateJudge
    • 将工程打包,拷贝到网关 (bootstrap-bin) 的 libext-lib 目录。

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

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

    自定义条件策略 - 图2

    • 添加 和 SpELPredicateJudge 扩展。
    1. * SpEL predicate judge.
    2. */
    3. @Join
    4. public class SpELPredicateJudge implements PredicateJudge {
    5. private static final ExpressionParser EXPRESSION_PARSER = new SpelExpressionParser();
    6. @Override
    7. public Boolean judge(final ConditionData conditionData, final String realData) {
    8. Expression expression = EXPRESSION_PARSER.parseExpression(conditionData.getParamValue().replace('#' + conditionData.getParamName(), realData));
    9. return expression.getValue(Boolean.class);
    10. }
    11. }