在 Eureka 注册中心中,服务实例默认会注册其本机 IP 地址。但如果服务部署在 LVS(Linux Virtual Server)负载均衡后方,可能需要绕过 LVS 的虚拟 IP(VIP),直接注册服务实例的本机真实 IP 地址。以下是详细配置方法:
方法 1:通过配置文件指定 IP(推荐)
在服务实例的配置文件(如 application.yml
)中显式指定本机 IP 地址:
yaml
eureka:
instance:
# 手动指定本机 IP 地址(替换为实际 IP)
ip-address: 192.168.1.100
# 优先使用 IP 而非主机名
prefer-ip-address: true
方法 2:绑定网卡接口(Linux 环境)
通过配置强制使用物理网卡(如 eth0
)的 IP,避免获取到 LVS 的虚拟 IP:
yaml
spring:
cloud:
inetutils:
# 指定使用的网卡(根据实际网卡名修改)
preferred-networks: eth0
# 忽略虚拟网卡(如 docker0、veth* 等)
ignored-interfaces:
- docker0
- veth.*
方法 3:环境变量覆盖
在启动服务时通过环境变量注入本机 IP:
bash
java -jar your-service.jar \
--eureka.instance.ip-address=$(hostname -I | awk '{print $1}')
方法 4:自定义 InstanceInfo 配置(高级)
通过 Java 代码动态设置 IP:
java
@Bean
public EurekaInstanceConfigBean eurekaInstanceConfig(InetUtils inetUtils) {
EurekaInstanceConfigBean config = new EurekaInstanceConfigBean(inetUtils);
// 动态获取本机 IP(跳过 LVS IP)
String realIp = InetAddress.getLocalHost().getHostAddress();
config.setIpAddress(realIp);
config.setPreferIpAddress(true);
return config;
}
验证步骤
-
查看 Eureka 注册信息
访问 Eureka 控制台(
http://eureka-server:port
),检查服务实例的 IP 是否已变为本机真实 IP。 -
检查服务元数据
在注册信息中确认
ipAddr
字段是否正确:json{ "instanceId": "192.168.1.100:your-service:8080", "hostName": "192.168.1.100", "ipAddr": "192.168.1.100", // 确保这里是本机 IP "port": 8080 }
关键注意事项
-
关闭 LVS 的 SNAT 问题
若 LVS 使用
DR
或TUN
模式,需确保后端服务器禁用 ARP 响应 (配置arp_ignore
和arp_announce
),避免 VIP 冲突。 -
防火墙规则
确保 Eureka Server 能直接访问服务实例的真实 IP 和端口(非 LVS VIP)。
-
多网卡环境
若服务器有多个网卡,需明确指定物理网卡(如
eth0
)或通过spring.cloud.inetutils
过滤虚拟接口。
总结
通过以上配置,服务实例会直接向 Eureka 注册本机真实 IP,绕过 LVS 的虚拟 IP,确保服务间通信直接路由到实例节点。