前端調用接口成功但后端沒收到請求


環境描述:

​ 微服務技術棧: SpringCloud Alibaba

​ 網關: Gateway


問題描述:

​ 前台發送的請求的響應碼為200
image

​ 具體響應內容:

image

​ 后台的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常用配置


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM