# 将存在缺陷的微服务应用容器化并通过完整的持续集成/持续部署流水线进行交付

发布日期:2026-05-11 10:02:42   浏览量 :5
发布日期:2026-05-11 10:02:42  
5

2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家 

这是我 HNG 开发运维实习系列文章的一部分。在第一阶段,我在实时服务器上的 Nginx 后面部署了一个个人应用程序接口。第二阶段是事情变得严肃起来的地方。

任务

我们拿到了一个有缺陷的代码库,并被告知要使其达到生产就绪状态。没有关于哪里出错的提示。没有错误列表。只有代码和一条指令:“发现它们也是任务的一部分。”

该应用程序是一个分布式作业处理系统,由四个服务组成:

  • 一个前端(Node.js/Express),用户在此提交和跟踪作业
  • 一个应用程序接口(Python/FastAPI),用于创建作业并提供状态更新
  • 一个工作器(Python),从队列中获取并处理作业
  • 一个雷迪斯实例,在应用程序接口和工作器之间共享,作为消息代理

我的工作是找出每一个错误,修复每一个配置错误,用生产质量的 Dockerfile 容器化所有三个服务,用 Docker Compose 将所有内容连接在一起,并构建一个完整的持续集成/持续部署流水线,按严格顺序运行代码检查、测试、安全扫描、集成测试和滚动部署。

在动手之前先阅读代码

我做的第一件事是在编写任何基础设施代码之前仔细阅读每个文件。这是大多数人出错的地方——他们在不了解应用程序实际功能的情况下,直接跳去编写 Dockerfile。

以下是我的发现。

雷迪斯主机名问题

api/main.pyfrontend/app.js 都将 localhost 硬编码为雷迪斯和应用程序接口的主机名。当所有内容都在一台机器上运行时,这没问题,但在 Docker 容器内,每个服务都有自己的网络命名空间。应用程序接口容器内的 localhost 指向应用程序接口容器本身,而不是雷迪斯。

修复方法很简单——使用环境变量和 Docker 的内置域名系统:

# 修改前
r = redis.Redis(host="localhost", port=6379)

# 修改后
r = redis.Redis(host=os.getenv("REDIS_HOST", "redis"), port=6379)

Docker Compose 会自动使用服务名称为每个服务创建域名系统条目。因此,redis 在网络内部解析为雷迪斯容器的互联网协议地址。

静默的队列不匹配

这一点很微妙。应用程序接口正在将作业标识推送到一个名为 job_queue 的雷迪斯列表中:

r.lpush("job_q

免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。

关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
支持 反馈 订阅 数据
回到顶部