引言
我们的产品主打金融服务领域,以B端客户为我们的核心合作伙伴,然而,我们的服务最终将惠及C端消费者。在技术实现上,我们采用了公司自主研发的微服务框架,该框架基于SpringBoot,旨在提供高效、可靠的服务支持。
近期,客户在通过应用性能管理(APM)工具监控服务时提出了一个问题,他们发现存在持续的404请求。要求我们进行调查,确定服务的调用端。初步调查我们的服务并没有设置引发这些请求的相关接口。因此,我们怀疑可能是某些服务尝试访问框架自带的监控接口所致。
鉴于客户主要通过监控Spring MVC的请求响应来进行服务监控,我们需要深入源码,寻找具体的实现类,以便准确识别并解决问题。
问题排查过程
熟悉Spring MVC的开发者都了解,其请求转发的核心入口是DispatcherServlet.doDispatch方法。因此,首要步骤便是利用Arthas的watch命令对请求进行监控,以便检查进入该方法的参数。
watch org.apache.catalina.core.ApplicationDispatcher doDispatch '{params,returnObj,throwExp}' -n 5 -x 3
在测试环境中进行服务排查时,我们发现接口请求的结果中包含了大量请求,这使得我们难以识别和查看特定的接口。为了解决这个问题,我们参考了Arthas官方文档,并了解到watch命令支持基于条件表达式的请求过滤功能。因此,我们编写了如下命令,以便对请求进行筛选,专注于查看我们关心的特定请求。
watch org.springframework.web.servlet.DispatcherServlet doDispatch '{params[0].request.getRemoteAddr()}' 'params[0].request.getRequestURI()=="/test"'
通过上述命名,我们可以观察到接口的实际请求IP地址为127.0.0.1。这是我在本地进行的模拟;在实际测试环境中,将显示实际的请求IP地址。
在确认了IP地址之后,我们便能够识别出与之对应的服务器上安装了哪些软件。进一步的调查发现,该服务器上部署了一个由我们公司自主研发的基于Nginx开发的转发服务。这个服务会定期发送"/"请求,以检测服务的活跃状态。
总结
在处理本次客户反馈的问题时,我们积累了以下宝贵经验:
-
监控与排查:APM工具对于实时监控服务状态是至关重要的。它能够即时发现并提醒我们系统中的异常活动,如持续出现的404请求。
-
熟悉框架:对使用的技术框架,如Spring MVC,需要有深入的了解。了解其请求转发机制和核心方法,能够帮助我们快速定位问题。
-
工具使用:利用诊断工具如Arthas可以极大提高问题排查的效率。通过watch命令,我们可以根据自定义的条件表达式过滤和监控特定的请求,这对于查找问题源头非常有帮助。
-
内部服务检查:定期检查和审计服务器上的服务及应用,特别是那些自主开发的服务,以确保它们的健康运行,避免非预期的行为影响系统稳定性。
-
通讯协议理解:了解各种服务间如何通讯,例如基于HTTP的探活请求("/"请求),这有助于识别服务通信模式及其可能产生的影响。
综上所述,一个结构清晰的排查流程、对所用技术的深入理解以及有效的监控策略,都是确保服务稳定运行和快速响应问题的关键因素。