阿里云首页 企业级分布式应用服务 EDAS

通过SLB访问EDAS应用时如何获取客户端真实IP

概述

当您通过SLB访问应用时,可以通过本文提供的方法在代码中获取客户端真实IP。

详细信息

根据应用部署的集群不同,解决方案也有所区别:

  • 部署在ECS集群的应用:
    可直接在后端Java代码中使用以下方式获取。另外,还可以通过获取HTTP Header中的x-real-ip、wl-proxy-client-ip参数来得到客户端的真实IP。
    String client_ip = request.getHeader("x-forwarded-for");
  • 部署在容器服务Kubernetes集群的应用:
    1. 登录容器服务Kubernetes控制台,在集群列表页面找到并单击您创建的Kubernetes集群名。
    2. 然后依次单击服务与路由>服务,在服务页面中找到并单击通过EDAS控制台部署应用右侧的详情
    3. 在应用服务的详情页面右上角单击编辑
    4. 修改Service对话框找到externalTrafficPolicy配置参数,将该参数值由默认的Cluster改为Local,然后在该对话框右下角单击更新,即会动态更新该服务的配置。
      说明:该参数的修改还可以通过kubectl命令的方式,其中[$Service_Name]为您的服务名称。前提是您已经参见Kubernetes集群基本信息页面的通过kubectl连接Kubernetes集群部分配置好了KubeConfig,然后执行以下命令。如何通过kubectl连接Kubernetes集群,请参见通过kubectl连接Kubernetes集群
      kubectl patch svc [$Service_Name] -p '{"spec":{"externalTrafficPolicy":"Local"}}'
    5. 在后端Java代码中可通过以下方式获取到客户端的真实IP。
      String client_ip = request.getRemoteAddr();

结合上面ECS集群和容器服务Kubernetes集群部署的应用获取客户端IP的方法,可通过三元运算符将这两种方式变为一行代码,即可适配EDAS中不同的集群类型。

String client_ip = request.getHeader("x-forwarded-for") == null ? request.getRemoteAddr() : request.getHeader("x-forwarded-for");

适用于

  • 企业级分布式应用服务EDAS