💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
## 一、自定义Predicate Factory 虽然官方为我们提供了诸多的Predicate Factory(上一节介绍的),能够满足我们大部分的场景需求。但是不排除有些情况下,Predicate路由匹配条件比较复杂,这时就需要我们来自定义实现。 #### **需求**: 本节我们通过自定义实现一个简单的需求,所有Path以"/sysuser"、"/sysorg"、"/sysrole"、"/sysmenu"、"/sysdict"、"/sysapi"开头的Http请求都转发到本机的`http://localhost:8401/`提供的aservice-rbac服务。 #### 实现步骤 * 自定义路由predicate工厂需要继承 AbstractRoutePredicateFactory 类,重写 apply 方法的逻辑。 * 在 apply 方法中可以通过 exchange.getRequest() 拿到 ServerHttpRequest 对象,从而可以获取到请求的参数、请求方式、请求头等信息。 ~~~ @Component public class RbacAuthRoutePredicateFactory extends AbstractRoutePredicateFactory<RbacAuthRoutePredicateFactory.Config> { public RbacAuthRoutePredicateFactory() { super(Config.class); } @Override public Predicate<ServerWebExchange> apply(Config config) { return exchange -> { String requestURI = exchange.getRequest().getURI().getPath(); if (config.getFlag().equals("rbac") &&(requestURI.startsWith("/sysuser") ||requestURI.startsWith("/sysorg") ||requestURI.startsWith("/sysrole") ||requestURI.startsWith("/sysmenu") ||requestURI.startsWith("/sysdict") ||requestURI.startsWith("/sysapi"))) { return true; //表示匹配成功 } return false; //表示匹配失败 }; } //自定义参数args配置类 public static class Config { private String flag; //该参数对应配置文件的args public String getFlag() { return flag; } public void setFlag(String flag) { this.flag = flag; } } } ~~~ * 类的命名需要以 RoutePredicateFactory 结尾,比如 RbacAuthRoutePredicateFactory,那么在配置文件中使用该predicate的时候 RbacAuth就是这个路由predicate工厂的名称。 * 我们还可以为apply 方法传参数,如代码中的Config,flag字段和配置文件中的args字段名称是一一对应的。 ~~~ spring: application: name: zimug-server-gateway cloud: gateway: routes: - id: rbsc-service uri: http://localhost:8401/ predicates: - name: RbacAuth args: flag: rbac ~~~ ## 二、测试一下 前提:启动本机aservice-rbac服务及与其相关的其他公共Spring Cloud组件 访问`http://127.0.0.1:8777/sysuser/pwd/reset`,请求正确的被gateway接收,并按照我们自定义的路由规则转发给本机的aservice-rbac服务。 ![](https://img.kancloud.cn/e0/a6/e0a6c1c07d8a0df44d8a5e53cd05e7ee_1285x515.png)