项目为springcloud微服务项目,现在有三台服务器部署其中的几个微服务,注册与配置中心为nacos。
部署之后gateway能正常路由每个微服务,因为nacos配置的真实公网ip,但dubbo调用失败,dubbo却调用的内网ip,这是为什么呢,我需要做什么配置吗。
项目为springcloud微服务项目,现在有三台服务器部署其中的几个微服务,注册与配置中心为nacos。
部署之后gateway能正常路由每个微服务,因为nacos配置的真实公网ip,但dubbo调用失败,dubbo却调用的内网ip,这是为什么呢,我需要做什么配置吗。
引自免费微信小程序:皆我百晓生
在Dockerfile中配置Dubbo的内网通信时,我们可以通过设置COM_DUBBO_NETWORK_TYPE=native
来启用内网通讯。这样,无论服务是否在内网中运行,都可以通过网络获取并发送请求,从而解决Dubbo内部通信问题。
以下是一个简单的Dockerfile示例,用于将 Dubbo 配置用于内网环境,并展示如何配置 COM_DUBBO_NETWORK_TYPE=native
和 -Dcom_dubbo_port=20880
参数。
FROM spring-cloud/spring-boot-starter-web
COPY pom.xml /pom.xml
WORKDIR /app
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "target/my-service.jar"]
VOLUME /data
在这个Dockerfile中,我们从Spring Cloud Spring Boot starter web 中复制POM.xml 文件到 /app/pom.xml
目录中,并将端口号(8080)映射到外部主机的相应端口。
然后,在 Dockerfile 的结尾处,我们设置启动端口为 8080,这表示Dubbo会监听这个端口进行客户端的请求交互。接下来,我们将服务容器化在镜像上,这意味着服务的运行依赖于构建整个 Docker 容器的工作。
对于 COM_DUBBO_NETWORK_TYPE=native
参数,我们需要将 network_mode=native
设置为启用了默认的网络模式(TCP),即让Docker容器连接到内部网络中的其他Docker容器。这是因为nacos通常会提供一个公共的地址(如8.8.8.8 或者 443)作为它们的服务注册中心的域名解析地址,而这些DNS解析地址通常是内部网络地址,而不是外部公网IP地址。
对于 -Dcom_dubbo_port=20880
参数,这是一个Docker Compose命令行选项,用于指定Docker服务的端口,这里将其设置为本地内网的端口,即20880
。这意味着一旦服务启动,就可以通过该端口对外部网络中的其他Docker容器发送HTTP请求。
要确保COM_DUBBO_NETWORK_TYPE=native
和-Dcom_dubbo_port=20880
参数生效,你需要在Docker-compose.yml文件中定义上述服务及其依赖,并添加相应的端口映射:
services:
my-service:
image: your-docker-image-name
ports:
- "8080:8080"
environment:
- com_dubbo_network_type=native
- com_dubbo_port=20880
networks:
- default
在这个例子中,your-docker-image-name
是你的Docker镜像名称,8080
是服务端口。当你创建Docker-compose.yml文件后,通过以下命令启动Docker-compose服务:
docker-compose up
这将在所有运行的Docker容器上启动服务,并将端口映射到外部IP地址。如果你使用的是Nginx作为代理转发器,那么通过修改Nginx配置文件(例如 /etc/nginx/sites-available/nyu-nacos.conf
),可以允许外部访问MyService服务的8080端口:
location /my-service {
proxy_pass http://localhost:20880;
}
至此,你的Docker部署将基于Docker Compose和nacos服务注册中心实现了内网通信。通过COM_DUBBO_NETWORK_TYPE=native
参数,Dubbo和nacos之间的连接不再受Docker本身的网络限制,而是跨越了Docker容器内的私有网络,实现了一种无网络限制的通信方式。当你使用Docker代理访问该服务时,由于端口被映射到了本地内网,你无需手动配置网络信息就能直接访问。