首页
编程语言

分类

当前位置: 云海天教程网 > 技术新闻 > 编程语言 >正文

前端调用接口成功但后端没收到请求

更新时间:2021-07-22  作者:佚名   来源: 网络转载

前端调用接口成功但后端没收到请求

环境描述:

​ 微服务技术栈: SpringCloud Alibaba

​ 网关: Gateway


问题描述:

​ 前台发送的请求的响应码为200
前端调用接口成功但后端没收到请求

​ 具体响应内容:

前端调用接口成功但后端没收到请求

​ 后台的Controller层方法却没有进入

​ 注: 只有启动微服务项目中的B服务时,才会出现接口概率性调用异常,关闭B服务不会出现


问题分析:

​ 因为所有的Controller层的接口都会出现此问题,可以断定与接口无关,所以决定先排查B服务与网关


排查过程:

  1. 在网关配置的Fallback类上打上断点,查看是否是接口调用失败导致问题的出现

    @RestController
    public class FallbackController {
        /**
         * 全局熔断处理
         * @return
         */
        @RequestMapping("/fallback")
        public Mono<String> fallback() {
            return Mono.just("访问超时,请稍后再试!");
        }
    }    
    

    果然,断点卡在第9行上,并且返回值也与前台获得的相应内容一致

  2. 在网关配置的Filter类上打上断点,查看调用失败的接口信息

    @Component
    public class GlobalAccessTokenFilter implements GlobalFilter, Ordered 
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
             String url = exchange.getRequest().getURI().getPath();
        }
    

    ​ 结果发现此方法一直在被调用,速度极快,并且几乎全是/login/xx与/getXXX接口,因为业务原因,作者十分

    确定这两个接口不会被频繁调用,所以判断是存在死循环在调用这两个接口

  3. 继续排查B服务,重点查找调用上述两个接口的方法,果然发现存在死循环(代码就不放了)


解决方法:

​ 解决方法当然是干掉死循环了,不过还有另一种解决方法: 搭建集群。因为真实生产环境中此问题也完全有可能是并发量达到了gateway的上限造成的,那自然就需要对gateway服务做集群

​ 这里说一下openFeign如何配置gateway集群

@FeignClient(value = "gateway服务名称", contextId = "xxx", fallbackFactory = "xxx")
上述配置即可自动进行负载均衡转发到gateway服务上(注意: value属性值不可重复,否则项目会启动失败,如果需要配置多个FeignClient的话并且value值需要一样的话,请再额外配置contextId进行区分)

​ 下一篇我会详细说一下@FeignClient的常用配置

上一篇:【Python】:Python import导入上一级目录的文件和模块 下一篇:Leetcode No.20 Valid Parentheses有效的括号(c++实现)
小编推荐
快速导航更多>>
JavaScript 教程 HTML5 教程 CSS3 教程 jQuery 教程 Vue.js 教程 Node.js 教程 SQL 教程 C 教程 PHP 教程 Linux 教程 Docker 教程 Nginx 教程 Python 教程 Java 教程

云海天教程网 版权所有

陕ICP备14013131号-3