gateway网关路由的组成如下:
predicates 断言有两个重要参数第一个是name默认支持以下八种类型。
第二个pattern匹配的正则
下面我们来拓展实现通过请求参数中的接口编码来决定路由的自定义断言。
首先第一步拓展新建一个路由断言工厂
package com.jieshun.open.config;
import com.jieshun.open.param.ApiParam;
import com.jieshun.open.util.ServerWebExchangeUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import java.util.Collections;
import java.util.List;
import java.util.function.Predicate;
/**
* @Description
* 自定义参数断言
* @Date 2021-8-23 15:40
* @Created by yyk
*/
@Slf4j
@Component
public class ApiMethodRoutePredicateFactory extends AbstractRoutePredicateFactory<ApiMethodRoutePredicateFactory.Config> {
private static final String DATETIME_KEY = "method";
public ApiMethodRoutePredicateFactory() {
super(Config.class);
}
@Override
public List<String> shortcutFieldOrder() {
return Collections.singletonList(DATETIME_KEY);
}
@Override
public Predicate<ServerWebExchange> apply(Config config) {
log.debug("ParamRoutePredicateFactory Start...");
return exchange -> {
ApiParam apiParam = ServerWebExchangeUtil.getApiParam(exchange);
String apiMethod = config.getApiMethod();
if(apiParam.getRouteId().equals(apiMethod)){
return true;
}
return false;
};
}
public static class Config {
/**
* 传输token header key
*/
private String apiMethod;
public String getApiMethod() {
return apiMethod;
}
public void setApiMethod(String apiMethod) {
this.apiMethod = apiMethod;
}
}
}
注意:类名字前缀“ApiMethod“,必须和路由设置中的断言name一致。
”
第二步:在cofing中注入bean
/**
* 用于readBody断言 body参数断言
* @return
*/
@Bean
public ApiMethodRoutePredicateFactory paramRoutePredicateFactory(){
return new ApiMethodRoutePredicateFactory();
}