<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: 架构师小白</title>
    <description>The latest articles on DEV Community by 架构师小白 (@tianxin).</description>
    <link>https://dev.to/tianxin</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3824850%2Fd2237655-84d6-4050-ade4-4acffe96bf30.png</url>
      <title>DEV Community: 架构师小白</title>
      <link>https://dev.to/tianxin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tianxin"/>
    <language>en</language>
    <item>
      <title>无服务器架构深度指南：Serverless的设计原理与实践经验</title>
      <dc:creator>架构师小白</dc:creator>
      <pubDate>Thu, 04 Jun 2026 01:04:27 +0000</pubDate>
      <link>https://dev.to/tianxin/wu-fu-wu-qi-jia-gou-shen-du-zhi-nan-serverlessde-she-ji-yuan-li-yu-shi-jian-jing-yan-13lc</link>
      <guid>https://dev.to/tianxin/wu-fu-wu-qi-jia-gou-shen-du-zhi-nan-serverlessde-she-ji-yuan-li-yu-shi-jian-jing-yan-13lc</guid>
      <description>&lt;h1&gt;
  
  
  无服务器架构深度指南：Serverless的设计原理与实践经验
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;在云计算时代，无服务器架构正在改变我们构建和部署应用程序的方式。本文将深入探讨Serverless的核心概念、设计原则以及在实际项目中的最佳实践。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  什么是无服务器架构？
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;无服务器架构（Serverless Architecture）&lt;/strong&gt;是一种云计算执行模型，在这种模式下，云服务商负责自动管理服务器的 allocations 和 scaling，开发者只需关注业务代码的编写。&lt;br&gt;
虽然名为「无服务器」，但这并不意味着完全不需要服务器，而是将服务器管理的复杂性抽象化，让开发者聚焦于业务逻辑本身。&lt;/p&gt;
&lt;h3&gt;
  
  
  核心特性
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;特性&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;无需自建服务器&lt;/td&gt;
&lt;td&gt;云厂商负责底层基础设施&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;自动弹性伸缩&lt;/td&gt;
&lt;td&gt;根据请求量自动扩容/缩容&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;按使用付费&lt;/td&gt;
&lt;td&gt;只为实际消耗的计算资源付费&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;事件驱动&lt;/td&gt;
&lt;td&gt;函数在特定事件触发时执行&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  Serverless的核心组件
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. 函数即服务（FaaS）
&lt;/h3&gt;

&lt;p&gt;FaaS是Serverless架构的核心，代表产品包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS Lambda&lt;/strong&gt; - 亚马逊无服务器计算服务&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;阿里云函数计算 FC&lt;/strong&gt; - 国内领先的函数计算平台&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google Cloud Functions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Functions&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  2. 后端即服务（BaaS）
&lt;/h3&gt;

&lt;p&gt;BaaS提供各种后端服务：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;数据库服务（如 DynamoDB、云数据库）&lt;/li&gt;
&lt;li&gt;身份认证服务（如 Cognito、RAM）&lt;/li&gt;
&lt;li&gt;消息队列服务（如 SQS、消息队列）&lt;/li&gt;
&lt;li&gt;存储服务（如 S3、OSS）&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  为什么要采用Serverless架构？
&lt;/h2&gt;
&lt;h3&gt;
  
  
  优势分析
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;降低运维成本&lt;/strong&gt; - 无需关心服务器运维&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;快速上线&lt;/strong&gt; - 函数即代码，小团队也能快速迭代&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;天然弹性&lt;/strong&gt; - 高并发场景自动扩容&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;成本优化&lt;/strong&gt; - 低负载时几乎零成本&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  适用场景
&lt;/h3&gt;

&lt;p&gt;✅ 理想的Serverless场景：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;异步事件处理（如图片处理、文件转换）&lt;/li&gt;
&lt;li&gt;Webhooks和API后端&lt;/li&gt;
&lt;li&gt;实时数据处理流水线&lt;/li&gt;
&lt;li&gt;定时批处理任务&lt;/li&gt;
&lt;li&gt;IoT设备数据采集&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;❌ 不适合的场景：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;需要长时间运行的任务 (&amp;gt; 15分钟)&lt;/li&gt;
&lt;li&gt;对延迟敏感的实时系统&lt;/li&gt;
&lt;li&gt;需要保持持久连接的应用&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  设计模式与最佳实践
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Stateless函数设计
&lt;/h3&gt;

&lt;p&gt;Serverless函数应该是无状态的，利用外部存储管理状态：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;lambda_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;s3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="c1"&gt;# 从外部存储获取状态
&lt;/span&gt;    &lt;span class="n"&gt;dynamodb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dynamodb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dynamodb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}))}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. 冷启动优化
&lt;/h3&gt;

&lt;p&gt;Cold Start是Serverless的典型问题，优化策略：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;优化策略&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;减小包体积&lt;/td&gt;
&lt;td&gt;只包含必要的依赖&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;预热请求&lt;/td&gt;
&lt;td&gt;定期ping函数保持活跃&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;使用Provisioned Concurrency&lt;/td&gt;
&lt;td&gt;预留实例&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;合理设置内存&lt;/td&gt;
&lt;td&gt;内存越多，CPU越强，启动越快&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  3. 错误重试机制
&lt;/h3&gt;

&lt;p&gt;函数执行可能失败，设计合理的重试策略：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;设置最大重试���数（如3次）&lt;/li&gt;
&lt;li&gt;结合Dead Letter Queue捕获失败事件&lt;/li&gt;
&lt;li&gt;使用指数退避策略&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  典型架构示例：事件驱动的图片处理系统
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;用户上传图片 → S3事件触发Lambda → Lambda处理 → 结果存入存储 → 通知用户
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;这是Serverless最典型的应用场景之一。&lt;/p&gt;




&lt;h2&gt;
  
  
  国内生态选择
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;平台&lt;/th&gt;
&lt;th&gt;特点&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;阿里云函数计算&lt;/td&gt;
&lt;td&gt;起步早，生态完善&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;腾讯云SCF&lt;/td&gt;
&lt;td&gt;与微信生态集成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;百度智能云CFC&lt;/td&gt;
&lt;td&gt;AI推理场景有优势&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  总结
&lt;/h2&gt;

&lt;p&gt;Serverless架构代表了一种范式转变：从自建服务器，到利用云厂商基础设施专注业务。它不是银弹，但在合适的场景下能发挥巨大价值。建议从小处着手，如将某些后台任务迁移到函数计算，逐步积累经验。&lt;/p&gt;







&lt;p&gt;&lt;em&gt;💡 欢迎在评论区分享你的Serverless实践经验！&lt;/em&gt;&lt;/p&gt;

</description>
      <category>serverless</category>
      <category>cloud</category>
      <category>architecture</category>
    </item>
    <item>
      <title>微服务架构深度指南：从概念到实践的完整指南</title>
      <dc:creator>架构师小白</dc:creator>
      <pubDate>Tue, 02 Jun 2026 01:03:40 +0000</pubDate>
      <link>https://dev.to/tianxin/wei-fu-wu-jia-gou-shen-du-zhi-nan-cong-gai-nian-dao-shi-jian-de-wan-zheng-zhi-nan-380b</link>
      <guid>https://dev.to/tianxin/wei-fu-wu-jia-gou-shen-du-zhi-nan-cong-gai-nian-dao-shi-jian-de-wan-zheng-zhi-nan-380b</guid>
      <description>&lt;h1&gt;
  
  
  微服务架构深度指南：从概念到实践的完整指南
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;在现代软件开发领域，微服务架构已经成为构建可扩展、灵活系统的主流选择。本文将深入探讨微服务的核心概念、设计原则、以及在实际项目中的最佳实践。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  什么是微服务架构？
&lt;/h2&gt;

&lt;p&gt;微服务架构是一种将应用程序构建为一组小型、自包含服务的方法。每个服务都围绕特定的业务功能构建，可以独立开发、部署和维护。与传统的单体架构不同，微服务将应用程序拆分为多个松耦合的服务，这些服务通过轻量级API进行通信。&lt;/p&gt;

&lt;h3&gt;
  
  
  核心特征
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. 单一职责&lt;/strong&gt;&lt;br&gt;
每个微服务专注于完成单一的、特定的任务。例如，一个电商系统可能包含：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;用户服务：处理用户注册、登录和配置文件&lt;/li&gt;
&lt;li&gt;商品服务：管理产品目录和库存&lt;/li&gt;
&lt;li&gt;订单服务：处理购买流程和订单管理&lt;/li&gt;
&lt;li&gt;支付服务：处理交易和退款&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. 独立部署&lt;/strong&gt;&lt;br&gt;
每个服务都可以独立开发、测试和部署。这意味着团队可以：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;快速迭代单个服务而不影响其他服务&lt;/li&gt;
&lt;li&gt;使用不同的技术栈实现不同的服务&lt;/li&gt;
&lt;li&gt;独立扩展特定的服务组件&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. 分散治理&lt;/strong&gt;&lt;br&gt;
微服务架构强调技术多样性，允许团队：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;为每个服务选择最合适的技术栈&lt;/li&gt;
&lt;li&gt;采用不同的数据库和数据模型&lt;/li&gt;
&lt;li&gt;根据服务需求选择不同的部署策略&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  微服务架构的优势与挑战
&lt;/h2&gt;
&lt;h3&gt;
  
  
  优势
&lt;/h3&gt;
&lt;h4&gt;
  
  
  1. 可扩展性
&lt;/h4&gt;

&lt;p&gt;微服务允许根据每个服务的负载单独扩展。在高峰期，只需要扩展订单服务，而不需要扩展整个应用。&lt;/p&gt;
&lt;h4&gt;
  
  
  2. 技术灵活性
&lt;/h4&gt;

&lt;p&gt;团队可以为每个服务选择最适合的技术栈。例如：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;数据处理服务使用 Go 以获得高性能&lt;/li&gt;
&lt;li&gt;内容管理服务使用 Python 进行快速开发&lt;/li&gt;
&lt;li&gt;缓存服务使用 Redis 实现高速访问&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  3. 快速迭代
&lt;/h4&gt;

&lt;p&gt;独立的部署周期使得团队可以：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;每周甚至每天部署新功能&lt;/li&gt;
&lt;li&gt;快速修复生产问题&lt;/li&gt;
&lt;li&gt;实现持续交付和持续集成&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  4. 容错隔离
&lt;/h4&gt;

&lt;p&gt;单个服务的故障不会导致整个系统崩溃。例如，如果推荐服务宕机，主业务流程仍然可以继续运行。&lt;/p&gt;
&lt;h3&gt;
  
  
  挑战
&lt;/h3&gt;
&lt;h4&gt;
  
  
  1. 分布式系统的复杂性
&lt;/h4&gt;

&lt;p&gt;微服务本质上是分布式系统，带来了额外的复杂性：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;网络延迟和不稳定性&lt;/li&gt;
&lt;li&gt;服务间通信的开销&lt;/li&gt;
&lt;li&gt;数据一致性的维护&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  2. 运维复杂度
&lt;/h4&gt;

&lt;p&gt;需要成熟的DevOps文化和技术：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;容器化和服务编排&lt;/li&gt;
&lt;li&gt;监控和日志聚合&lt;/li&gt;
&lt;li&gt;自动化的CI/CD流水线&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  3. 数据一致性
&lt;/h4&gt;

&lt;p&gt;在分布式环境中维护数据一致性是困难的：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;分布式事务的开销巨大&lt;/li&gt;
&lt;li&gt;需要采用事件溯源或其他模式&lt;/li&gt;
&lt;li&gt;最终一致性成为常态&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  微服务设计原则
&lt;/h2&gt;
&lt;h3&gt;
  
  
  领域驱动设计
&lt;/h3&gt;

&lt;p&gt;微服务应该围绕业务领域而不是技术层来划分。使用领域驱动设计（DDD）的概念：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;有界上下文（Bounded Context）&lt;/strong&gt;：每个微服务对应一个业务领域的边界&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;领域语言&lt;/strong&gt;：服务内部使用统一的领域语言&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;聚合根&lt;/strong&gt;：确保业务实体的一致性&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  API设计最佳实践
&lt;/h3&gt;
&lt;h4&gt;
  
  
  RESTful API
&lt;/h4&gt;

&lt;p&gt;采用标准的RESTful设计：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 好的API设计示例&lt;/span&gt;
&lt;span class="nx"&gt;GET&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;orders&lt;/span&gt;
&lt;span class="nx"&gt;PUT&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;orders&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;orderId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="sr"&gt;/statu&lt;/span&gt;&lt;span class="err"&gt;s
&lt;/span&gt;&lt;span class="nx"&gt;DELETE&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;products&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  gRPC
&lt;/h4&gt;

&lt;p&gt;对于高性能场景，考虑使用gRPC：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Protocol Buffers 提供高效序列化&lt;/li&gt;
&lt;li&gt;强类型的IDL&lt;/li&gt;
&lt;li&gt;支持双向流&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  数据库设计
&lt;/h3&gt;

&lt;p&gt;每个微服务应该拥有自己的数据存储：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;避免服务之间的数据库共享&lt;/li&gt;
&lt;li&gt;每个服务独立选择数据库类型&lt;/li&gt;
&lt;li&gt;通过API而非直接数据库访问通信&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  服务通信模式
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;同步通信&lt;/strong&gt;：使用REST或gRPC进行请求-响应交互。适用于需要即时响应的场景。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;异步通信&lt;/strong&gt;：使用消息队列实现事件驱动架构。适用于：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;需要最终一致性的操作&lt;/li&gt;
&lt;li&gt;解耦长时间的处理流程&lt;/li&gt;
&lt;li&gt;处理高并发写入&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  微服务实践：构建一个订单服务
&lt;/h2&gt;

&lt;p&gt;让我们通过实际代码来理解微服务的实现。首先定义服务的核心接口：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# order_service.py
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dataclasses&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;dataclass&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;enum&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Enum&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Enum&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;PENDING&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pending&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;CONFIRMED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;confirmed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;SHIPPED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shipped&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;DELIVERED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;delivered&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;CANCELLED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cancelled&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderItem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;product_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;
    &lt;span class="n"&gt;unit_price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;

&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;OrderItem&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;OrderStatus&lt;/span&gt;
    &lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
    &lt;span class="n"&gt;updated_at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
    &lt;span class="n"&gt;total_amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calculate_total&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total_amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quantity&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unit_price&lt;/span&gt; 
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total_amount&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  服务层实现
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# service_layer.py
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderService&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;eventublisher&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;repository&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;repository&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;event_publisher&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event_publisher&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;OrderItem&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# 验证库存
&lt;/span&gt;        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_check_inventory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;InsufficientInventoryError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;product_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# 创建订单
&lt;/span&gt;        &lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_generate_order_id&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;OrderStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PENDING&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;updated_at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calculate_total&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="c1"&gt;# 保存订单
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# 发布订单创建事件
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;event_publisher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;order.created&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;order_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total_amount&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total_amount&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;confirm_order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;OrderStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PENDING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;InvalidOrderStatusError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OrderStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CONFIRMED&lt;/span&gt;
        &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;updated_at&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# 扣减库存
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_reduce_inventory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# 发布确认事件
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;event_publisher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;order.confirmed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;order_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  微服务基础设施
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ���务发现
&lt;/h3&gt;

&lt;p&gt;在动态的微服务环境中，服务发现至关重要：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;客户端发现&lt;/strong&gt;：服务客户端从注册中心获取服务实例列表并自行选择。实例包括 Eureka、Consul。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;服务端发现&lt;/strong&gt;：负载均衡器负责路由请求。实例包括 AWS ALB、Nginx Plus。&lt;/p&gt;

&lt;h3&gt;
  
  
  配置管理
&lt;/h3&gt;

&lt;p&gt;集中化管理所有服务的配置：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# config.yaml 示例&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;order-service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${DB_HOST}&lt;/span&gt;
      &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${DB_PORT}&lt;/span&gt;
      &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${DB_USER}&lt;/span&gt;
      &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${DB_PASSWORD}&lt;/span&gt;
    &lt;span class="na"&gt;kafka&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;bootstrap-servers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${KAFKA_SERVERS}&lt;/span&gt;
    &lt;span class="na"&gt;redis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${REDIS_HOST}&lt;/span&gt;
      &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${REDIS_PORT}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  监控与追踪
&lt;/h3&gt;

&lt;p&gt;分布式追踪对于调试微服务问题至关重要：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;指标收集&lt;/strong&gt;：使用 Prometheus 收集指标，使用 Grafana 可视化。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;日志聚合&lt;/strong&gt;：使用 ELK Stack（Elasticsearch、Logstash、Kibana）或 Loki。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;分布式追踪&lt;/strong&gt;：使用 Jaeger、Zipkin 或 AWS X-Ray。&lt;/p&gt;

&lt;h3&gt;
  
  
  容器化和服务编排
&lt;/h3&gt;

&lt;p&gt;Docker 和 Kubernetes 是微服务的事实标准：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Dockerfile 示例&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; python:3.11-slim&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; requirements.txt .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-cache-dir&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 8080&lt;/span&gt;

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["python", "-m", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  微服务安全
&lt;/h2&gt;

&lt;h3&gt;
  
  
  身份认证与授权
&lt;/h3&gt;

&lt;p&gt;采用现代的身份认证方案：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OAuth 2.0 / OpenID Connect&lt;/strong&gt;：用于用户身份认证。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;服务网格认证&lt;/strong&gt;：如 mTLS 确保服务间通信安全。&lt;/p&gt;

&lt;h3&gt;
  
  
  API网关
&lt;/h3&gt;

&lt;p&gt;API网关是微服务的统一入口：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;集中认证和授权&lt;/li&gt;
&lt;li&gt;请求限流&lt;/li&gt;
&lt;li&gt;日志和监控&lt;/li&gt;
&lt;li&gt;请求路由&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;常见选择：Kong、Ambassador、AWS API Gateway。&lt;/p&gt;

&lt;h3&gt;
  
  
  敏感数据管理
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;使用 HashiCorp Vault 管理密钥&lt;/li&gt;
&lt;li&gt;实施密钥轮换策略&lt;/li&gt;
&lt;li&gt;加密传输中和静态数据&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  微服务测试策略
&lt;/h2&gt;

&lt;h3&gt;
  
  
  测试金字塔
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;单元测试&lt;/strong&gt;：覆盖单个服务内部的业务逻辑。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;集成测试&lt;/strong&gt;：验证服务与其他服务和数据库的交互。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;端到端测试&lt;/strong&gt;：验证完整的用户流程。&lt;/p&gt;

&lt;h3&gt;
  
  
  契约测试
&lt;/h3&gt;

&lt;p&gt;确保服务之间的API兼容性：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;使用 Pact 或 Spring Cloud Contract&lt;/li&gt;
&lt;li&gt;每个服务定义其合约&lt;/li&gt;
&lt;li&gt;自动验证实现是否符合合约&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  混沌工程
&lt;/h3&gt;

&lt;p&gt;在生产环境中主动注入故障来测试恢复能力：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;模拟服务故障&lt;/li&gt;
&lt;li&gt;测试网络分区&lt;/li&gt;
&lt;li&gt;验证超时处理&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  何时采用微服务架构？
&lt;/h2&gt;

&lt;p&gt;微服务不是银弹，需要谨慎选择：&lt;/p&gt;

&lt;h3&gt;
  
  
  适合微服务的场景
&lt;/h3&gt;

&lt;p&gt;✓ 大型复杂系统，需要多个团队并行开发&lt;br&gt;
✓ 需要频繁、快速地发布新功能&lt;br&gt;
✓ 需要灵活扩展特定组件&lt;br&gt;
✓ 采用云原生技术栈&lt;/p&gt;

&lt;h3&gt;
  
  
  不适合微服务的场景
&lt;/h3&gt;

&lt;p&gt;✗ 小型或简单的应用&lt;br&gt;
✗ 初创项目的早期阶段&lt;br&gt;
✗ 团队规模较小，缺乏DevOps经验&lt;br&gt;
✗ 需要强一致性的事务&lt;/p&gt;




&lt;h2&gt;
  
  
  结论
&lt;/h2&gt;

&lt;p&gt;微服务架构为现代软件开发带来了极大的灵活性，但也引入了复杂性。在采用微服务之前，应该仔细评估团队能力、项目规模和长期需求。&lt;/p&gt;

&lt;p&gt;成功的微服务实施需要：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;成熟的DevOps文化&lt;/li&gt;
&lt;li&gt;自动化的CI/CD流水线&lt;/li&gt;
&lt;li&gt;全面的监控和可观测性&lt;/li&gt;
&lt;li&gt;团队的持续学习和改进&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;记住：&lt;strong&gt;架构是为业务服务的&lt;/strong&gt;，选择最适合当前需求和未来发展的方案才是正确的决策。&lt;/p&gt;




&lt;h2&gt;
  
  
  参考资料
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;《���服务设计》（Sam Newman）&lt;/li&gt;
&lt;li&gt;《领域驱动设计》（Eric Evans）&lt;/li&gt;
&lt;li&gt;Martin Fowler 的微服务文章&lt;/li&gt;
&lt;li&gt;Microsoft Azure 微服务架构指南&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;祝你构建出优秀的微服务系统！&lt;/p&gt;




&lt;p&gt;&lt;em&gt;本文为技术分享文章，旨在帮助开发者了解微服务架构的基础知识和最佳实践。&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  架构 #微服务 #后端开发 #分布式系统 #技术教程
&lt;/h1&gt;

</description>
      <category>architecture</category>
      <category>microservices</category>
      <category>systemdesign</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>领域驱动设计深度指南：面向复杂业务的软件开发方法论</title>
      <dc:creator>架构师小白</dc:creator>
      <pubDate>Mon, 01 Jun 2026 01:05:22 +0000</pubDate>
      <link>https://dev.to/tianxin/ling-yu-qu-dong-she-ji-shen-du-zhi-nan-mian-xiang-fu-za-ye-wu-de-ruan-jian-kai-fa-fang-fa-lun-b2l</link>
      <guid>https://dev.to/tianxin/ling-yu-qu-dong-she-ji-shen-du-zhi-nan-mian-xiang-fu-za-ye-wu-de-ruan-jian-kai-fa-fang-fa-lun-b2l</guid>
      <description>&lt;h1&gt;
  
  
  领域驱动设计深度指南
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;领域驱动设计（Domain-Driven Design，简称DDD）是一种面对复杂业务系统时的软件开发方法论，它强调将业务领域作为软件设计的核心。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  为什么要学习DDD？
&lt;/h2&gt;

&lt;p&gt;传统开发方式在系统规模较小时能快速见效，但随业务复杂度增加会出现：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;需求变更困难&lt;/li&gt;
&lt;li&gt;职责边界模糊&lt;/li&gt;
&lt;li&gt;团队沟通障碍&lt;/li&gt;
&lt;li&gt;复用困难&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;DDD将业务置于软件设计的核心，让技术服务于业务。&lt;/p&gt;

&lt;h2&gt;
  
  
  核心概念
&lt;/h2&gt;

&lt;h3&gt;
  
  
  领域
&lt;/h3&gt;

&lt;p&gt;指软件所处理的业务范围，如电商系统的商品、订单，金融系统的账户、交易。&lt;/p&gt;

&lt;h3&gt;
  
  
  实体与值对象
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;实体&lt;/strong&gt;：有唯一标识，如用户ID、订单号&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;值对象&lt;/strong&gt;：无唯一标识，由属性定义，如地址、金额&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  聚合根
&lt;/h3&gt;

&lt;p&gt;聚合内部实体的根实体，负责维护聚合内部的一致性。&lt;/p&gt;

&lt;h2&gt;
  
  
  限界上下文
&lt;/h2&gt;

&lt;p&gt;划定模型的应用范围，隔离不同业务模块的语义。例如「用户」在认证、营销、客服系统中是不同的概念。&lt;/p&gt;

&lt;h2&gt;
  
  
  战术设计工具
&lt;/h2&gt;

&lt;h3&gt;
  
  
  领域服务
&lt;/h3&gt;

&lt;p&gt;承载不属于实体或值对象的操作，如计算订单总价。&lt;/p&gt;

&lt;h3&gt;
  
  
  领域事件
&lt;/h3&gt;

&lt;p&gt;表示领域中发生的业务事件，用于解耦、可追溯和最终一致性。&lt;/p&gt;

&lt;h3&gt;
  
  
  工厂与仓储
&lt;/h3&gt;

&lt;p&gt;工厂负责创建聚合，仓储负责持久化。&lt;/p&gt;

&lt;h2&gt;
  
  
  实践建议
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;从业务流程开始&lt;/strong&gt;：先深入理解业务，与业务专家对话&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;使用通用语言&lt;/strong&gt;：团队使用同一种语言&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;迭代式建模&lt;/strong&gt;：模型持续演进&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;合理分层&lt;/strong&gt;：接口层→应用服务层→领域层→基础设施层&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;从小处着手&lt;/strong&gt;：从核心业务域开始&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;测试驱动&lt;/strong&gt;：模型应易于测试&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  总结
&lt;/h2&gt;

&lt;p&gt;DDD不仅是技术，更是一种思考方式：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;以业务为中心&lt;/li&gt;
&lt;li&gt;模型有成本&lt;/li&gt;
&lt;li&gt;沟通重要&lt;/li&gt;
&lt;li&gt;迭代演进&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;参考资源&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;《领域驱动设计》— Eric Evans&lt;/li&gt;
&lt;li&gt;《实现领域驱动设计》— Vaughn Vernon&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>architecture</category>
      <category>softwareengineering</category>
      <category>systemdesign</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>CQRS架构模式深度指南：读写分离的艺术</title>
      <dc:creator>架构师小白</dc:creator>
      <pubDate>Sun, 31 May 2026 01:03:01 +0000</pubDate>
      <link>https://dev.to/tianxin/cqrsjia-gou-mo-shi-shen-du-zhi-nan-du-xie-fen-chi-de-yi-zhu-55j0</link>
      <guid>https://dev.to/tianxin/cqrsjia-gou-mo-shi-shen-du-zhi-nan-du-xie-fen-chi-de-yi-zhu-55j0</guid>
      <description>&lt;h1&gt;
  
  
  CQRS架构模式深度指南：读写分离的艺术
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;在现代分布式系统中，读写分离是提升性能和可扩展性的关键策略。CQS（Command Query Separation）原则告诉我们：修改状态的操作和查询操作是不同的，应该分开处理。CQRS将这一原则发挥到极致，让我们深入探讨这一强大的架构模式。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  什么是CQRS？
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;CQRS（Command Query Responsibility Segregation）&lt;/strong&gt; 即命令查询责任分离，是一种将读操作和写操作分离到不同模型中的架构模式。&lt;/p&gt;

&lt;p&gt;核心思想简单而清晰：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Command（命令）&lt;/strong&gt;：改变系统状态的写入操作（Create, Update, Delete）&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Query（查询）&lt;/strong&gt;：只读操作，不改变系统状态&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  CQRS的核心价值
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 性能优化
&lt;/h3&gt;

&lt;p&gt;传统架构中，读和写使用同一个数据模型，常常导致妥协。CQRS允许为读和写分别优化：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;写入模型可以专注于数据完整性和业务规则&lt;/li&gt;
&lt;li&gt;读取模型可以为查询性能进行专门优化（预计算、缓存、反范式化）&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. 可扩展性
&lt;/h3&gt;

&lt;p&gt;读写负载可以独立扩展。高读取场景可以加读副本，高写入场景可以加分片。&lt;/p&gt;

&lt;h3&gt;
  
  
  3. 灵活性
&lt;/h3&gt;

&lt;p&gt;不同的读取场景可以使用不同的数据表示：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;为管理后台构建详细的数据视图&lt;/li&gt;
&lt;li&gt;为移动端构建精简的JSON视图&lt;/li&gt;
&lt;li&gt;为分析场景构建聚合数据&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. 领域模型纯粹性
&lt;/h3&gt;

&lt;p&gt;命令端可以拥有纯净的领域模型，不需要为查询需求妥协。&lt;/p&gt;

&lt;h2&gt;
  
  
  CQRS的典型架构
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│   Client    │────▶│  Command    │────▶│   Event    │
│  (Commands  │     │   Handler  │     │    Store   │
│   &amp;amp; Queries)│     └─────────────┘     └─────┬─────┘
└─────────────┘           │                   │
                          │                   ▼
┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│   Read DB    │◀────│  Projector  │◀────│   Domain    │
│  (Optimized │     │ (实时同步)  │     │   Events    │
│   for reads)│     └─────────────┘     └─────────────┘
└─────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  实现示例
&lt;/h2&gt;

&lt;h3&gt;
  
  
  命令端（写入）
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CreateOrderCommand&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderCommandHandler&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# 1. 验证业务规则
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;validate_order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValidationError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;订单无效&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# 2. 创建聚合根
&lt;/span&gt;        &lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;generate_id&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pending&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# 3. 保存事件
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;event_store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;OrderCreatedEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  查询端（读取）
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderQueryHandler&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;read_db&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;read_db&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_order_summary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# 为特定场景优化的读取模型
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
            SELECT o.id, o.status, 
                   SUM(i.price * i.quantity) as total
            FROM orders o
            JOIN order_items i ON o.id = i.order_id
            WHERE o.id = ?
            GROUP BY o.id, o.status
        &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_customer_orders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# 为列表视图优化的读取模型
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
            SELECT id, status, created_at, total
            FROM order_summary
            WHERE customer_id = ?
            ORDER BY created_at DESC
            LIMIT 20
        &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  事件处理与同步
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderProjector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;read_db&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;read_db&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_order_created&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# 同步更新读取模型
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
            INSERT INTO order_summary 
            (id, customer_id, status, total, created_at)
            VALUES (?, ?, ?, ?, ?)
        &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
              &lt;span class="nf"&gt;calculate_total&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
              &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  CQRS的挑战
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 最终一致性
&lt;/h3&gt;

&lt;p&gt;命令端和读取端之间存在延迟，需要谨慎处理：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;对于需要强一致性的场景，使用Saga模式补偿&lt;/li&gt;
&lt;li&gt;对于用户体验，接受短暂的不一致并提供刷新机制&lt;/li&gt;
&lt;li&gt;使用乐观版本号让客户端检测并处理冲突&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. 复杂性增加
&lt;/h3&gt;

&lt;p&gt;引入CQRS增加了系统复杂度：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;何时使用&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;读写负载差异明显&lt;/li&gt;
&lt;li&gt;需要多个读取视图&lt;/li&gt;
&lt;li&gt;复杂的业务规则&lt;/li&gt;
&lt;li&gt;高性能需求场景&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;何时避免&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;简单的CRUD应用&lt;/li&gt;
&lt;li&gt;读写负载接近的场景&lt;/li&gt;
&lt;li&gt;团队对CQRS不熟悉&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. 事件排序保证
&lt;/h3&gt;

&lt;p&gt;需要确保事件的顺序性：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;使用事件存储确保原子性&lt;/li&gt;
&lt;li&gt;引入消息队列（如Kafka）保证顺序&lt;/li&gt;
&lt;li&gt;使用乐观并发控制处理乱序&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  CQRS的最佳实践
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 从简单开始
&lt;/h3&gt;

&lt;p&gt;不要一开始就FULL_CQRS，可以先从读写分离开始：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;第一步：数据库读写分离&lt;/li&gt;
&lt;li&gt;第二步：不同的读写服务&lt;/li&gt;
&lt;li&gt;第三步：引入事件源&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. 事件溯源（Event Sourcing）
&lt;/h3&gt;

&lt;p&gt;结合事件溯源可以获得完整的历史：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;完整的行为日志&lt;/li&gt;
&lt;li&gt;时间回溯能力&lt;/li&gt;
&lt;li&gt;审计日志自然形成&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. 渐进式采用
&lt;/h3&gt;

&lt;p&gt;可以在部分模块先尝试：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;新功能使用CQRS&lt;/li&gt;
&lt;li&gt;核心业务保持简单模型&lt;/li&gt;
&lt;li&gt;逐步迁移&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  结合其他模式
&lt;/h2&gt;

&lt;h3&gt;
  
  
  CQRS + ES（Event Sourcing）
&lt;/h3&gt;

&lt;p&gt;最强大的组合：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;命令产生事件&lt;/li&gt;
&lt;li&gt;事件存储在Event Store&lt;/li&gt;
&lt;li&gt;投影器生成各种读取模型&lt;/li&gt;
&lt;li&gt;支持完整的历史追溯&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  CQRS + Saga
&lt;/h3&gt;

&lt;p&gt;处理分布式事务：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;每个步骤都是本地事务&lt;/li&gt;
&lt;li&gt;通过补偿处理失败&lt;/li&gt;
&lt;li&gt;实现最终一致性&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  CQRS + DDD
&lt;/h3&gt;

&lt;p&gt;完美搭配：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Command Model = 聚合根&lt;/li&gt;
&lt;li&gt;Event = 领域事件&lt;/li&gt;
&lt;li&gt;Read Model = 专门化的DTO&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  实际应用案例
&lt;/h2&gt;

&lt;h3&gt;
  
  
  电商系统
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;写入&lt;/strong&gt;：订单创建、库存扣减&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;读取&lt;/strong&gt;：商品列表、订单详情、购物车、历史订单&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  社交网络
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;写入&lt;/strong&gt;：发布内容、点赞评论&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;读取&lt;/strong&gt;：信息流、个人主页、时间线&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  金融系统
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;写���&lt;/strong&gt;：转账交易&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;读取&lt;/strong&gt;：账户余额、交易历史、对账单&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  总结
&lt;/h2&gt;

&lt;p&gt;CQRS不仅仅是一种技术架构，更是一种思维方式。它教会我们：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;分离关注点&lt;/strong&gt;：读写是不同的，应该区别对待&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;优化而非妥协&lt;/strong&gt;：为每个场景选择最优方案&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;拥抱复杂性&lt;/strong&gt;：在需要的地方投资复杂度&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;正确的使用CQRS可以让系统获得惊人的性能和可扩展性，但错误的适用只会带来不必要的复杂性。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;记住：&lt;strong&gt;简单不是愚蠢，复杂也不是聪明。适合才是最好的。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;如果你觉得这篇文章有帮助，欢迎关注、点赞和转发！也欢迎在评论区分享你的CQRS使用经验。&lt;/p&gt;

&lt;h1&gt;
  
  
  架构 #CQRS #后端开发 #分布式系统 #设计模式
&lt;/h1&gt;

</description>
      <category>架构</category>
      <category>cqrs</category>
      <category>后端开发</category>
      <category>分布式系统</category>
    </item>
    <item>
      <title>事件驱动架构完全指南：构建响应式系统的基础</title>
      <dc:creator>架构师小白</dc:creator>
      <pubDate>Fri, 29 May 2026 01:03:19 +0000</pubDate>
      <link>https://dev.to/tianxin/shi-jian-qu-dong-jia-gou-wan-quan-zhi-nan-gou-jian-xiang-ying-shi-xi-tong-de-ji-chu-242e</link>
      <guid>https://dev.to/tianxin/shi-jian-qu-dong-jia-gou-wan-quan-zhi-nan-gou-jian-xiang-ying-shi-xi-tong-de-ji-chu-242e</guid>
      <description>&lt;h1&gt;
  
  
  事件驱动架构完全指南：构建响应式系统的基础
&lt;/h1&gt;

&lt;h2&gt;
  
  
  什么是事件驱动架构？
&lt;/h2&gt;

&lt;p&gt;事件驱动架构（Event-Driven Architecture, EDA）是一种软件架构范式，其中系统的核心交互围绕事件的产生、检测和响应展开。在这种架构中，组件之间通过发布和订阅事件进行松耦合通信，而非直接的方法调用。&lt;/p&gt;

&lt;h2&gt;
  
  
  核心概念
&lt;/h2&gt;

&lt;h3&gt;
  
  
  事件（Event）
&lt;/h3&gt;

&lt;p&gt;事件是系统中发生的某个动作或状态变化的记录。它包含相关的数据，通常是不可变的。一旦创建，事件就不应该被修改。&lt;/p&gt;

&lt;h3&gt;
  
  
  事件发布者（Producer/Publisher）
&lt;/h3&gt;

&lt;p&gt;发布事件的组件，它不关心谁会消费这些事件，只负责将事件发送到事件总线。&lt;/p&gt;

&lt;h3&gt;
  
  
  事件消费者（Consumer/Subscriber）
&lt;/h3&gt;

&lt;p&gt;订阅并处理事件的组件，对特定类型的事件做出响应。&lt;/p&gt;

&lt;h3&gt;
  
  
  事件总线（Event Bus/Broker）
&lt;/h3&gt;

&lt;p&gt;作为事件传输中介的组件，可以是简单的内存队列，也可以是Kafka、RabbitMQ等专业消息中间件。&lt;/p&gt;

&lt;h2&gt;
  
  
  为什么选择事件驱动架构？
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;松耦合&lt;/strong&gt;：发布者和订阅者不需要知道彼此的存在&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;可扩展性&lt;/strong&gt;：可以轻松添加新的订阅者而不影响现有系统&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;响应性&lt;/strong&gt;：系统能够实时响应事件&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;容错性&lt;/strong&gt;：事件可以被持久化，支持故障恢复&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;审计追踪&lt;/strong&gt;：完整的事件日志提供了良好的审计基础&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  常见的发布-订阅模式
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 发布-订阅模式（Pub-Sub）
&lt;/h3&gt;

&lt;p&gt;最经典的事件驱动模式。发布者将事件发布到主题，所有订阅该主题的消费者都会收到通知。&lt;/p&gt;

&lt;h3&gt;
  
  
  2. 事件溯源（Event Sourcing）
&lt;/h3&gt;

&lt;p&gt;将整个应用状态存储为一系列事件，而不是当前状态快照。这使得我们可以重建任意时间点的状态。&lt;/p&gt;

&lt;h3&gt;
  
  
  3. CQRS（命令查询职责分离）
&lt;/h3&gt;

&lt;p&gt;命令（写操作）和查询（读操作）使用不同的模型，优化各自的性能。&lt;/p&gt;

&lt;h2&gt;
  
  
  实现示例
&lt;/h2&gt;

&lt;p&gt;以下是使用Python实现的一个简单事件驱动系统：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EventBus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subscribers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;event_type&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subscribers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subscribers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;event_type&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subscribers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;event_type&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;event_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__class__&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;event_type&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subscribers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;handler&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subscribers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;event_type&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
                &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderCreatedEvent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;customer_email&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;order_id&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer_email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;customer_email&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# 使用示例
&lt;/span&gt;&lt;span class="n"&gt;event_bus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;EventBus&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;event_bus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OrderCreatedEvent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;send_confirmation_email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;event_bus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;OrderCreatedEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ORD-001&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user@example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  适用场景
&lt;/h2&gt;

&lt;p&gt;事件驱动架构特别适合：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;金融交易系统&lt;/li&gt;
&lt;li&gt;物联网数据收集&lt;/li&gt;
&lt;li&gt;实时分析流水线&lt;/li&gt;
&lt;li&gt;微服务间的异步通信&lt;/li&gt;
&lt;li&gt;用户行为追踪系统&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  挑战与注意事项
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;复杂性&lt;/strong&gt;：比同步调用更复杂，需要处理事件顺序和幂等性&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;调试困难&lt;/strong&gt;：事件流难以追踪和调试&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;一致性&lt;/strong&gt;：��终一致性可能导致短期的不一致状态&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;测试&lt;/strong&gt;：需要模拟事件流进行测试&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  总结
&lt;/h2&gt;

&lt;p&gt;事件驱动架构是构建现代可扩展系统的重要范式。它使系统更加灵活、松耦合，但也带来了额外的复杂性。在决定是否采用时，需要权衡团队能力和项目需求。对于需要高响应性、可扩展性的系统，事件驱动架构是一个优秀的选择。&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;推荐阅读&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;《企业集成模式》- Gregor Hohpe&lt;/li&gt;
&lt;li&gt;《Event-Driven Architecture》- Richard Monson-Haefel&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>architecture</category>
      <category>eventdriven</category>
      <category>systems</category>
      <category>programming</category>
    </item>
    <item>
      <title>整洁架构完全指南：构建可维护软件的精髓之道</title>
      <dc:creator>架构师小白</dc:creator>
      <pubDate>Thu, 28 May 2026 01:03:16 +0000</pubDate>
      <link>https://dev.to/tianxin/zheng-ji-jia-gou-wan-quan-zhi-nan-gou-jian-ke-wei-hu-ruan-jian-de-jing-sui-zhi-dao-3cnd</link>
      <guid>https://dev.to/tianxin/zheng-ji-jia-gou-wan-quan-zhi-nan-gou-jian-ke-wei-hu-ruan-jian-de-jing-sui-zhi-dao-3cnd</guid>
      <description>&lt;h1&gt;
  
  
  整洁架构完全指南：构建可维护软件的精髓之道
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;在软件开发中，我们常常陷入一个困境：代码随着项目增长而逐渐腐化，最终变得难以维护和测试。而整洁架构（Clean Architecture）正是来解决这个问题的核心理念。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🎯 什么是整洁架构？
&lt;/h2&gt;

&lt;p&gt;整洁架构是由Robert C. Martin（我们熟知的Uncle Bob）提出的一种软件架构设计原则。它的核心思想是：&lt;strong&gt;将软件系统分层，使每个层级的代码只依赖同层或更内层的代码&lt;/strong&gt;，从而实现松耦合、易测试、易维护的目标。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F1%2AmbLoxzXxn-1nNG9qbNAYxQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F1%2AmbLoxzXxn-1nNG9qbNAYxQ.png" alt="Clean Architecture Layers" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗️ 架构分层详解
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1️⃣ 实体层（Entities）
&lt;/h3&gt;

&lt;p&gt;最内核的层级，包含：&lt;strong&gt;业务规则、业务对象&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;与数据库无关&lt;/li&gt;
&lt;li&gt;与UI无关
&lt;/li&gt;
&lt;li&gt;与框架无关&lt;/li&gt;
&lt;li&gt;最稳定、最不易变
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Python 示例
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;is_valid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;@&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2️⃣ 用例层（Use Cases）
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;应用业务规则&lt;/strong&gt;，协调实体来实现系统功能&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;包含应用程序特定的业务规则&lt;/li&gt;
&lt;li&gt;控制数据流向&lt;/li&gt;
&lt;li&gt;实现系统用例（如"创建订单"、"注册用户"）
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RegisterUserUseCase&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;generate_id&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;user_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;user_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_valid&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValidationError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Invalid user data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_repository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3️⃣ 接口适配层（Interface Adapters）
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;转换数据&lt;/strong&gt;在用例和外部系统之间&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;将外部数据转换为用例能理解的格式&lt;/li&gt;
&lt;li&gt;将用例结果转换为外部能使用的格式&lt;/li&gt;
&lt;li&gt;包含：控制器、 presenters、仓储实现&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4️⃣ 框架与驱动层（Frameworks &amp;amp; Drivers）
&lt;/h3&gt;

&lt;p&gt;最外层，包含：&lt;strong&gt;具体实现细节&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Web框架（FastAPI、Django）&lt;/li&gt;
&lt;li&gt;数据库（PostgreSQL、MongoDB）&lt;/li&gt;
&lt;li&gt;REST/GraphQL接口&lt;/li&gt;
&lt;li&gt;外部服务调用&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 为什么选择整洁架构？
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;优势&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;可测试性&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;业务逻辑不依赖外部系统，可以单元测试&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;松耦合&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;内层与外层解耦，修改不影响核心&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;可维护&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;代码结构清晰，易于理解和修改&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;独立开发&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;各层可以并行开发，独立演进&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;技术替换&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;更换框架/数据库只需改外层&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🛠️ 实际项目中的落地
&lt;/h2&gt;

&lt;h3&gt;
  
  
  文件结构参考
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;project/
├── domain/           # 实体层
│   └── entities/
├── application/       # 用例层
│   ├── use_cases/
│   └── interfaces/
├── infrastructure/  # 接口适配+外层
│   ├── repositories/
│   ├── api/
│   │   └── routes.py
│   └── database/
└── main.py          # 入口
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Python + FastAPI 实践
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# infrastructure/api/routes.py
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Depends&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;application.use_cases.register_user&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;RegisterUserUseCase&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;domain.entities.user&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_use_case&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;RegisterUserUseCase&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;infrastructure.repositories.user_repo&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;UserRepository&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;RegisterUserUseCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;UserRepository&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/users&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;register_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;use_case&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;Depends&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get_use_case&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;use_case&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⚠️ 常见误区
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;过度工程&lt;/strong&gt;：小型项目不需要严格分层&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;教条主义&lt;/strong&gt;：灵活运用，因项目规模而异&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;忽视团队&lt;/strong&gt;：考虑团队熟悉度和项目周期&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;一层不落&lt;/strong&gt;：不是所有项目都需要完整的四层&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🚀 总结
&lt;/h2&gt;

&lt;p&gt;整洁架构不是银弹，但它提供了一套思考方式：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;让核心业务逻辑保持干净，让外部依赖可替换&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;无论你使用哪种具体实现，这种思维都能帮助写出更健壮、易维护的代码。从一个小模块开始尝试，逐步体会其价值吧！&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;推荐阅读&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;《代码整洁之道》- Robert C. Martin&lt;/li&gt;
&lt;li&gt;《架构整洁之道》- Robert C. Martin&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;如果你觉得有帮助，欢迎点赞评论收藏支持！&lt;/em&gt; 🙏&lt;/p&gt;




&lt;h1&gt;
  
  
  软件开发 #架构设计 #CleanArchitecture #后端开发 #Python
&lt;/h1&gt;

</description>
      <category>软件开发</category>
      <category>架构设计</category>
      <category>cleanarchitecture</category>
      <category>后端开发</category>
    </item>
    <item>
      <title>DAPR入门：云原生分布式应用开发实战</title>
      <dc:creator>架构师小白</dc:creator>
      <pubDate>Wed, 27 May 2026 01:05:34 +0000</pubDate>
      <link>https://dev.to/tianxin/daprru-men-yun-yuan-sheng-fen-bu-shi-ying-yong-kai-fa-shi-zhan-3d39</link>
      <guid>https://dev.to/tianxin/daprru-men-yun-yuan-sheng-fen-bu-shi-ying-yong-kai-fa-shi-zhan-3d39</guid>
      <description>&lt;h1&gt;
  
  
  DAPR入门：云原生分布式应用开发实战
&lt;/h1&gt;

&lt;h2&gt;
  
  
  什么是DAPR？
&lt;/h2&gt;

&lt;p&gt;DAPR（Distributed Application Runtime）是微软开源的分布式应用运行时，它为构建微服务提供了简化的编程模型。DAPR 的核心理念是：&lt;strong&gt;让开发者专注于业务逻辑，而不是底层基础设施&lt;/strong&gt;。&lt;/p&gt;




&lt;h2&gt;
  
  
  核心特性
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Sidecar 模式
&lt;/h3&gt;

&lt;p&gt;DAPR 以 sidecar 容器/进程的形式与应用共存，把分布式系统的复杂度从业务代码中抽离出来。&lt;/p&gt;

&lt;h3&gt;
  
  
  云原生优先
&lt;/h3&gt;

&lt;p&gt;天然支持 Kubernetes，配合容器的声明式部署。&lt;/p&gt;

&lt;h3&gt;
  
  
  多语言支持
&lt;/h3&gt;

&lt;p&gt;Go、Python、.NET、Java、Node.js 等主流语言都能接入。&lt;/p&gt;




&lt;h2&gt;
  
  
  DAPR 核心构建块
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 服务调用
&lt;/h3&gt;

&lt;p&gt;通过 Dapr，应用可以使用 HTTP 或 gRPC 调用其他服务，而无需关心服务发现。&lt;/p&gt;

&lt;h3&gt;
  
  
  2. 状态管理
&lt;/h3&gt;

&lt;p&gt;状态被抽象成了简单的键值对操作，Dapr 支持 Redis、Cosmos DB 等多种状态存储后端。&lt;/p&gt;

&lt;h3&gt;
  
  
  3. 发布/订阅
&lt;/h3&gt;

&lt;p&gt;事件驱动架构的实现被大幅简化了。&lt;/p&gt;

&lt;h3&gt;
  
  
  4. 可观测性
&lt;/h3&gt;

&lt;p&gt;Dapr 自动采集 Metrics、Logs、Traces，对接 Prometheus、Grafana 太轻松了。&lt;/p&gt;

&lt;h3&gt;
  
  
  5. 密钥管理
&lt;/h3&gt;

&lt;p&gt;集中管理敏感的 API Keys、连接字符串。&lt;/p&gt;

&lt;h3&gt;
  
  
  6. 限流与重试
&lt;/h3&gt;

&lt;p&gt;内置重试、Circuit Breaker，让系统更健壮。&lt;/p&gt;




&lt;h2&gt;
  
  
  为什么要关注DAPR？
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;降低微服务门槛&lt;/strong&gt; - 把服务发现、熔断等变成开箱即用的组件。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;真正的多语言能力&lt;/strong&gt; - 统一的分布式交互界面。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;云端边缘一体化&lt;/strong&gt; - 支持本地开发、IoT 设备、无服务器环境。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;开箱即用的可观测性&lt;/strong&gt; - Metrics、Traces、Logs 自动关联。&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  快速开始
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# macOS&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;dapr/tap/dapr

&lt;span class="c"&gt;# Linux&lt;/span&gt;
wget &lt;span class="nt"&gt;-q&lt;/span&gt; https://raw.githubusercontent.com/dapr/cli/master/install.sh | bash /bin/sh

&lt;span class="c"&gt;# 初始化&lt;/span&gt;
dapr init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  实践建议
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;场景&lt;/th&gt;
&lt;th&gt;推荐&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;新建云原生微服务&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;需要快速验证分布式想法&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;多语言微服务混合架构&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;已经成熟的单体应用搬迁&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;对延迟极度敏感&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  小结
&lt;/h2&gt;

&lt;p&gt;DAPR 为分布式应用提供了一套 &lt;strong&gt;声明式的抽象层&lt;/strong&gt;，代表了云原生架构演进的一个重要方向。如果你正在构建分布式系统，DAPR 值得关注。&lt;/p&gt;




&lt;p&gt;&lt;em&gt;本文基于 DAPR v1.14编写&lt;/em&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>microservices</category>
      <category>cloudnative</category>
      <category>dapr</category>
    </item>
    <item>
      <title>观察者模式深度指南：构建响应式事件系统的艺术</title>
      <dc:creator>架构师小白</dc:creator>
      <pubDate>Mon, 25 May 2026 01:03:50 +0000</pubDate>
      <link>https://dev.to/tianxin/guan-cha-zhe-mo-shi-shen-du-zhi-nan-gou-jian-xiang-ying-shi-shi-jian-xi-tong-de-yi-zhu-9li</link>
      <guid>https://dev.to/tianxin/guan-cha-zhe-mo-shi-shen-du-zhi-nan-gou-jian-xiang-ying-shi-shi-jian-xi-tong-de-yi-zhu-9li</guid>
      <description>&lt;h1&gt;
  
  
  观察者模式深度指南：构建响应式事件系统的艺术
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;在软件开发中，我们经常需要在对象之间建立一对多的依赖关系，当一个对象的状态发生变化时，所有依赖于它的对象都能自动得到通知。观察者模式正是解决这一问题的经典设计模式。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  为什么需要观察者模式？
&lt;/h2&gt;

&lt;p&gt;想象一下你在开发一个股票交易应用：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;用户订阅了某只股票的价格变动&lt;/li&gt;
&lt;li&gt;当价格变化时，系统需要通知所有订阅的用户&lt;/li&gt;
&lt;li&gt;有的用户用手机APP看，有的用网页，还有的可能需要邮件通知&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果不用观察者模式，你可能需要：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 糟糕的实现方式
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Stock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update_price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new_price&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# 每加一个通知渠道，就要修改这个类
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mobile_users&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;send_push_notification&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;web_users&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;update_web_ui&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email_users&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;send_email&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;这违反了&lt;strong&gt;开闭原则&lt;/strong&gt;——每增加一种通知方式，都要修改核心类。&lt;/p&gt;

&lt;h2&gt;
  
  
  观察者模式定义
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;观察者模式（Observer Pattern）&lt;/strong&gt; 是一种行为型设计模式，定义了一种一对多的依赖关系，让多个观察者对象同时监听某一个主题对象，当主题对象的状态发生变化时，会通知所有观察者对象，使它们能够自动更新自己。&lt;/p&gt;

&lt;h3&gt;
  
  
  核心角色
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────┐      ┌─────────────────┐
│    Subject      │◄────│    Observer     │
│  (被观察者)     │     │   (观察者)      │
├─────────────────┤     ├─────────────────┤
│ +attach()      │     │ +update()      │
│ +detach()      │     └─────────────────┘
│ +notify()      │            △
└─────────────────┘            │
       ▲                       │
       │ 1:N                  │ implements
       ▼                      │
┌─────────────────┐     ┌─────────────────┐
│ ConcreteSubject │────►│ConcreteObserver│
│ (具体主题)      │     │ (具体观察者)    │
├─────────────────┤     ├─────────────────┤
│ +getState()    │     │ +update()      │
│ +setState()    │     │ +display()    │
└─────────────────┘     └─────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  类图解释
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Subject（主题/被观察者）&lt;/strong&gt;：知道所有的观察者，提供attach和detach方法&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observer（观察者）&lt;/strong&gt;：为所有的观察者定义统一的更新接口&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ConcreteSubject&lt;/strong&gt;：维护真实状态，在状态改变时通知观察者&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ConcreteObserver&lt;/strong&gt;：实现Observer的更新接口&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Python 实现
&lt;/h2&gt;

&lt;h3&gt;
  
  
  基础版本
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;abc&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ABC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;abstractmethod&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;

&lt;span class="c1"&gt;# 观察者抽象基类
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Observer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ABC&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nd"&gt;@abstractmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="c1"&gt;# 具体观察者：邮件订阅者
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EmailObserver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Observer&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📧 发送给 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 具体观察者：短信订阅者  
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SMSObserver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Observer&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;phone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;phone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;phone&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📱 发送给 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;phone&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 具体观察者：APP推送
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AppPushObserver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Observer&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;device_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;device_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;device_id&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🔔 推送到设备 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;device_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 主题类
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_observers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Observer&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;attach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Observer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_observers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✅ 已添加观察者&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;detach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Observer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_observers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;❌ 已移除观察者&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;notify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;observer&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_observers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 股票价格主题
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;StockSubject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Subject&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_symbol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;symbol&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;

    &lt;span class="nd"&gt;@property&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_price&lt;/span&gt;

    &lt;span class="nd"&gt;@price.setter&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new_price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;old_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_price&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new_price&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;old_price&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;new_price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;notify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;股票 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_symbol&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; 价格从 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;old_price&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; 变更为 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;new_price&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 使用示例
&lt;/span&gt;&lt;span class="n"&gt;stock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StockSubject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;email_user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;EmailObserver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user@example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;sms_user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SMSObserver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;13800138000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;app_user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AppPushObserver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;device123&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;attach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email_user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;attach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sms_user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;attach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app_user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;=== 价格第一次变更 ===&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;150.0&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;=== 价格第二次变更 ===&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;155.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;运行结果：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✅ 已添加观察者
✅ 已添加观察者
✅ 已添加观察者

=== 价格第一次变更 ===
📧 发送给 user@example.com: 股票 AAPL 价格从 0.0 变更为 150.0
📱 发送给 13800138000: 股票 AAPL 价格从 0.0 变更为 150.0
🔔 推送到设备 device123: 股票 AAPL 价格从 0.0 变更为 150.0

=== 价格第二次变更 ===
📧 发送给 user@example.com: 股票 AAPL 价格从 150.0 变更为 155.0
📱 发送给 13800138000: 股票 AAPL 价格从 150.0 变更为 155.0
🔔 推送到设备 device123: 股票 AAPL 价格从 150.0 变更为 155.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  实际应用场景
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 微信公众号/博客订阅
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BlogSubscriber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Observer&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;articles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;article&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;articles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;article&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✍️ &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; 收到新文章: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;article&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Blog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Subject&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_articles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;article&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_articles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;article&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;notify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;article&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 使用
&lt;/span&gt;&lt;span class="n"&gt;blog&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Blog&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;attach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BlogSubscriber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;读者小明&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;attach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BlogSubscriber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;读者小红&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;深入理解Python装饰器&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;装饰器是Python最强大的特性之一...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. 事件总线（Event Bus）
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EventBus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;全局事件总线&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;_instance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__new__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_instance&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_instance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;__new__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_topics&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_instance&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;topic&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_topics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_topics&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_topics&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;topic&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_topics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;callback&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_topics&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
                &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 使用
&lt;/span&gt;&lt;span class="n"&gt;event_bus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;EventBus&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_user_registered&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;👋 欢迎新用户: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_user_registeredAnalytics&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📊 上报注册事件: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;event_bus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user.registered&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;handle_user_registered&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;event_bus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user.registered&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;handle_user_registeredAnalytics&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 触发事件
&lt;/span&gt;&lt;span class="n"&gt;event_bus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user.registered&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;张三&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;zhangsan@example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  观察者模式 vs 发布-订阅模式
&lt;/h2&gt;

&lt;p&gt;很多人把这两个概念混为一谈，但实际上有细微区别：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;特性&lt;/th&gt;
&lt;th&gt;观察者模式&lt;/th&gt;
&lt;th&gt;发布-订阅模式&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;耦合度&lt;/td&gt;
&lt;td&gt;Subject 和 Observer 直接通信&lt;/td&gt;
&lt;td&gt;通过消息队列解耦&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;通信方式&lt;/td&gt;
&lt;td&gt;同步调用&lt;/td&gt;
&lt;td&gt;通常异步&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;消息格式&lt;/td&gt;
&lt;td&gt;紧耦合&lt;/td&gt;
&lt;td&gt;解耦（通过消息格式化）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;典型实现&lt;/td&gt;
&lt;td&gt;Java Observable/Observable&lt;/td&gt;
&lt;td&gt;Kafka、RabbitMQ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  优点与缺点
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ 优点
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;开闭原则&lt;/strong&gt;：新增观察者无需修改主题代码&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;动态关系&lt;/strong&gt;：可以在运行时建立/解除观察关系&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;触发机制&lt;/strong&gt;：支持广播式通信&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;解耦&lt;/strong&gt;：主题和观察者之间是抽象耦合&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  ❌ 缺点
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;通知顺序&lt;/strong&gt;：如果观察者多，通知时间可能较长&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;循环依赖&lt;/strong&gt;：注意避免死循环&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;内存泄漏&lt;/strong&gt;：未及时detach可能导致问题&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  实际框架中的运用
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Django Signals
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django.db.models.signals&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;post_save&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django.dispatch&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;receiver&lt;/span&gt;

&lt;span class="nd"&gt;@receiver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post_save&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;user_created_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;created&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;created&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;send_welcome_email&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;create_default_profile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;track_registration_event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  JavaScript EventEmitter
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;EventEmitter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;events&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Stock&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;EventEmitter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;setPrice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newPrice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;oldPrice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;newPrice&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;oldPrice&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;newPrice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;priceChanged&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
        &lt;span class="nx"&gt;oldPrice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="nx"&gt;newPrice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;symbol&lt;/span&gt; 
      &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Stock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AAPL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;priceChanged&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;价格变动:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nx"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setPrice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  总结
&lt;/h2&gt;

&lt;p&gt;观察者模式是建筑响应式系统的基础：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;核心思想&lt;/strong&gt;：建立一对多的依赖关系&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;实现关键&lt;/strong&gt;：抽象Observer接口 + Subject管理&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;常见变体&lt;/strong&gt;：事件总线、信号系统&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;最佳实践&lt;/strong&gt;：确保及时detach，避免内存泄漏&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;掌握观察者模式，你就能轻松构建各种响应式、系统联动、事件驱动的应用！&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;下期预告&lt;/strong&gt;：我们将介绍与观察者模式互补的&lt;strong&gt;发布-订阅模式&lt;/strong&gt;，以及如何在大型系统中使用消息队列实现真正的解耦。&lt;/p&gt;

&lt;p&gt;如果你喜欢这篇文章，欢迎点赞、收藏、转发！关注后第一时间获取最新教程。&lt;/p&gt;

&lt;h1&gt;
  
  
  设计模式 #软件架构 #Python #后端开发
&lt;/h1&gt;

</description>
      <category>architecture</category>
      <category>python</category>
      <category>softwareengineering</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>策略模式深度指南：让算法策略自由切换的艺术</title>
      <dc:creator>架构师小白</dc:creator>
      <pubDate>Sun, 24 May 2026 01:03:11 +0000</pubDate>
      <link>https://dev.to/tianxin/ce-lue-mo-shi-shen-du-zhi-nan-rang-suan-fa-ce-lue-zi-you-qie-huan-de-yi-zhu-45dl</link>
      <guid>https://dev.to/tianxin/ce-lue-mo-shi-shen-du-zhi-nan-rang-suan-fa-ce-lue-zi-you-qie-huan-de-yi-zhu-45dl</guid>
      <description>&lt;h1&gt;
  
  
  策略模式深度指南：让算法策略自由切换的艺术
&lt;/h1&gt;

&lt;p&gt;在软件开发中，我们经常面临需要在运行时根据不同情况选择不同算法的场景。比如：电商系统针对不同用户提供不同的折扣计算方式；支付系统根据用户选择的支付渠道执行不同的支付逻辑；日志系统根据环境选择不同的日志输出方式。&lt;/p&gt;

&lt;p&gt;这些场景的共同特点是：需要在运行时动态选择算法，而不是在编译时固定。策略模式正是解决这类问题的利器。&lt;/p&gt;

&lt;h2&gt;
  
  
  什么是策略模式?
&lt;/h2&gt;

&lt;p&gt;策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户。&lt;/p&gt;

&lt;h3&gt;
  
  
  核心角色
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;策略接口(Strategy): 定义了所有具体策略的公共接口&lt;/li&gt;
&lt;li&gt;具体策略(Concrete Strategy): 实现具体的算法&lt;/li&gt;
&lt;li&gt;上下文(Context): 持有策略引用,负责调用具体算法&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  代码实现
&lt;/h2&gt;

&lt;p&gt;假设我们需要为一个电商系统实现多种折扣策略:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;abc&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ABC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;abstractmethod&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;

&lt;span class="c1"&gt;# 策略接口
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DiscountStrategy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ABC&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nd"&gt;@abstractmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;original_price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="c1"&gt;# 具体策略:无折扣
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NoDiscount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DiscountStrategy&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;original_price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;original_price&lt;/span&gt;

&lt;span class="c1"&gt;# 具体策略:固定金额折扣
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FixedAmountDiscount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DiscountStrategy&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;original_price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;original_price&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 具体策略:百分比折扣
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PercentageDiscount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DiscountStrategy&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;percentage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;percentage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;percentage&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;original_price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;original_price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;percentage&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 具体策略:阶梯折扣
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TieredDiscount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DiscountStrategy&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tiers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tiers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tiers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;original_price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;discount&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tiers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;original_price&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;original_price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;discount&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;original_price&lt;/span&gt;

&lt;span class="c1"&gt;# 上下文
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PriceCalculator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strategy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;DiscountStrategy&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strategy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;strategy&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;set_strategy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strategy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;DiscountStrategy&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strategy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;strategy&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calculate_price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;original_price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strategy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;original_price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 使用示例
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;calculator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;NoDiscount&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No discount: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;calculator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FixedAmountDiscount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Fixed discount: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;calculator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PercentageDiscount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Percentage discount: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;calculator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;TieredDiscount&lt;/span&gt;&lt;span class="p"&gt;([(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tiered discount 1000: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tiered discount 2500: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  策略模式的优缺点
&lt;/h2&gt;

&lt;h3&gt;
  
  
  优点
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;开闭原则: 新增策略不影响现有代码&lt;/li&gt;
&lt;li&gt;消除条件语句: 避免大量的 if-else 或 switch-case&lt;/li&gt;
&lt;li&gt;运行时切换: 可以在运行时灵活更换算法&lt;/li&gt;
&lt;li&gt;提高复用性: 相关算法可以重复使用&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  缺点
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;增加类数量: 每个策略都需要一个类&lt;/li&gt;
&lt;li&gt;客户端需了解策略差异: 需要知道各策略的区别&lt;/li&gt;
&lt;li&gt;增加复杂度: 对于简单场景可能过度设计&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  实际应用场景
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;支付方式选择: 支付宝、微信、银行卡等多种支付方式&lt;/li&gt;
&lt;li&gt;排序算法选择: 快速排序、归并排序、堆排序,根据数据特点选择&lt;/li&gt;
&lt;li&gt;验证规则: 不同业务场景使用不同的验证逻辑&lt;/li&gt;
&lt;li&gt;压缩算法: 根据文件类型选择 ZIP、GZIP、Bzip2 等&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  总结
&lt;/h2&gt;

&lt;p&gt;策略模式是一种强大的行为型设计模式,它将算法封装成独立的对象,使我们可以动态地选择和使用不同的算法。在面对需要多种算法或行为的场景时,考虑使用策略模式来提高代码的可维护性和灵活性。记住:封装变化是设计模式的核心思想,而策略模式正是这一思想的典型体现。&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>designpatterns</category>
      <category>python</category>
      <category>programming</category>
    </item>
    <item>
      <title>Rate Limiting Strategies Deep Dive</title>
      <dc:creator>架构师小白</dc:creator>
      <pubDate>Sat, 23 May 2026 01:07:18 +0000</pubDate>
      <link>https://dev.to/tianxin/rate-limiting-strategies-deep-dive-4e7l</link>
      <guid>https://dev.to/tianxin/rate-limiting-strategies-deep-dive-4e7l</guid>
      <description>&lt;p&gt;Rate limiting and failover strategies are essential for building resilient distributed systems. In high-traffic scenarios, services can face challenges like traffic spikes and downstream service failures. This article explores practical approaches to protect your systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  WHY RATE LIMITING IS IMPORTANT
&lt;/h2&gt;

&lt;p&gt;When traffic surge occurs unexpectedly, your system may experience cascading failures, resource exhaustion, and degraded user experience. Rate limiting acts as a first line of defense.&lt;/p&gt;




&lt;h2&gt;
  
  
  SLIDING WINDOW ALGORITHM
&lt;/h2&gt;

&lt;p&gt;One popular approach is the sliding window algorithm. Instead of fixed windows, we use smaller time slices to create smoother traffic patterns.&lt;/p&gt;




&lt;h2&gt;
  
  
  TOKEN BUCKET
&lt;/h2&gt;

&lt;p&gt;The token bucket allows burst traffic while maintaining an average rate. A bucket with fixed capacity gets tokens added at a constant rate, and each request consumes tokens.&lt;/p&gt;




&lt;h2&gt;
  
  
  CIRCUIT BREAKER
&lt;/h2&gt;

&lt;p&gt;The circuit breaker pattern prevents repeated calls to failing services. When failure rate exceeds threshold, the circuit opens and returns fallback responses.&lt;/p&gt;




&lt;h2&gt;
  
  
  BEST PRACTICES
&lt;/h2&gt;

&lt;p&gt;Implement layered rate limiting across gateway, application, and service layers. Prioritize critical requests. Provide graceful error messages. Monitor and alert on limiting events.&lt;/p&gt;

</description>
      <category>engineering</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>云原生架构深度指南：构建现代化应用的实践之道</title>
      <dc:creator>架构师小白</dc:creator>
      <pubDate>Fri, 22 May 2026 01:04:45 +0000</pubDate>
      <link>https://dev.to/tianxin/yun-yuan-sheng-jia-gou-shen-du-zhi-nan-gou-jian-xian-dai-hua-ying-yong-de-shi-jian-zhi-dao-pn3</link>
      <guid>https://dev.to/tianxin/yun-yuan-sheng-jia-gou-shen-du-zhi-nan-gou-jian-xian-dai-hua-ying-yong-de-shi-jian-zhi-dao-pn3</guid>
      <description>&lt;h1&gt;
  
  
  云原生架构深度指南：构建现代化应用的实践之道
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;云原生不仅仅是一种技术，更是一种思维方式。本文将带你深入理解云原生的核心理念，构建可扩展、可观测、弹性的现代化应用。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  什么是云原生？
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Cloud Native&lt;/strong&gt;（云原生）是一种构建和运行应用程序的方法论，充分利用云计算模型的优势。&lt;/p&gt;

&lt;h3&gt;
  
  
  核心定义
&lt;/h3&gt;

&lt;p&gt;云原生技术使组织能够在公有云、私有云和混合云等现代动态环境中构建和运行可弹性扩展的应用程序。其核心包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;容器化&lt;/strong&gt;：应用及其依赖被打包成轻量级容器&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;微服务&lt;/strong&gt;：独立部署的小型服务&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;声明式API&lt;/strong&gt;：描述期望状态而非步骤&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;不可变基础设施&lt;/strong&gt;：每次更新都重建而非修改&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  云原生关键技术
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 容器技术
&lt;/h3&gt;

&lt;p&gt;容器是云原生的基础单元。Docker 将应用及其运行时环境打包：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:20-alpine&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm ci &lt;span class="nt"&gt;--only&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "server.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Kubernetes (K8s)
&lt;/h3&gt;

&lt;p&gt;容器编排平台，实现：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;自动部署与回滚&lt;/li&gt;
&lt;li&gt;服务发现问题&lt;/li&gt;
&lt;li&gt;负载均衡&lt;/li&gt;
&lt;li&gt;自愈能力&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. 服务网格
&lt;/h3&gt;

&lt;p&gt;Istio 提供微服务间通信的可观测性与安全性：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mTLS 加密&lt;/li&gt;
&lt;li&gt;流量管理&lt;/li&gt;
&lt;li&gt;可观测性指标&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. 声明式基础设施
&lt;/h3&gt;

&lt;p&gt;Terraform 示例：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_ecs_cluster"&lt;/span&gt; &lt;span class="s2"&gt;"app_cluster"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"production-cluster"&lt;/span&gt;
  &lt;span class="nx"&gt;setting&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;name&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"containerInsights"&lt;/span&gt;
    &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"enabled"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  云原生架构原则
&lt;/h2&gt;

&lt;h3&gt;
  
  
  原则一：设计的可组合性
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;小型、独立的服务&lt;/li&gt;
&lt;li&gt;单一职责&lt;/li&gt;
&lt;li&gt;API 优先设计&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  原则二：弹性优先
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# K8s 健康检查示例&lt;/span&gt;
&lt;span class="na"&gt;livenessProbe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;httpGet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/healthz&lt;/span&gt;
    &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt;
  &lt;span class="na"&gt;initialDelaySeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt;
  &lt;span class="na"&gt;periodSeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
&lt;span class="na"&gt;readinessProbe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;httpGet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/ready&lt;/span&gt;
    &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt;
  &lt;span class="na"&gt;initialDelaySeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
  &lt;span class="na"&gt;periodSeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  原则三：可观测性
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;结构化日志&lt;/li&gt;
&lt;li&gt;分布式追踪（Jaeger）&lt;/li&gt;
&lt;li&gt;指标监控（Prometheus + Grafana）&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  原则四：自动化
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;CI/CD 流水线&lt;/li&gt;
&lt;li&gt;自动化测试&lt;/li&gt;
&lt;li&gt;基础设施即代码&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  云原生实践路径
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: 容器化现有应用
&lt;/h3&gt;

&lt;p&gt;从单体应用到容器：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;识别并提取独立模块&lt;/li&gt;
&lt;li&gt;定义健康检查端点&lt;/li&gt;
&lt;li&gt;配置资源限制&lt;/li&gt;
&lt;li&gt;实现 graceful shutdown&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 2: 迁移到 Kubernetes
&lt;/h3&gt;

&lt;p&gt;渐进式迁移策略：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;阶段一：Lift and Shift（直接迁移）&lt;/li&gt;
&lt;li&gt;阶段二：重构（容器优化）&lt;/li&gt;
&lt;li&gt;阶段三：重写（云原生设计）&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 3: 添加可观测性
&lt;/h3&gt;

&lt;p&gt;基础监控栈：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;日志：EFK Stack&lt;/li&gt;
&lt;li&gt;指标：Prometheus&lt;/li&gt;
&lt;li&gt;链路：Jaeger&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 4: 实施 DevOps
&lt;/h3&gt;

&lt;p&gt;云原生需要组织变革：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;小团队负责完整功能&lt;/li&gt;
&lt;li&gt;快速迭代能力&lt;/li&gt;
&lt;li&gt;自动化一切&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  何时采用云原生？
&lt;/h2&gt;

&lt;p&gt;✅ &lt;strong&gt;适合&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;需要快速扩展的应用&lt;/li&gt;
&lt;li&gt;面向用户的实时产品&lt;/li&gt;
&lt;li&gt;频繁更新的微服务&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;❌ &lt;strong&gt;不适合&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;传统单体应用&lt;/li&gt;
&lt;li&gt;缺乏云迁移预算&lt;/li&gt;
&lt;li&gt;团队缺乏 Kubernetes 经验&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  总结
&lt;/h2&gt;

&lt;p&gt;云原生架构不是银弹，它是：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;一种组织文化&lt;/li&gt;
&lt;li&gt;一套最佳实践&lt;/li&gt;
&lt;li&gt;持续改进的旅程&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;记住：云原生的核心不是「在云上运行」，而是「利用云的方式思维」。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;strong&gt;推荐资源&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CNCF Cloud Native Definition&lt;/li&gt;
&lt;li&gt;Kubernetes 官方文档&lt;/li&gt;
&lt;li&gt;《Cloud Native Infrastructure》&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;💬 你对云原生有什么疑问吗？在评论区告诉我！&lt;/p&gt;

&lt;h1&gt;
  
  
  云原生 #Kubernetes #DevOps
&lt;/h1&gt;

</description>
      <category>cloudnative</category>
      <category>kubernetes</category>
      <category>devops</category>
    </item>
    <item>
      <title>代理模式深度指南：构建控制访问的艺术</title>
      <dc:creator>架构师小白</dc:creator>
      <pubDate>Thu, 21 May 2026 01:05:24 +0000</pubDate>
      <link>https://dev.to/tianxin/dai-li-mo-shi-shen-du-zhi-nan-gou-jian-kong-zhi-fang-wen-de-yi-zhu-1pie</link>
      <guid>https://dev.to/tianxin/dai-li-mo-shi-shen-du-zhi-nan-gou-jian-kong-zhi-fang-wen-de-yi-zhu-1pie</guid>
      <description>&lt;h1&gt;
  
  
  代理模式深度指南：构建控制访问的艺术
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;在软件架构中，代理模式是一种结构型设计模式，它为另一个对象提供一个替代品或占位符，以控制对该对象的访问。本文将深入探讨代理模式的原理、实现方式和实战应用。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  为什么需要代理模式？
&lt;/h2&gt;

&lt;p&gt;想象一下，你需要访问一个远程服务。每次直接调用远程对象都会产生网络延迟。但如果你能在本地放置一个"替身"，让它处理一些常见请求，只有必要时才真正访问远程服务，性能将大幅提升。&lt;/p&gt;

&lt;p&gt;这就是代理模式的核心思想：&lt;strong&gt;用一个中介来控制对真实对象的访问&lt;/strong&gt;。&lt;/p&gt;

&lt;h2&gt;
  
  
  代理模式的组成
&lt;/h2&gt;

&lt;p&gt;代理模式包含四个核心角色：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Subject（抽象主题）&lt;/strong&gt;：定义了 RealSubject 和 Proxy 的公共接口&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RealSubject（真实主题）&lt;/strong&gt;：真正执行业务逻辑的对象&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proxy（代理）&lt;/strong&gt;：持有 RealSubject 的引用，在需要时创建真实对象&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client（客户端）&lt;/strong&gt;：通过 Proxy 访问真实对象&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  代理模式的类型
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 远程代理 (Remote Proxy)
&lt;/h3&gt;

&lt;p&gt;为远程对象在本地创建一个代理，隐藏网络访问细节。适用于需要调用分布式服务的场景。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;客户端 → 本地代理 → 网络 → 远程服务
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. 虚代理 (Virtual Proxy)
&lt;/h3&gt;

&lt;p&gt;延迟加载，只在真正需要时才创建开销大的对象。这就像网购时的"待发货"状态——先显示占位，等需要时才真正加载。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;VirtualProxy&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_real_image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;display&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# 首次调用时才加载真实图片
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_real_image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_real_image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;RealImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_real_image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;display&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. 保护代理 (Protection Proxy)
&lt;/h3&gt;

&lt;p&gt;控制对真实对象的访问权限，在调用前进行身份验证。这类似于公司门禁系统——检查访客是否有权限进入。&lt;/p&gt;

&lt;h3&gt;
  
  
  4. 智能引用代理 (Smart Reference Proxy)
&lt;/h3&gt;

&lt;p&gt;在访问对象时附加额外操作，比如：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;记录调用次数&lt;/li&gt;
&lt;li&gt;缓存计算结果&lt;/li&gt;
&lt;li&gt;懒加载关联对象&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. 缓存代理 (Cache Proxy)
&lt;/h3&gt;

&lt;p&gt;为重复访问的结果提供缓存，避免重复计算。这就像浏览器的缓存机制——首次加载后保存在本地，后续直接使用。&lt;/p&gt;

&lt;h2&gt;
  
  
  Python 实现示例
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;abc&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ABC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;abstractmethod&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="c1"&gt;# 抽象主题
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ABC&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nd"&gt;@abstractmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;display&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="c1"&gt;# 真实主题
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RealImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_load_from_disk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_load_from_disk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;正在加载图片: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 模拟加载时间
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;加载完成!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;display&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;显示图片: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 虚拟代理
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProxyImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_real_image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;display&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_real_image&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_real_image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;RealImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_real_image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;display&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# 使用示例
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;=== 第一次显示 ===&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ProxyImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;photo.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;display&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;=== 第二次显示 ===&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;display&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;运行结果：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=== 第一次显示 ===
正在加载图片: photo.jpg
加载完成!
显示图片: photo.jpg

=== 第二次显示 ===
显示图片: photo.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  代理模式 vs 装饰器模式
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;特性&lt;/th&gt;
&lt;th&gt;代理模式&lt;/th&gt;
&lt;th&gt;装饰器模式&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;目的&lt;/td&gt;
&lt;td&gt;控制访问&lt;/td&gt;
&lt;td&gt;动态添加功能&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;关系&lt;/td&gt;
&lt;td&gt;替代真实对象&lt;/td&gt;
&lt;td&gt;包装真实对象&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;创建时机&lt;/td&gt;
&lt;td&gt;预先创建&lt;/td&gt;
&lt;td&gt;运行时包装&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;客户端感知&lt;/td&gt;
&lt;td&gt;无缝替换&lt;/td&gt;
&lt;td&gt;功能增强&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  实际应用场景
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 数据库连接池
&lt;/h3&gt;

&lt;p&gt;连接池本身就是一种代理模式——预先创建一批连接，客户端从代理获取连接，用完归还，而不是每次都创建新连接。&lt;/p&gt;

&lt;h3&gt;
  
  
  2. API 限流
&lt;/h3&gt;

&lt;p&gt;在高并发系统中，使用代理实现 API 限流，保护后端服务：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RateLimitedProxy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;real_service&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_requests&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;time_window&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;real_service&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;real_service&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max_requests&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;max_requests&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;time_window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time_window&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;requests&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="c1"&gt;# 清理过期请求记录
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;requests&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;requests&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;time_window&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max_requests&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;请求过于频繁，请稍后再试&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;real_service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. 考试系统防作弊
&lt;/h3&gt;

&lt;p&gt;在在线考试系统中，代理可以：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;检测切屏次数&lt;/li&gt;
&lt;li&gt;限制复制粘贴&lt;/li&gt;
&lt;li&gt;记录异常行为&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. 微服务健康检查
&lt;/h3&gt;

&lt;p&gt;代理可以监控下游服务状态，在服务不可用时返回缓存数据或降级响应。&lt;/p&gt;

&lt;h2&gt;
  
  
  总结
&lt;/h2&gt;

&lt;p&gt;代理模式是一种强大的架构工具，它的核心价值在于：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;解耦&lt;/strong&gt; - 将访问逻辑与业务逻辑分离&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;增强&lt;/strong&gt; - 可以无感地添加日志、缓存、限流等功能&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;控制&lt;/strong&gt; - 实现访问控制、权限验证&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;优化&lt;/strong&gt; - 通过懒加载和缓存提升性能&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;掌握代理模式，让你在设计系统时多一件利器！&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;下篇预告&lt;/strong&gt;：策略模式 (Strategy Pattern) - 让算法 interchangeable 的艺术&lt;/p&gt;

&lt;p&gt;如果你对这个系列感兴趣，欢迎关注并留言讨论你想了解的设计模式！&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;提示&lt;/strong&gt;：合理使用代理模式可以显著提升系统性能和安全性，但切记不要过度设计。只有当真正需要控制访问时，才考虑使用代理。&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>architecture</category>
      <category>designpatterns</category>
      <category>python</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
