拿Cookie
断言来说,首先看它的体系结构
public class CookieRoutePredicateFactory extends AbstractRoutePredicateFactory<CookieRoutePredicateFactory.Config> { /** * Name key. */ public static final String NAME_KEY = "name"; /** * Regexp key. */ public static final String REGEXP_KEY = "regexp"; public CookieRoutePredicateFactory() { super(Config.class); } /* 通过shortcutFieldOrder方法设置Config配置类中的属性,需要根据具体的规则来设置 通过shortcutType方法获取具体规则,具体参看:org.springframework.cloud.gateway.support.ShortcutConfigurable.ShortcutType 规则包括以下几种: DEFAULT : 按照shortcutFieldOrder顺序依次赋值 */ @Override public List<String> shortcutFieldOrder() { return Arrays.asList(NAME_KEY, REGEXP_KEY); } @Override public Predicate<ServerWebExchange> apply(Config config) { return new GatewayPredicate() { @Override public boolean test(ServerWebExchange exchange) { List<HttpCookie> cookies = exchange.getRequest().getCookies() .get(config.name); if (cookies == null) { return false; } for (HttpCookie cookie : cookies) { if (cookie.getValue().matches(config.regexp)) { return true; } } return false; } @Override public String toString() { return String.format("Cookie: name=%s regexp=%s", config.name, config.regexp); } }; } /* 内部配置类是用来接收在配置文件中配置的参数的 routes: #唯一标识符 - id: hailtaxi-driver uri: lb://hailtaxi-driver #路由断言 predicates: - Cookie=username,itheima */ @Validated public static class Config { @NotEmpty private String name; @NotEmpty private String regexp; public String getName() { return name; } public Config setName(String name) { this.name = name; return this; } public String getRegexp() { return regexp; } public Config setRegexp(String regexp) { this.regexp = regexp; return this; } } }
尽管Spring Cloud Gateway已经包含了很多路由匹配规则,有时候我们需要开发自定义路由匹配规则来满足需求,下面简单的介绍一下如何自定义路由匹配规则。
案例
需求:转发带token的请求到hailtaxi-drvier
服务中,这里定义请求带token是指包含某个请求头的请求,至于是什么请求头可以由配置指定
1、修改配置文件
gateway: #路由配置 routes: #唯一标识符 - id: hailtaxi-driver uri: lb://hailtaxi-driver #路由断言 predicates: # 自定义一个Token断言,如果请求包含Authorization的token信息则通过 - Token=Authorization
2、创建 RoutePredicateFactory
断言工厂默认命名规则必须按照"名称"+RoutePredicateFactory,如上TokenRoutePredicateFactory的断言名称为Token
@Slf4j @Component // 要交给spring容器管理 public class TokenRoutePredicateFactory extends AbstractRoutePredicateFactory<TokenRoutePredicateFactory.Config> { public TokenRoutePredicateFactory() { super(Config.class); } public Predicate<ServerWebExchange> apply(Config config) { return exchange -> { // 打印配置文件参数值 String headerName = config.getHeaderName(); HttpHeaders headers = exchange.getRequest().getHeaders(); List<String> header = headers.get(headerName); log.info("Token Predicate headers:{}", header); // 断言返回的是boolean值 return header!=null && header.size()>0; }; } @Override public List<String> shortcutFieldOrder() { return Arrays.asList("headerName");//指定配置文件中加载到的配置信息应填充到Config的哪个属性上 } @Override public ShortcutType shortcutType() { return ShortcutType.DEFAULT; } @Data public static class Config { //static class private String headerName;//存储从配置文件中加载的配置 } }