Gateway动态路由引发的请求404

项目场景:

nacos+gateway 做路由转发


问题描述

请求gateway地址:

gateway/jeecg-boot/income/statistics/login/page/

期望转发到目标服务地址:

ems-back/income/statistics/login/page/

路由配置

	{
		"id": "ems-back",
		"order": 1,
		"predicates": [
			{
				"name": "Path",
				"args": {
					"_genkey_0": "/jeecg-boot/**"
				}
			}
		],
		"filters": [
			{
				"name": "RewritePath",
				"args": {
					"_genkey_0": "/jeecg-boot/(?<segment>.*)",
					"_genkey_1": "/$\\{segment}"
				}
			}
		],		
		"uri": "lb://ems-back"
	}

结果请求到地址: 

jeecg-boot/income/statistics/login/page/

最终j请求到错误的服务导致404

原因分析:

gateway router 转发到错误的服务,应该是错误的配置了路由信息。

1.检查naocos的gateway路径配置文件,发现无jeecg-boot的路由配置

2.检查gateway 本地配置信息,也无jeecg-boot的路由配置

3.检查gateway的启动配置,发现gateway启动了动态路由配置

    gateway:
      discovery:
        locator:
          # TODO 动态路由,会把jeecg-boot开头的请求 转发到jeecg-boot的舞曲,order = 0;
          enabled: true

断点排查

FilteringWebHandler 类

    public Mono<Void> handle(ServerWebExchange exchange) {
        Route route = (Route)exchange.getRequiredAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);
        List<GatewayFilter> gatewayFilters = route.getFilters();
        List<GatewayFilter> combined = new ArrayList(this.globalFilters);
        combined.addAll(gatewayFilters);
        AnnotationAwareOrderComparator.sort(combined);
        if (logger.isDebugEnabled()) {
            logger.debug("Sorted gatewayFilterFactories: " + combined);
        }

        return (new DefaultGatewayFilterChain(combined)).filter(exchange);
    }

route 信息为:

 id = "ReactiveCompositeDiscoveryClient_jeecg-boot"
 uri = {URI@14666} "lb://jeecg-boot"
 order = 0
 predicate = {AsyncPredicate$DefaultAsyncPredicate@14667} "Paths: [/jeecg-boot/**], match trailing slash: true"
 gatewayFilters = {ArrayList@14668}  size = 1
 metadata = {HashMap@14669}  size = 6  

该uri地址为错误的服务

原因找到,gateway 自动配置了路由信息,并且该路由的order=0,优先于我们配置的目标order=1,所以该router先于我们的router拦截请求,转发到了jeecg-boot服务。


解决方案:

  • 修改ems-back, router信息,order =0,这样同样order=0,优先手动配置路由地址
  • 修改项目根路径为非jeecg-boot,这样动态路由jeecg-boot服务就不会收到非jeecg-boot的根路径请求
  • 修改jeecg-boot服务名为其他,这样动态路由地址也会变
  • 修改动态路由为false,不会启动动态路由,所有路由得手动配置
    gateway:
      discovery:
        locator:
          enabled: false

       

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值