springcloud注册服务使用 Docker 容器内网 ip 问题

在使用容器部署微服务时,微服务注册到 nacos 或eurika上的 ip 地址使用的是容器内网 ip,导致各个微服务模块之间负载均衡调用失败。

解决办法(参考: https://github.com/alibaba/nacos/issues/310)

(一):容器

--network=host 主机网络模式

容器运行时将会使用宿主机的网络信息, 会拿到宿主机的ip注册到nacos上(win不支持host模式)。 容器映射端口使用服务自身配置的端口。

docker run -d --network=host --name app app:latest

(二):eureka

(1)指定注册固定的IP:

eureka:
  instance:
    prefer-ip-address: true
    instance-id: producer
    ip-address: 101.37.6.8 

(2)指定注册固定的域名

eureka:
  instance:
    prefer-ip-address: false
    instance-id: producer
    hostname: my.web.cn

 

(三)nacos 

在配置文件中指定服务注册的地址

spring:
  cloud:
    nacos:
      discovery:
        ip: xx.xx.xx.xx   # ip既可以是固定的IP,也可以是固定的域名
        port: xxxx    # port 一般可以不用指定,会自动探测
也可以在启动jar文件的命令行添加启动参数
java -jar -Dspring.cloud.nacos.discovery.ip=xx.xx.xx.xx -Dspring.cloud.nacos.discovery.port=xxxx app.jar

(四): springcloud

1、通过springcloud的preferred-networks 选择符合前缀的 IP (同网段ip)作为服务注册 IP

spring:
  cloud:
    inetutils:
      # 选择符合前缀的IP作为服务注册IP, 支持正则表达式
      preferred-networks:
          - 192.168

 2、排除虚拟网卡

spring:
  cloud:
    inetutils:
      # 排除虚拟网卡
      ignored-interfaces:
          - vm-eth1

 

posted @ 2023-06-16 17:23  蓝迷梦  阅读(1609)  评论(0)    收藏  举报