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

时间:2014-07-13 15:26:46

标签: 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。

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

1 个答案:

答案 0 :(得分:2)

我不知道是否有“标准”方法可以做到这一点。但如果我遇到这种情况,我会做以下事情:

首先,找出哪些进程正在侦听系统中的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协议确保在关闭端口后,TCP客户端仍然保留该端口大约一分钟。