为分布式部署开发
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: mobile或Accept: 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
也可以自行部署配置服务,如 Consul、etcd 或 Spring Cloud Config。此时需要让应用从这些服务读取配置。
选择取决于你的部署策略:单一云供应商、多供应商,或未来可能更换供应商。供应商无关的解决方案可以避免 vendor lock‑in。
功能标记(Feature Flags)与动态配置
功能标记允许在不重新编译或重新部署的情况下启用或禁用功能(前提是应用已实现即时读取这些标记)。它们的用途包括:
- 渐进式发布:对一定比例的用户或特定用户组启用新功能。
- A/B 测试:对同一功能的不同实现进行对比。
- 紧急关闭(Kill switch):在生产环境中快速禁用有问题的功能。
- 特定环境:仅在开发或 QA 环境启用功能,生产环境保持关闭。
可使用 LaunchDarkly、Unleash、Split.io 或 AWS AppConfig 等工具来管理功能标记。
密钥管理
切勿将密钥(密码、API Key、证书等)直接写入代码或版本化的配置文件中。应使用密钥管理服务:
- AWS Secrets Manager
- Azure Key Vault
- GCP Secret Manager
- Kubernetes Secrets(开启静态加密)
- HashiCorp Vault
- SOPS(用于加密配置文件)
这些方案提供:静态与传输中的加密、细粒度访问控制、自动轮换以及访问审计。
工作文件或上传文件的备份
在云环境中写入本地磁盘,就像把笔记留在咖啡桌上一样:它…(文本未完)