当您通过SLB访问应用时,可以通过本文提供的方法在代码中获取客户端IP。
问题描述
在EDAS中创建的应用绑定SLB后,客户端通过SLB访问时,如何在后端Java代码中获取到客户端的真实IP呢?
说明 EDAS
页面的负载均衡-外网和负载均衡-内网在获取客户端IP这个问题上类似。
解决方案
根据应用部署的集群不同,解决方案也有所区别。
- 部署在ECS集群的应用
可直接在后端Java代码中使用下面的方式获取即可。
String client_ip = request.getHeader("x-forwarded-for");
另外,还可以通过获取HTTP Header中的x-real-ip、wl-proxy-client-ip参数来得到客户端的真实IP。
-
部署在容器服务Kubernetes集群的应用
- 在容器服务Kubernetes控制台的集群列表中找到您创建的Kubernetes集群,并在该集群操作列单击控制台。
- 在该集群的控制台页面,单击服务,然后在服务页面中找到并单击通过EDAS控制台部署的应用。
- 在应用服务的详情页面右上角单击编辑。
- 在修改Service对话框找到externalTrafficPolicy配置参数,将该参数值由默认的Cluster改为Local,然后在该对话框右下角单击更新,即会动态更新该服务的配置。
- 在后端Java代码中可通过下面的方式获取到客户端的真实IP :
String client_ip = request.getRemoteAddr();
结合上面ECS集群和容器服务Kubernetes集群部署的应用获取客户端IP的方法,可通过三元运算符将这两种方式变为一行代码:
String client_ip = request.getHeader("x-forwarded-for") == null ? request.getRemoteAddr() : request.getHeader("x-forwarded-for");
即可适配EDAS中不同的集群类型。
另外,该参数的修改还可以通过kubectl命令的方式:
说明 前提是已经参见Kubernetes集群基本信息页面的通过kubectl连接Kubernetes集群部分配置好了KubeConfig。kubectl patch svc <service_name> -p '{"spec":{"externalTrafficPolicy":"Local"}}'