Gateway 转发请求至注册中心Nacos中的服务404问题

问题描述

一次练手项目中,原本没问题并且测试过的gateway,再次转发链接的时候返回404状态码。gateway和被调用模块的日志信息中均无报错信息。

其中网关最后给出的信息是:Flipping property: login-module.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647


问题排查

网关访问出现404状态码的情况无非从这三个方面去排查:

1.网关问题

将gateway的配置转发文件改为:

server:port: 8000
spring:application:name: gateway-modulecloud:nacos:discovery:server-addr: localhost:8848username: nacospassword: nacosgateway:httpclient:connect-timeout: 1000response-timeout: 5sdiscovery:locator:enabled: false #启用DiscoveryClient网关集成的标志,可以实现服务的发现#gateway 定义路由转发规则routes:#一份设定- id: baidu  #唯一标识uri: http://www.baidu.com #访问的路径,lb://负载均衡访问固定写法,通过负载均衡调取所有设定中的一份predicates: #谓词,判断,是否匹配。用户请求的路径是否与...进行匹配,如果匹配则可以访问,否则就404- Path=/**

接着访问:localhost:8000 。发现跳转百度页面成功。因此转发并没有问题。于是网关端可能出现的问题还剩下 路径匹配问题。

下面是我配置的网关转发(部分):

spring:application:name: gateway-modulecloud:nacos:discovery:server-addr: localhost:8848username: nacospassword: nacosgateway:httpclient:connect-timeout: 1000response-timeout: 5sdiscovery:locator:enabled: true #启用DiscoveryClient网关集成的标志,可以实现服务的发现#gateway 定义路由转发规则routes:#一份设定- id: login-module   #唯一标识uri: lb://login-module #访问的路径,lb://负载均衡访问固定写法,通过负载均衡调取所有设定中的一份predicates: #谓词,判断,是否匹配。用户请求的路径是否与...进行匹配,如果匹配则可以访问,否则就404- Path=/login/**

与之匹配的是注册中心Nacos中的服务下的测试api (我这边就从简了):

@RestController
public class TestController {@RequestMapping("/login/sout")public String sout(){return "success";}
}

请求的路径是:http://127.0.0.1:8000/login/sout (gateway端口是:8000,服务模块的端口是:8081)

通过比对发现,路径匹配没有问题。

2. 服务注册失败

也就是说因为服务模块向服务注册中心注册失败,导致网关查询服务中心中的服务时,并没有查找到其中含有你匹配的模块服务名称,从而导致匹配失败,返回404状态码。

于是,查看Nacos中服务发现列表(这里同样从简,只开了两个需要观测的模块):

可以看出,服务注册没有问题。

3.服务模块调用问题

也就是说,是因为服务模块中的提供的请求路径本来就返回404,访问不通。因为原先在这个模块中进行了Sa-Token的分布式鉴权,所以将Maven依赖中的Sa-Token部分全部注释,进行访问,发现访问失败


最终排查

经过业务部分和Controller部分代码检测过后,发现并无问题。于是开始考虑是否是依赖间的冲突或者其他问题导致。此时,我注意到服务模块启动后日志中仍有Sa-Token的Logo:

这说明,依赖中的Sa-Token并没有完全去除。于是我反复再次查看依赖,发现这里的Sa-Token是由工具类中的。

在这里,我将项目中的一些工具类和实体类全部抽离,作为了一个工具模块,此工具模块中的pom文件中,因为偷懒,所以将其他模块中的pom文件中的依赖项进行拷贝复制到了工具模块的pom文件中(切记每个模块引入的依赖复制后需要仔细核对一遍)。因此其中也带有Sa-Token的相关依赖。于是在服务模块中将工具模块中的Sa-Token的相关依赖去除:

<dependency><groupId>com.utils</groupId><artifactId>utils</artifactId><version>0.0.1-SNAPSHOT</version><exclusions><exclusion><groupId>cn.dev33</groupId><artifactId>sa-token-dao-redis-jackson</artifactId></exclusion><exclusion><groupId>cn.dev33</groupId><artifactId>sa-token-spring-boot-starter</artifactId></exclusion><exclusion><groupId>cn.dev33</groupId><artifactId>sa-token-alone-redis</artifactId></exclusion><exclusion><groupId>cn.dev33</groupId><artifactId>sa-token-core</artifactId></exclusion></exclusions></dependency>

再次进行测试,发现仍然访问为404异常。

于是将所有业务与Controller代码全部注释,最后只剩一个测试api返回success的字符串。进行测试后,发现仍然访问不通。

因此,想到是包没有被扫描到。于是查看启动类,找到了原因:

因为提取工具类时,参照网上的博客中的做法,在启动类上引入了:

@ComponentScan(basePackages = "com.utils")

至此原因排查结束。因为@ComponentScan 如果不设置basePackage的话 默认会扫描包的所有类,如果设置了basePackage的话,只会扫描设置路径下的包。从而导致了我们原来项目模块中的包并不会被扫描到。


改正

将启动类上的

@ComponentScan(basePackages = "com.utils")

去除即可。再次进行测试:访问 http://127.0.0.1:8000/login/sout

跳转成功!!!


总结

@ComponentScan 如果不设置basePackage的话 默认会扫描包的所有类,如果设置了basePackage的话,只会扫描设置路径下的包。从而导致了我们原来项目模块中的包并不会被扫描到。

因此以后写的时候注意一下,当然正式生产场景并不推荐你不写从而扫描所有的包,而是应该将所有需要扫描的包全部写上去。

@ComponentScan(basePackages = {})填String数组 或者 用逗号隔开的String 都可以。为了idea显示兼容一点,还是改成了 String数组

Gateway 转发请求至注册中心Nacos中的服务404问题(网关日志提示availabilityFilteringRule.activeConnectionsLimit = 2147483647)相关推荐

  1. 微服务笔记:第一章_微服务简介|Eureka注册中心|Nacos注册中心|Nacos配置管理|Feign|Gateway服务网关

    微服务笔记:第一章_微服务简介|Eureka注册中心|Nacos注册中心|Nacos配置管理|Feign|Gateway服务网关 1. 微服务简介 1.1 服务架构演变 1.2 SpringCloud ...

  2. Spring Gateway集成 Nacos注册中心不能够发现服务的问题解决

    一.问题描述 我们现在是在用Nacos替换Eureka,原来Eureka和Spring gateway运行正常,可以通过Spring gateway调用注册到Eureka中的服务. 当前Spring ...

  3. 微服务系列之ZooKeeper注册中心和Nacos注册中心Nacos和Zookeeper对比

    一.ZooKeeper注册中心 Zookeeper 是 Apache Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,推 ...

  4. 服务注册中心Nacos

    文章目录 一.服务注册中心Nacos最佳实践 1.Nacos注册中心简介 背景分析 Nacos概述 构建Nacos服务 初始化配置 服务启动与访问 2.服务注册与调用入门(重点) 业务描述 生产者服务 ...

  5. 微服务之注册中心Nacos

    Nacos是什么? Nacos是阿里巴巴的产品,选择是SpringCloud中的一个组件,比Eureka组件功能更加丰富. 一个项目要想成为微服务项目体系的一部分必须将当前项目的信息注册到Nacos. ...

  6. Java学习四阶段-07 服务注册中心Nacos

    Nacos注册中心简介 背景分析 在微服务中,首先需要面对的问题就是如何查找服务(软件即服务),其次,就是如何在不同的服务之间进行通信?如何更好更方便的管理应用中的每一个服务,如何建立各个服务之间联系 ...

  7. 阿里注册中心nacos使用整合Dubbo-原创

    阿里注册中心nacos是今年开源的框架,一开始以为就是个zk.后面看了图才明白他对标的竟然是consul\eureka,最重要是完美支持dubbo.我想今年开源它也是别有用意 .(目前nacos0.7 ...

  8. 『注册中心』Consul微服务注册中心的使用及相关集群搭建

    Consul目录 一.概念篇--注册中心 1. 什么是注册中心 2. 为什么要使用注册中心 3. 注册中心类型 4. 注册中心的优点 二.概念篇--Consul 1. 什么是Consul 2. Con ...

  9. 微服务注册中心做了什么事——服务发现

    是否被一大堆的注册中心八股文淹没,不知道哪个是哪个,有啥区别甚至于不知道哪几个功能重叠互为替代,​请看下文. 服务发现 服务发现如何做到持续维护服务地址在动态运维中的时效性 那在正式开始学习之前呢,让 ...

最新文章

  1. DecimalFormat 的使用
  2. Grails GORM查询总结
  3. HTML5和css3的总结
  4. hdu4496并查集的删边操作
  5. maven配置阿里云_阿里云OSS PicGo 配置图床教程 超详细
  6. json mysql乱码问题_JSON数据乱码问题
  7. 启明云端分享|ESP32 AT 相关资源从哪里获得?以及经常会遇到的AT相关问题
  8. 详解计算机内部存储数据的形式 二进制数
  9. Windows 下使用GNU开发环境[转]
  10. DB2数据库中用户和Schema的概念与理解
  11. 使得电脑成为通用计算机器,为什么电脑显示器变成通用非即插即用监视器?
  12. uni-app、小程序项目分包经验之谈与天坑异常:RangeError: Maximum call stack size exceeded
  13. java怎么用扫描仪_如何在Java中使用扫描仪? [重复]
  14. 人工智能数学基础1:三角函数的定义、公式及固定角三角函数值
  15. 路由器wan口认证断开服务器无响应,路由器WAN口设置已断开(服务器无响应)的解决方法...
  16. Artifactory的搭建与使用简介
  17. 手机端mp4文件头前置检测,检测mp4视频文件头(moov box)是否在前面
  18. SPFA算法(最短路径)
  19. Nginx Lua 之Shared Dict get()方法在存入字符串超长的情况下不支持高并发
  20. 第6届蓝桥杯大赛个人赛省赛(软件类)真题\Java语言B组\4

热门文章

  1. iframe内嵌文件去除打印,下载功能
  2. 庆祝自己博客重新回到ITeye
  3. 戴尔Dell-Precision5520黑苹果efi引导文件
  4. Qt Android 环境搭建
  5. 【前端静态页面HTML】
  6. @Value(“$“)取值:
  7. 计算机网络的双工方式,网卡双工模式Link Speed/Duplex Mode助电脑网速加倍
  8. MATLAB机器人工具箱【3】—— 动力学相关函数及用法
  9. 电脑的文件夹选项在哪里?每次在文件夹下搜,又变成全电脑搜
  10. 华为鸿蒙系统用久了会卡吗,华为鸿蒙系统用久了会卡吗