查了好多,没有相应解决方案,最后通过看源码,找到PathRoutePredicateFactory
通过复制PathRoutePredicateFactory自定义一个路由断言实现,亲测成功
代码如下: 关键点在于 注释中 手动修改忽略大小写
@Component
* 自定义断言 path忽略大小写
* author chenjiabing
public class CustomRoutePredicateFactory extends AbstractRoutePredicateFactory<CustomRoutePredicateFactory.Config> {
private static final Log log = LogFactory.getLog(CustomRoutePredicateFactory.class);
private static final String MATCH_TRAILING_SLASH = "matchTrailingSlash";
private PathPatternParser pathPatternParser = new PathPatternParser();
public CustomRoutePredicateFactory() {
super(CustomRoutePredicateFactory.Config.class);
private static void traceMatch(String prefix, Object desired, Object actual, boolean match) {
if (log.isTraceEnabled()) {
String message = String.format("%s \"%s\" %s against value \"%s\"", prefix, desired,
match ? "matches" : "does not match", actual);
log.trace(message);
public void setPathPatternParser(PathPatternParser pathPatternParser) {
this.pathPatternParser = pathPatternParser;
@Override
public List<String> shortcutFieldOrder() {
return Arrays.asList("patterns", MATCH_TRAILING_SLASH);
@Override
public ShortcutType shortcutType() {
return ShortcutType.GATHER_LIST_TAIL_FLAG;
@Override
public Predicate<ServerWebExchange> apply(CustomRoutePredicateFactory.Config config) {
final ArrayList<PathPattern> pathPatterns = new ArrayList<>();
synchronized (this.pathPatternParser) {
pathPatternParser.setMatchOptionalTrailingSeparator(config.isMatchTrailingSlash());
config.getPatterns().forEach(pattern -> {
PathPattern pathPattern = this.pathPatternParser.parse(pattern.toLowerCase());//手动修改忽略大小写
pathPatterns.add(pathPattern);
return new GatewayPredicate() {
@Override
public boolean test(ServerWebExchange exchange) {
PathContainer path = parsePath(exchange.getRequest().getURI().getRawPath().toLowerCase());//手动修改忽略大小写
PathPattern match = null;
for (int i = 0; i < pathPatterns.size(); i++) {
PathPattern pathPattern =pathPatterns.get(i) ;
if (pathPattern.matches(path)) {
match = pathPattern;
break;
if (match != null) {
traceMatch("Pattern", match.getPatternString(), path, true);
PathMatchInfo pathMatchInfo = match.matchAndExtract(path);
putUriTemplateVariables(exchange, pathMatchInfo.getUriVariables());
return true;
else {
traceMatch("Pattern", config.getPatterns(), path, false);
return false;
@Override
public String toString() {
return String.format("Paths: %s, match trailing slash: %b", config.getPatterns(),
config.isMatchTrailingSlash());
@Validated
public static class Config {
private List<String> patterns = new ArrayList<>();
private boolean matchTrailingSlash = true;
public List<String> getPatterns() {
return patterns;
public CustomRoutePredicateFactory.Config setPatterns(List<String> patterns) {
this.patterns = patterns;
return this;
* @deprecated use {@link #isMatchTrailingSlash()}
@Deprecated
public boolean isMatchOptionalTrailingSeparator() {
return isMatchTrailingSlash();
* @deprecated use {@link #setMatchTrailingSlash(boolean)}
@Deprecated
public CustomRoutePredicateFactory.Config setMatchOptionalTrailingSeparator(boolean matchOptionalTrailingSeparator) {
setMatchTrailingSlash(matchOptionalTrailingSeparator);
return this;
public boolean isMatchTrailingSlash() {
return matchTrailingSlash;
public CustomRoutePredicateFactory.Config setMatchTrailingSlash(boolean matchTrailingSlash) {
this.matchTrailingSlash = matchTrailingSlash;
return this;
@Override
public String toString() {
return new ToStringCreator(this).append("patterns", patterns)
.append(MATCH_TRAILING_SLASH, matchTrailingSlash).toString();
spring:
#profiles: predicate-path #配置文件名 和 spring.profiles.active 相对应
#配置程序名为eureka-gateway-client
application:
name: eureka-gateway-client
cloud:
#设置路由规则
gateway:
discovery:
locator:
GateWay坑——context-path环境准备正确路由context-path和application.name不一致注册中心Gateway网关设置访问结果路由失败context-path和application.name一致注册中心Gateway网关设置访问结果路由失败-原因路由失败-解决方案gateway.discovery.locator方案一方案二包装一层前缀
eureka,gateway,要路由的服务(bit-msa-pasm-api)
正确路由
context-path和appl
一、 前言
Kong Gateway 是一个开源的轻量级 API 网关,也是目前市场上最流行的 API 网关之一。位于您的上游服务之前,您可能运行API 服务骑,但需在请求到达您的服务器时管理流量、API 网关身份验证或日志记录。kong 网关及其所有插件就能实现上述的需求。
二、kong安装
下载连接: kong 资源下载
根据自己的操作系统下载。
kong可以在有数据库和没有数据库两种情况下运行。推荐运行有数据库版本的,在后续的配置中可添加 oauth2等认证操作。
Kong 支持PostgreSQL
- spring.cloud.gateway.discovery.locator.lower-case-service-id=true
是将请求路径上的服务名配置为小写,因为服务注册的时候,向注册中心注册时将服务名转成大写的了。
- spring.cloud.gateway.discovery.locator.enabled=false
是否与服务发现组件进行结合,通过 serviceId 转发到具体的服务实例。
默认为false,设为true便开启通过服务中心的自动根据 serviceId 创建路由的功能
C#项目转Java项目的时候,出现的一些问题,由于C#没有区分大小写路由,前端页面也不够规范,同一个页面,有的是大写,有的是小写,这个在java里面就必须进行javaconfig的配置处理
具体需要添加一个统一的类来路由到页面
在Java中,java.util.regex包定义了正则表达式使用到的相关类,其中最主要的两个类为:Pattern、Matcher:
Pattern 编译正则表达式后创建一个匹配模式;
Matcher 使用Pattern实例提供的正则表达式对...
一.GateWay简介
Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul网关。网关作为流量的,在微服务系统中有着非常作用,网关常见的功能有路由转发、权限校验、限流控制等作用。
Route(路由):这是网关的基本构建块。它由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。
Predicate(断言):这是一个...
CSDN-Ada助手:
spring cloud gateway 网关路由忽略大小写实现
CSDN-Ada助手: