1、背景
线上开发环境服务已经在跑,本地idea启动服务,通过postman调用网关地址,却总是访问的线上开发环境的服务,而并没有默认轮询的方式调用到本地服务。
2、排查过程
本地idea启动的项目配置:正常,启用的是和线上开发环境相同的配置
线上网关服务:正常,忽略
线上nacos服务注册:
发现只注册了线上服务的ip,并未注册本地ip
查看开发环境的配置:
发现服务发现配的是固定值-开发环境ip
将该配置注释掉后,重启本地服务(可能不需要重启),再去查看服务注册,发现多了一个ip,应该是本地的ip了
然后重新调用接口,发现第二次一直在转圈,最终失败,经排查是找不到服务。明明已经注册了,为什么会找不到呢?
ipconfig查看本地的IP:
发现有两个,下面的是无线网IP(当前使用的无线网连接),第一个啥,VMware的?服务注册的就是这个地址。为此网上查了下vm1和vm8。还真是VMware的!那问题找到了,这个VMware的虚拟ip上并没有运行我的项目,必然找不到,服务注册ip应该是第二个才对。那么怎么注册第二个呢?
3、解决
1、简单粗暴,直接卸载VMware
2、禁用虚拟网卡
控制面板 → 网络和共享中心 → 更改适配器设置
禁用掉所有虚拟机的网络
3、配置中设定忽略指定网络
spring:
cloud:
inetutils:
# 可用正则表达式,表示禁用以VMware开头的网络
ignoredInterfaces: ['VMware.*']
# 可用ip地址段表示
preferred-networks: ['85.1']
use-only-site-local-interfaces: true
对了,不能指定服务发现的ip,如方式4的截图,我当前采用此方式,nacos的服务注册ip已经正确
4、手动指定ip
其实就是线上ip和本地ip二选一
如果是eureka的话,则配置如下
eureka:
instance:
# 配置主机名
hostname: registry
prefer-ip-address: true
instance-id: ${eureka.instance.ip-address}:${server.port}
ip-address: 10.112.11.108
如果用的是eureka做注册中心时,方式3虽然能够让服务之间访问正确的 ip 地址,但是 ${spring.cloud.client.ip-address} 依旧为虚拟网卡的 ip ,因此如果以 s p r i n g . c l o u d . c l i e n t . i p − a d d r e s s : {spring.cloud.client.ip-address}: spring.cloud.client.ip−address:{server.port}的格式注册到注册中心,显示的地址依旧可能是虚拟网卡的地址,只是不影响使用。但是方式4能解决方式3显示问题,缺点就是硬编码写死的。
补充
要想实现通过线上网关调用本地服务(debug),还有一种方法:nacos配置中心,克隆一个配置改个名字,然后本地项目配置名称换成克隆的配置名称(配置名和项目名一致),再增加对应得网关配置即可。本地启动项目后,nacos会有一个新的服务名称的服务。