天天看点

请求服务失败问题分析过程

1前言

本文描述在测试环境讲述客户端在测试环境请求服务端都正常,但是在线上环境客户端访问一模一样的服务器失败的问题分析过程。

请求服务失败问题分析过程

2问题描述

这里简单介绍下背景,最近一个新功能要求客户端和服务端同时上线。在测试环境中,客户端请求服务都正常,但是即将上线时候发现,通过线上链路访问服务却失败了。且线上和测试环境的链路也是一样的,服务所在机器IP都是一样。简单总结如下:

请求服务失败问题分析过程
请求服务失败问题分析过程

3问题分析

(1)首先确认客户端是否有发出请求:通过配置代理可以确认客户端有发出请求。

(2)其次确认请求是否有到达服务端:通过服务的log可以确认,在测试环境服务可以收到请求,在线上环境服务没有收到请求。

通过上述(1)(2)可以确认线上环境客户端发出的请求没有达到服务端。因此猜测问题可能就出现在合并请求服务。这里解释下合并请求服务,其实就是讲合并请求拆开,分开转发给各个服务。所以说白了就是转发作用,因此对比了下线上和测试环境合并请求转发配置。如下:

请求服务失败问题分析过程

对比上图也不难发现,线上环境是通过域名转发,而测试环境是通过ip和端口。线上服务相当于测试环境多走了一层Nginx。详细的请求路径如下:

请求服务失败问题分析过程
请求服务失败问题分析过程

4追溯问题根源

通过上面的问题分析我们大概知道问题就发生Nginx。为什么线上用域名在这里也不再赘述。正常来说请求应该先到达服务所在机器的Nginx上,然后通过Nginx在转发到服务端口。因此线上环境的链路是符合规范的,测试环境的链路是不符合规范的,即使测试服务器没有申请域名,直接写ip的方式也要先打到80端口,而不是直接打到服务端口。

按照上面思路继续排查,可以确认服务器已经配置了Nginx,并且也配置了指定location的请求会转发到服务接口。具体配置如下:

请求服务失败问题分析过程

请大家仔细观察上面的配置,不知道有多少读者能发现上面的问题。如果没发现那么请看下面正确的配置:

请求服务失败问题分析过程
请求服务失败问题分析过程

5问题剖析

细心的读者通过上面两图可以发现,在配置的最后一行不一样,多了‘/’。那么加上’/’和不加’/’有什么区别呢。

(1)首先我们来说正常配置:当location是/test.php请求到达80端口时。会根据Nginx配置规则转发到本机的端口1234且请求location仍是/test.php。服务器正常处理并返回结果。

(2)接下再说没有结果的配置:同样当location是/test.php请求到达80端口时。会根据Nginx配置规则转发到本机的端口1234,但此时的请求location不是/test.php了,而是’/’了。

这时到达服务时候的location就是’/’,变成了异常的请求路径。由于服务没有处理默认就返回200了。

请求服务失败问题分析过程

6总结

其实上面问题原因也比较简单。但是却能反应在测试过程中一些问题,具体总结如下:

1、 尽量保证测试环境和线上环境一致。

2、 测试过程尽量按照流程规范进行,既可以避免一些没必要的问题,也能及时发现一些问题。

3、 测试过程中要尽量的可能发散,千里之堤毁于蚁穴,只要是影响到项目质量的问题,都属于我们的测试范围,都应在我们的监控之下。

请求服务失败问题分析过程