为分布式部署开发

发布: (2025年12月14日 GMT+8 13:00)
7 min read
原文: Dev.to

Source: Dev.to

良好实践与考虑因素

引言

本文的想法来源于年初我在启动开发项目时需要考虑的要素的发布,以及与刚开始学习云环境的同事们的讨论。

现在,应用程序通常会部署在分布式环境中,无论是通过云供应商(AWS、Azure、GCP)、Kubernetes 等编排器、托管服务、无服务器函数,甚至是分布式的本地基础设施。

面向这些分布式环境开发应用程序需要考虑若干特定方面。

以下是一份关键实践与考虑因素清单,帮助构建弹性且可扩展的分布式应用。

本文主要针对长期运行的服务进行阐述。这些考虑同样适用于无服务器函数和事件驱动的应用。


多实例即用即弃以提供同一服务

多个克隆,一个使命

最重要的考虑是,你的应用必须设计为能够在多个实例同时运行的环境中工作。这意味着一个实例不应干扰另一个实例,且要避免处理重复。应用不应依赖本地状态或特定于某实例的资源,因为这些在实例之间或重启后并不一定可用或持久。

无论是水平扩展(增加实例)还是为了弹性(重启故障实例),实例数量都会根据实际或预期负载、时间等因素变化。你的应用必须能够在多个实例之间协同工作而不产生冲突。

它也很可能在没有人工干预的情况下启动。因此在设计和开发时必须牢记这些要点。


位于负载均衡器 / 反向代理之后的架构

就像服务中心的呼叫分配器:每个请求根据需求被送到正确的部门——计费、支持或账户。

在大多数情况下,你的应用实例会部署在负载均衡器(Load Balancer)之后。负载均衡器会把进入的流量分配到不同的实例。

使用 sticky sessions 可以让负载均衡器把后续请求返回到同一实例。但可能出现以下情况:最初处理请求的实例已不可用(缩容、更新等),或负载均衡器不支持 sticky 会话。此时,应用必须能够在未处理前一次工作流请求的情况下接管该请求。

在现代架构中,负载均衡器或 API Gateway 还可以根据请求路由到不同的服务:

  • 基于路径(path‑based routing):/api/users → 用户服务,/api/orders → 订单服务
  • 基于主机(host‑based routing):api.example.com → API,static.example.com → 静态资源
  • 基于请求头或 API 版本(header/version routing):X-Client: mobileAccept: application/vnd.company.v2+json
  • 基于方法或端口(较少见),视技术约束而定

对开发者的影响是必须避免对本地会话状态的假设,因为请求可能会落到其他服务或实例。传播关联标识(correlation IDs)以在多个服务之间追踪请求变得非常有用。


将配置外部化

将配置外部化就像在手机里换 SIM 卡:同一部设备,设置随网络而变。换了 SIM 卡,就可以换运营商——Bell、Vidéotron、Orange——而不必更换手机本身。

把应用的配置与代码分离,使得无需重新编译即可修改参数。常见做法是使用环境变量。参见 12‑factor app(配置章节) 的推荐。

云供应商提供了配置外部化服务:

  • AWS Systems Manager Parameter Store
  • Azure App Configuration
  • GCP Secret Manager

也可以自行部署配置服务,如 ConsuletcdSpring Cloud Config。此时需要让应用从这些服务读取配置。

选择取决于你的部署策略:单一云供应商、多供应商,或未来可能更换供应商。供应商无关的解决方案可以避免 vendor lock‑in


功能标记(Feature Flags)与动态配置

功能标记允许在不重新编译或重新部署的情况下启用或禁用功能(前提是应用已实现即时读取这些标记)。它们的用途包括:

  • 渐进式发布:对一定比例的用户或特定用户组启用新功能。
  • A/B 测试:对同一功能的不同实现进行对比。
  • 紧急关闭(Kill switch):在生产环境中快速禁用有问题的功能。
  • 特定环境:仅在开发或 QA 环境启用功能,生产环境保持关闭。

可使用 LaunchDarklyUnleashSplit.ioAWS AppConfig 等工具来管理功能标记。


密钥管理

切勿将密钥(密码、API Key、证书等)直接写入代码或版本化的配置文件中。应使用密钥管理服务:

  • AWS Secrets Manager
  • Azure Key Vault
  • GCP Secret Manager
  • Kubernetes Secrets(开启静态加密)
  • HashiCorp Vault
  • SOPS(用于加密配置文件)

这些方案提供:静态与传输中的加密、细粒度访问控制、自动轮换以及访问审计。


工作文件或上传文件的备份

在云环境中写入本地磁盘,就像把笔记留在咖啡桌上一样:它…(文本未完)

Back to Blog

相关文章

阅读更多 »