记一次服务间调用失败的bug

1. 服务环境描述

1.所有服务都注册到Consul上,服务间调用采用的是服务名;

2.所有服务用docker容器化部署,用docker swarm管理服务集群;

3.docker compose编排文件里的所有服务的端口均未映射出来,即没有加 ports: -8080:8080 这样的配置项;

2. 增加A服务的端口映射

由于需求需要,我让工程把服务器上的 A 服务的端口映射出来,

于是工程在docker-compose.yml 中A服务处新增了 ports: -8099:8099 这样的配置项。

3. 问题出现

B服务的日志内报无法调通 A 服务的异常

4. 排查

于是我进入B服务的容器内,用curl命令发请求,发现确实请求不通A服务,但是把A服务的serviceName1 改成 serviceName2:8099 可以请求通;

【注:serviceName1 是A服务在consul中的服务名,serviceName2:8099 是A服务在docker-compose编排里的服务名】

5. 猜测

由于第二步修改A服务的端口映射,到问题出现,中间隔了好几天,所以一开始并没想到是由于A服务的端口映射导致的这个问题,后来才想到可能跟这个有关系;

于是把docker-compose.yml 中A服务的 ports: -8099:8099 配置项注释了,重启服务,发现B服务就能正常通过serviceName1 调用A服务了。

6. 原因分析&解决

主机有多个网络(可通过docker network ls 查看),注册到consul时错误的网络会导致服务间无法调用,因此需要指定一下优先使用哪个网络。

需要在A服务的bootstrap.yml的配置文件中新增如下配置项:

(因为docker编排中设置的网络名称就是XXX_NET)

|-----------|--------------------------------------------------------------------------------|
| 1 2 3 4 5 | spring: ``cloud: ``inetutils: ``preferred-networks: ``- $XXX_NET |

参考:https://www.cnblogs.com/noidler/p/15019986.html

相关推荐
花生壳儿11 分钟前
Docker容器安装MySQL数据库
数据库·mysql·docker
极客先躯31 分钟前
高级java每日一道面试题-2025年12月11日-实战篇[Docker]-如何配置 Docker 的资源限制(CPU、内存、磁盘)?
java·docker·如何配置docker的资源限制·资源限制的底层支柱·linux cgroups·cpu 限制·从逻辑到策略
亚空间仓鼠37 分钟前
Docker容器化高可用架构部署方案(八)
android·docker·架构
刘某的Cloud1 小时前
docker && containerd 镜像加速
运维·docker·容器·containerd·镜像加速
前端若水1 小时前
开发环境准备:Python、Node.js、Docker与Git
python·docker·node.js
Harvy_没救了2 小时前
【虚拟容器-docker】docker核心“铁三角“--网络、存储、镜像管理
网络·docker·容器
DandelionR2 小时前
DolphinScheduler 3.4.1 Docker 部署安装 Skill
运维·docker·容器
亚空间仓鼠11 小时前
Docker容器化高可用架构部署方案(六)
docker·容器·架构
前端老曹11 小时前
Docker 从入门到放弃:完整指南
运维·docker·容器
咖啡里的茶i12 小时前
在Docker环境中安装Hadoop cluster 实验报告一
hadoop·docker·容器