在微服务的环境中使用docker部署各个应用,部分应用使用容器内的真实ip暴露出服务。会导致微服务之间调用出现网络超时,要解决这个问题需要让微服务暴露为宿主机的ip
使用docker-compose的配置 network_mode: "host"
emqx-auth:
container_name: "xxApp"
network_mode: "host"
image: image
restart: always
environment:
TZ: "Asia/Shanghai"
APP_SERVICE: "gateway-v3-3.0.1-SNAPSHOT"
START_COMMAND: "--spring.config.location=classpath:bootstrap.yml,/conf/base.yml,/conf/emqx-auth.yml"
JAVA_OPTS: "-Xms512m -Xmx1024m"
NACOS_IP: $NACOS_IP
volumes:
- "/cloud/service:/cloud/service"
networks:
- bridge1
使用docker 创建容器时指定参数 --network host
docker run image --network host --port 8080:8080 --name xxApp -d
如果使用的是nacos做注册中心、可在各个应用内部通过配置项指定host参数
spring.cloud.nacos.discovery.ip=192.168.12.32
在使用dubbo时也可以通过下面两种方式解决
暴露服务指定host
<dubbo:protocol name="dubbo" port="20890" host="主机地址"/>
设置环境变量
# DUBBO_IP_TO_BIND = 主机地址
docker run -e DUBBO_IP_TO_BIND=30.5.97.6 -p 30.5.97.6:20881:20880 --name xxApp -d
不在docker环境直接设置系统的环境变量即可。
总结:
1、 可以通过dubbo.protocol或dubbo.provider的host属性对host进行配置,
支持IP地址和域名.但此时注册到注册中心的IP地址和监听IP地址是同一个值
2、 为了解决在虚拟环境或局域网内consumer无法与provider通信的问题,可以通过 环境变量 分别设置注册到注册中心的IP地址和监听IP地址,
其优先级高于dubbo.protocol或dubbo.provider的host配置
官网参考:主机自定义