【问题标题】:How can I get the IP of the client that is sending request?如何获取发送请求的客户端的 IP?
【发布时间】:2016-12-02 14:47:51
【问题描述】:

好吧,我是新手,我不知道该怎么做,所以请各位前辈帮忙!!!!

有一种情况描述如下:

HTTP 客户端正在发送直接命中负载均衡器的请求(请求可以是任何类型,与请求类型无关)。然后负载均衡器根据流量的负载将流量重定向到运行在两个 V440 服务器中的“网关”系统,GW 逻辑是用 Java 编写的,实际上逻辑上将此请求路由到另外两个实际处理请求的服务器节点.

现在的场景是这样的:从多个 HTTP 客户端与此网关建立了多个并行连接。每个客户端一个连接。据观察,在连接到此 GW 时,在某些客户端的情况下,CPU 利用率会达到 98-99%。

客户端正在与特定端口上的 GW 建立一个连接。打开一个套接字连接:

ServerSocket _ss = new ServerSocket(_port);
Socket s = _ss.accept();

然后 GW 等待来自客户端的输入。

现在我的问题是:

  1. 为什么会发生这种情况,看起来一切正常 对于其余的客户和那里的连接。 只有少数几个与 GW 建立连接的客户会造成这种情况?

  2. 我们是否可以跟踪此客户端的 IP,以便我们了解是否 每次都发生在同一个客户身上?

  3. 有解决办法吗?

【问题讨论】:

  • 请相应地添加 cmets 我可能会编辑问题..谢谢 :)
  • 1.我想这在回答第 2 点之前无法回答,因为您需要首先找出导致这些特殊客户的行为导致问题的原因。 2. 我想是的,但是由于您没有提供有关您的 GW 的足够信息,请参阅hereherehere。第 3 点似乎首先需要第 2 点和第 1 点。
  • 提示:我会剪掉你图像的重要部分,这样你就可以删除它周围的所有空白区域。然后重新上传它,否则人们会否决你,我猜。
  • 您使用的是哪个负载均衡器?会有http访问日志,如果您调整日志记录,您可以获得源IP、响应时间等
  • 你不能。通常,您只会获取最近的代理或 NAT 设备的地址。

标签: java sockets server network-programming


【解决方案1】:

由于并非所有客户都发生这种情况,因此我们当然不会立即找到答案。然而,这是我对这个问题的有限研究所产生的结果

首先,问题2

配置您的 F5 以捕获客户端的 IP。由于它是 HTTP,因此有多种方法可以跟踪请求。一是

嗅探标题X-FORWARDED-FOR,它将提供客户端的IP 地址

或者尝试在您的日志引擎中添加此规则

when CLIENT_ACCEPTED { log local0. "clientIP:[IP::client_addr] accessed" }

如果您还需要其他数据(例如资源),您可以使用其中一种 其他事件,例如 HTTP_REQUEST:

when HTTP_REQUEST { log local0. "clientIP:[IP::client_addr] accessed [HTTP::host][HTTP::uri]" }

参考以上链接here

第二个问题

为此,您需要查看可用的流量统计机制。我读过thisthisthis。启用统计信息、实时监控、测试、模拟请求并分析输出。我目前不知道除此之外的任何其他选项。

如果您可以修改您的 Java 程序,另一种选择是为每个请求包含某种性能日志记录机制。但这意味着有很多开发,我根本不推荐。

第三,问题3

这主要是基于意见。就我认为如果你弄清楚问题,你就可以解决它。

【讨论】:

  • 我必须和团队一起尝试一下。但感谢您的意见。我会更新..!!
猜你喜欢
  • 2012-09-01
  • 2011-03-07
  • 2016-10-11
  • 2018-12-25
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
  • 2015-03-21
  • 1970-01-01
相关资源
最近更新 更多