本文共 3065 字,大约阅读时间需要 10 分钟。
如果配置 StripPrefix=1,则去掉第1层路径
例子: /first/order/info 则变为 /order/info
spring: application: name: geteway cloud: gateway: routes: # lb 前缀匹配 /secnod/102/echo /myprefix/102/echo - id: 102_lb_forward uri: lb://order-service # 目标服务地址 predicates: - Path=/secnod/102/* filters: - StripPrefix=1 # 转发之前去掉1层路径 取消 /second - PrefixPath=/myprefix # 路径前面会加myprefix 加上/myprefix
public GatewayFilter apply(Config config) { return new GatewayFilter() { @Override public Monofilter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); addOriginalRequestUrl(exchange, request.getURI()); String path = request.getURI().getRawPath(); // 去掉最前面1(parts)层路径 String newPath = "/" + Arrays.stream(StringUtils.tokenizeToStringArray(path, "/")) .skip(config.parts).collect(Collectors.joining("/")); newPath += (newPath.length() > 1 && path.endsWith("/") ? "/" : ""); ServerHttpRequest newRequest = request.mutate().path(newPath).build(); exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, newRequest.getURI()); return chain.filter(exchange.mutate().request(newRequest).build()); } @Override public String toString() { return filterToStringCreator(StripPrefixGatewayFilterFactory.this) .append("parts", config.getParts()).toString(); } }; }
/102/echo 会变成 /myprefix/102/echo
把prefix放到路径最前面
属性:PrefixPath
spring: application: name: geteway cloud: gateway: routes: # lb 前缀匹配 /secnod/102/echo /myprefix/102/echo - id: 102_lb_forward uri: lb://order-service # 目标服务地址 predicates: - Path=/secnod/102/* filters: - StripPrefix=1 # 转发之前去掉1层路径 取消 /second - PrefixPath=/myprefix # 路径前面会加myprefix 加上/myprefix
public GatewayFilter apply(Config config) { return new GatewayFilter() { @Override public Monofilter(ServerWebExchange exchange, GatewayFilterChain chain) { boolean alreadyPrefixed = exchange .getAttributeOrDefault(GATEWAY_ALREADY_PREFIXED_ATTR, false); if (alreadyPrefixed) { return chain.filter(exchange); } exchange.getAttributes().put(GATEWAY_ALREADY_PREFIXED_ATTR, true); ServerHttpRequest req = exchange.getRequest(); addOriginalRequestUrl(exchange, req.getURI()); // 注意这里 把prefix是放到路径最前面的 String newPath = config.prefix + req.getURI().getRawPath(); ServerHttpRequest request = req.mutate().path(newPath).build(); exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, request.getURI()); if (log.isTraceEnabled()) { log.trace("Prefixed URI with: " + config.prefix + " -> " + request.getURI()); } return chain.filter(exchange.mutate().request(request).build()); } @Override public String toString() { return filterToStringCreator(PrefixPathGatewayFilterFactory.this) .append("prefix", config.getPrefix()).toString(); } };
转载地址:http://qkawb.baihongyu.com/