SpringBoot 中可以通过 HttpServletRequest 去获取改次请求的相关信息,如请求 url、请求头数据、客户端请求 ip 及端口等。
(javax.servlet.http.HttpServletRequest)
例:218.93.204.35 通过 62251 端口发起请求 http://humh.cn:9080/community_data_event/cv/h5/tracking ,这个请求会指向 k8s 集群内的 community-data-event 这个 pod。
该 pod 内部 ip 为 10.244.4.177,java 服务内部启动端口号 8090。部分日志及相关信息如下
2023-11-10 14:42:00.657|INFO|nio-8090-exec-4|c.c.w.c.w.i.RequestLogInterceptor|doLog|44|from_service=app,client_ip=218.93.204.35,romote_ip=218.93.204.35,net_state=wifi| request:{url=/community_data_event/cv/h5/tracking, params={}}
特别说明:
此次请求其实原本是 218.93.204.35 通过 62251 端口发起请求 http://humh.cn/webapi/h5/tracking ,humh.cn 会指向到 apisix,9080 为 apisix 网关默认端口。而 apisix 上预配置了规则 /webapi/h5/tracking 这个路径会静态改写到 /community_data_event/cv/h5/tracking ,改写后路径会路由到 community-data-event 这个 pod。而静态改写属于 apisix 内部完成逻辑,此时请求还未到服务器,所以真正发往服务器的请求是 http://humh.cn:9080/community_data_event/cv/h5/tracking,而不是最开始的 http://humh.cn/webapi/h5/tracking 。
基于上面这个例子,下面是部分方法释义(community-data-event 此 java pod 内调用)
方法名 | 作用 | 示例 |
---|---|---|
getScheme | 获取当前请求协议名,如 http、https | http |
getServerName | 获取当前服务器主机名,如当前服务域名 | humh.cn |
getServerPort | 获取当前服务器端口号,如当前服务端口 | 9080 |
getServletPath | 获取当前请求 URL 中对应 servlet 部分,即 controller 上 @RequestMapping 中 path | /community_data_event/cv/h5/tracking |
getRequestURI | 获取当前请求 URL 中“协议名://域名”后的子串部分 | /community_data_event/cv/h5/tracking |
getLocalName | 获取当前服务内部主机名 | localhost |
getLocalAddr | 获取当前服务内部 ip 地址 | 10.244.4.177 |
getLocalPort | 获取当前服务内部端口号 | 8090 |
getRemoteHost | 获取发起请求的远端主机 ip,即发起请求的客户端 ip | 218.93.204.35 |
getRemotePort | 获取发起请求的远端主机端口号,即发起请求的客户端端口号 | 62251 |
发表回复