linux - 找出Linux机器中的调用者和被调用的服务

标签 linux rest sniffing

我有一个系统,其中有多个 Java、C++ 和 Python 服务相互调用以完成各种任务。这是我继承了将近20年的系统。

现在,当我调试问题时,我发现很难确定哪个客户端在哪个场景中调用了哪个服务。由于这是一个多层系统,问题就更加严重了。

这些服务驻留在测试环境中的同一台 Linux 机器上,但使用 IP 和端口相互连接(因为这是多机生产环境的设置方式)。

有没有办法让我通过嗅探器之类的工具来检测每个场景中正在调用哪个服务以及哪个客户端正在调用?如果是这样,有人可以帮助我了解是否需要进行任何特定配置吗?

P.S.:我可以通过查看日志来找出这些信息。但是浏览 15-20 个服务日志以找出这些详细信息并匹配它们的各种日志记录格式并非易事。 :(

根据建议,我添加了更多详细信息: 我有一个用例,其中用户单击按钮 B1 并调用 Web 服务 W1。 W1 可能会调用以下服务之一:RESTful 服务 R1、另一个 RESTful 服务 R2 或 SOAP 服务 S1。此外,S1 也可以在某些用例中依次调用 R1。

现在,我如何找出调用了哪个服务以及调用的顺序?

最佳答案

我不知道是否有“标准”的方法来做到这一点。但如果我遇到这种情况,我会执行以下操作:

首先,找出系统中有哪些进程在监听TCP端口:

netstat -tlnp
# -t: TCP -l: listening -n: numeric -p: pid

您还可以通过 ps -ef 找出它们是什么,包括它们的参数。

然后,监控所有进程的网络:

tcpdump -i lo -Xn 'port 8888'
# suppose 8888 is the port on which some process is listening
# -i lo: since the services are on the same machine, all the traffics are through local loopback
# -X: ascii  -n: numeric

然后,点击按钮B1,查看网络数据到达了哪些服务。所以你可以知道W1调用了这些服务。

请注意,当涉及负载均衡、反向代理等技术时,行为可能不一致。

也很容易找出哪个进程正在向端口 8888 发送数据,因为您可以在 tcpdump 中看到客户端的端口。假设端口是 54321,然后:

netstat -tnp | grep 54321

您可以找出哪个进程正在使用端口 54321

当然,如果您的客户端正在使用连接池,那么该进程似乎将占用端口 54321 相当长的时间。但是,如果您的客户端使用短连接与服务进行通信,仍然可以确定哪个进程正在使用该端口,因为 TCP 协议(protocol)确保在关闭端口后,TCP 客户端仍保留该端口大约一分钟。

关于linux - 找出Linux机器中的调用者和被调用的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24724251/

相关文章:

linux - 在 ALSA MIDI SysEx 交换上双向嗅探/监听

linux - if 语句 - 不等于

linux - 发送modem AT指令及解析结果

c - 如何在 Linux 上用 C 递归列出目录?

java - 使用 Jersey 在 Java RESTful Web 服务中生成 JSON 和 XML 响应

java - Jaxb:处理剩余 Web 服务响应中的可选元素

wcf - 为什么我可以在嗅探器中将 SSL 通信视为纯文本?

python - Ubuntu Python : "get_mac" function not defined

rest - 如何将 Swagger OpenAPI 规范添加到 Spring Boot 项目中?