<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>架构 on PlumePHP</title><link>https://plumephp.com/categories/%E6%9E%B6%E6%9E%84/</link><description>Recent content in 架构 on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Thu, 13 Aug 2026 02:00:00 +0800</lastBuildDate><atom:link href="https://plumephp.com/categories/%E6%9E%B6%E6%9E%84/index.xml" rel="self" type="application/rss+xml"/><item><title>架构评审与技术债管理</title><link>https://plumephp.com/architecture-review-tech-debt/</link><pubDate>Thu, 13 Aug 2026 02:00:00 +0800</pubDate><guid>https://plumephp.com/architecture-review-tech-debt/</guid><description>&lt;h1 id="架构评审与技术债管理"&gt;架构评审与技术债管理&lt;/h1&gt;
&lt;p&gt;架构不是一次性的设计，而是持续演进的过程。架构评审与技术债管理是保障系统长期健康的关键实践。&lt;/p&gt;
&lt;h2 id="1-架构评审方法"&gt;1. 架构评审方法&lt;/h2&gt;
&lt;h3 id="atamarchitecture-tradeoff-analysis-method"&gt;ATAM（Architecture Tradeoff Analysis Method）&lt;/h3&gt;
&lt;p&gt;卡内基梅隆大学提出的结构化评审方法：&lt;/p&gt;</description></item><item><title>SLA/SLO/SLI 与容量规划</title><link>https://plumephp.com/architecture-sla-slo-capacity/</link><pubDate>Thu, 13 Aug 2026 01:55:00 +0800</pubDate><guid>https://plumephp.com/architecture-sla-slo-capacity/</guid><description>&lt;h1 id="slaslosli-与容量规划"&gt;SLA/SLO/SLI 与容量规划&lt;/h1&gt;
&lt;p&gt;SRE 的核心是量化可靠性。SLA/SLO/SLI 定义了&amp;quot;多可靠算足够可靠&amp;quot;，容量规划确保资源满足这些目标。&lt;/p&gt;
&lt;h2 id="1-定义区分"&gt;1. 定义区分&lt;/h2&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;th&gt;示例&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;SLI&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Service Level Indicator&lt;/td&gt;
					&lt;td&gt;服务质量指标&lt;/td&gt;
					&lt;td&gt;请求延迟 P99 &amp;lt; 200ms&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;SLO&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Service Level Objective&lt;/td&gt;
					&lt;td&gt;目标值&lt;/td&gt;
					&lt;td&gt;99.9% 的请求延迟 &amp;lt; 200ms&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;SLA&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Service Level Agreement&lt;/td&gt;
					&lt;td&gt;服务等级协议（对外承诺）&lt;/td&gt;
					&lt;td&gt;可用性 &amp;lt; 99.9% 退款 10%&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;SLI: 测量什么
↓
SLO: 目标值多少
↓
SLA: 达不到的后果（法务/商务）
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="2-sli-选择"&gt;2. SLI 选择&lt;/h2&gt;
&lt;p&gt;Google SRE Book 推荐的 SLI 类型：&lt;/p&gt;</description></item><item><title>云原生架构模式</title><link>https://plumephp.com/architecture-cloud-native-patterns/</link><pubDate>Thu, 13 Aug 2026 01:50:00 +0800</pubDate><guid>https://plumephp.com/architecture-cloud-native-patterns/</guid><description>&lt;h1 id="云原生架构模式"&gt;云原生架构模式&lt;/h1&gt;
&lt;p&gt;云原生（Cloud Native）是一套技术体系与方法论，旨在充分利用云计算的弹性、分布式与自动化能力。Sidecar、Service Mesh、Serverless、GitOps 是其核心模式。&lt;/p&gt;</description></item><item><title>CQRS 与事件溯源</title><link>https://plumephp.com/architecture-cqrs-event-sourcing/</link><pubDate>Thu, 13 Aug 2026 01:45:00 +0800</pubDate><guid>https://plumephp.com/architecture-cqrs-event-sourcing/</guid><description>&lt;h1 id="cqrs-与事件溯源"&gt;CQRS 与事件溯源&lt;/h1&gt;
&lt;p&gt;CQRS（Command Query Responsibility Segregation）将读写操作分离，事件溯源以事件序列替代状态快照。两者常结合使用，解决高并发读写冲突。&lt;/p&gt;</description></item><item><title>消息驱动架构（EDA）</title><link>https://plumephp.com/architecture-event-driven/</link><pubDate>Thu, 13 Aug 2026 01:40:00 +0800</pubDate><guid>https://plumephp.com/architecture-event-driven/</guid><description>&lt;h1 id="消息驱动架构eda"&gt;消息驱动架构（EDA）&lt;/h1&gt;
&lt;p&gt;事件驱动架构（Event-Driven Architecture）通过事件的发布与订阅实现服务解耦，是微服务异步协作的核心模式。&lt;/p&gt;
&lt;h2 id="1-核心模式"&gt;1. 核心模式&lt;/h2&gt;
&lt;h3 id="事件通知"&gt;事件通知&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Service A ──(Event)──→ Event Bus ──(Fan-out)──→ Service B
 ──→ Service C
 ──→ Service D

A 不感知 B/C/D，仅声明&amp;#34;发生了什么&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="事件驱动状态转移event-carried-state-transfer"&gt;事件驱动状态转移（Event-Carried State Transfer）&lt;/h3&gt;
&lt;p&gt;事件携带完整状态数据，消费者无需回查生产者。&lt;/p&gt;</description></item><item><title>分布式链路追踪</title><link>https://plumephp.com/architecture-distributed-tracing/</link><pubDate>Thu, 13 Aug 2026 01:35:00 +0800</pubDate><guid>https://plumephp.com/architecture-distributed-tracing/</guid><description>&lt;h1 id="分布式链路追踪"&gt;分布式链路追踪&lt;/h1&gt;
&lt;p&gt;在微服务调用链中，一次请求可能涉及数十个服务。分布式链路追踪记录了请求的完整路径，让&amp;quot;慢在哪里&amp;quot;一目了然。&lt;/p&gt;
&lt;h2 id="1-核心概念"&gt;1. 核心概念&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Trace：一次完整请求
 └── Span A (Gateway) [0ms ───── 5ms]
 └── Span B (Order) [2ms ───── 15ms]
 ├── Span C (DB) [3ms ─ 8ms]
 └── Span D (Stock)[10ms ─ 14ms]
 └── Span E (RPC)[11ms ─ 13ms]
&lt;/code&gt;&lt;/pre&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;Trace&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;一次端到端请求的完整链路，由唯一 TraceID 标识&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Span&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;链路中的一个操作单元，包含起止时间、标签、日志&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;SpanContext&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;跨进程传递的上下文（TraceID + SpanID + flags）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Baggage&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;随链路传播的自定义键值对&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="2-数据模型opentelemetry"&gt;2. 数据模型（OpenTelemetry）&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Span:
 - trace_id: 16 bytes
 - span_id: 8 bytes 
 - parent_span_id: 8 bytes (根 Span 为空)
 - name: &amp;#34;GET /api/orders&amp;#34;
 - kind: SERVER / CLIENT / PRODUCER / CONSUMER / INTERNAL
 - start_time, end_time
 - attributes: { &amp;#34;http.method&amp;#34;: &amp;#34;GET&amp;#34;, &amp;#34;http.status_code&amp;#34;: 200 }
 - events: [ { timestamp, name, attributes } ]
 - status: UNSET / OK / ERROR
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="3-traceid-透传机制"&gt;3. TraceID 透传机制&lt;/h2&gt;
&lt;h3 id="http-header-传递"&gt;HTTP Header 传递&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;请求入站:
 traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
 
 格式: {version}-{trace-id}-{parent-id}-{trace-flags}
 		 00 4bf9...4736 00f0...02b7 01
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="代码示例opentelemetry-java"&gt;代码示例（OpenTelemetry Java）&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 自动埋点（Spring Boot）&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;implementation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;opentelemetry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;opentelemetry&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;spring&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;boot&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;starter&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 手动创建 Span&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Tracer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tracer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;openTelemetry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getTracer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;order-service&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Span&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;span&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tracer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;spanBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;processOrder&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setSpanKind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SpanKind&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SERVER&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;startSpan&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Scope&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;makeCurrent&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;order.id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;orderId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;user.id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 业务逻辑...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;validation.completed&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;recordException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setStatus&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="na"&gt;ERROR&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;throw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;end&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="跨进程传播"&gt;跨进程传播&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 服务端提取上下文&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;extracted&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;propagator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;extract&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="na"&gt;current&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;getter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 客户端注入上下文&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;propagator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;inject&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="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;requestBuilder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;setter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="4-采集与存储"&gt;4. 采集与存储&lt;/h2&gt;
&lt;h3 id="架构"&gt;架构&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Application → SDK/Agent → Collector → Backend → UI
 (OTLP) (Jaeger/Tempo)
 
 ┌─────────────────────┐
 │ OpenTelemetry │
 │ Collector │
 │ receivers → processors → exporters
 └─────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="采样策略"&gt;采样策略&lt;/h3&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;strong&gt;头部采样&lt;/strong&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;strong&gt;尾部采样&lt;/strong&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;strong&gt;概率采样&lt;/strong&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;strong&gt;限速采样&lt;/strong&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 class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Collector 尾部采样配置&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;tail_sampling&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;policies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;errors&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;status_code&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;status_code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;status_codes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;ERROR] }&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;slow&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;latency&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;latency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;threshold_ms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;}&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="5-jaeger-实战"&gt;5. Jaeger 实战&lt;/h2&gt;
&lt;h3 id="部署"&gt;部署&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Docker Compose 示例&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;jaeger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;jaegertracing/all-in-one:latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;16686:16686&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# UI&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;14268:14268&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Collector HTTP&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;COLLECTOR_OTLP_ENABLED&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="查询分析"&gt;查询分析&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Jaeger UI 功能：
- Search：按服务、标签、时间范围检索 Trace
- Compare：对比两次请求的链路差异
- Dependencies：服务依赖拓扑图
- Trace View：瀑布图展示 Span 时序
- Critical Path：识别最长路径
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="与-prometheusgrafana-联动"&gt;与 Prometheus/Grafana 联动&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Grafana 数据源配置&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Jaeger&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;jaeger&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;http://jaeger-query:16686&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 在 Grafana 中关联 Metrics → Traces&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 点击延迟峰值直接跳转到对应 Trace&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="6-长尾延迟分析"&gt;6. 长尾延迟分析&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;P99 延迟高 ≠ 所有请求都慢。分析长尾请求：

1. 按 Trace 中最大 Span 耗时排序
2. 识别 Critical Path 上的瓶颈
3. 对比正常 vs 异常 Trace 的差异
4. 常见根因：
 - 某实例 GC STW 过长
 - 数据库慢查询
 - 下游服务超时重试
 - 网络抖动
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="7-最佳实践"&gt;7. 最佳实践&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;命名规范&lt;/strong&gt;：Span name 格式统一 &lt;code&gt;操作方法&lt;/code&gt;，如 &lt;code&gt;SELECT orders&lt;/code&gt; 或 &lt;code&gt;GET /api/orders&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;属性标准化&lt;/strong&gt;：遵循 OpenTelemetry Semantic Conventions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;避免过度追踪&lt;/strong&gt;：高并发服务使用采样，防止采集压垮系统&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关联日志&lt;/strong&gt;：TraceID 写入日志，实现日志与追踪联动&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;业务标签&lt;/strong&gt;：在 Span 中记录业务关键标识（订单ID、用户ID）&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&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;OpenTelemetry&lt;/td&gt;
					&lt;td&gt;标准协议 + 多语言 SDK&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Collector&lt;/td&gt;
					&lt;td&gt;数据采集、处理、导出&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Jaeger/Tempo&lt;/td&gt;
					&lt;td&gt;存储与查询后端&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Grafana&lt;/td&gt;
					&lt;td&gt;统一可视化&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;链路追踪让分布式系统的&amp;quot;黑盒&amp;quot;变透明，是定位性能瓶颈和故障的根本手段。&lt;/p&gt;</description></item><item><title>熔断、降级与限流</title><link>https://plumephp.com/architecture-circuit-breaker-rate-limit/</link><pubDate>Thu, 13 Aug 2026 01:30:00 +0800</pubDate><guid>https://plumephp.com/architecture-circuit-breaker-rate-limit/</guid><description>&lt;h1 id="熔断降级与限流"&gt;熔断、降级与限流&lt;/h1&gt;
&lt;p&gt;微服务调用链中，单点故障可能引发级联雪崩。熔断、降级、限流是保障系统稳定性的三道防线。&lt;/p&gt;
&lt;h2 id="1-熔断器circuit-breaker"&gt;1. 熔断器（Circuit Breaker）&lt;/h2&gt;
&lt;h3 id="状态机"&gt;状态机&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; ┌─────────┐ 失败率&amp;gt;阈值 ┌─────────┐
 │ CLOSED │──────────────→│ OPEN │
 │ (正常) │ │ (熔断) │
 └────┬────┘ └────┬────┘
 │ │
 失败计数恢复 │ 超时后
 │ ↓
 │ ┌─────────────┐
 └─────────────────│ HALF-OPEN │
 探测失败 │ (半开/探测) │
 └─────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="参数配置"&gt;参数配置&lt;/h3&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;failureThreshold&lt;/td&gt;
					&lt;td&gt;触发熔断的失败次数/比例&lt;/td&gt;
					&lt;td&gt;5 次或 50%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;slowCallThreshold&lt;/td&gt;
					&lt;td&gt;触发熔断的慢调用比例&lt;/td&gt;
					&lt;td&gt;80%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;waitDurationInOpenState&lt;/td&gt;
					&lt;td&gt;OPEN 持续时间&lt;/td&gt;
					&lt;td&gt;30s&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;permittedNumberOfCallsInHalfOpenState&lt;/td&gt;
					&lt;td&gt;半开探测次数&lt;/td&gt;
					&lt;td&gt;3&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="resilience4j-示例"&gt;Resilience4j 示例&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;CircuitBreakerConfig&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CircuitBreakerConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;custom&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;failureRateThreshold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;waitDurationInOpenState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ofSeconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;30&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;permittedNumberOfCallsInHalfOpenState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;slidingWindowSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;CircuitBreaker&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cb&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CircuitBreaker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;orderService&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 装饰调用&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Supplier&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;decorated&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CircuitBreaker&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;decorateSupplier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;orderClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Try&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ofSupplier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decorated&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;recover&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;throwable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;fallback_order&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2-降级degrade"&gt;2. 降级（Degrade）&lt;/h2&gt;
&lt;p&gt;当服务不可用或响应过慢时，提供简化替代方案。&lt;/p&gt;</description></item><item><title>分布式配置中心</title><link>https://plumephp.com/architecture-distributed-config/</link><pubDate>Thu, 13 Aug 2026 01:25:00 +0800</pubDate><guid>https://plumephp.com/architecture-distributed-config/</guid><description>&lt;h1 id="分布式配置中心"&gt;分布式配置中心&lt;/h1&gt;
&lt;p&gt;在微服务架构中，管理数十乃至上百个服务的配置是一项挑战。配置中心统一管控配置，支持动态更新与灰度发布。&lt;/p&gt;
&lt;h2 id="1-为什么需要配置中心"&gt;1. 为什么需要配置中心&lt;/h2&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;h2 id="2-核心能力对比"&gt;2. 核心能力对比&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;能力&lt;/th&gt;
					&lt;th&gt;Spring Config&lt;/th&gt;
					&lt;th&gt;Nacos&lt;/th&gt;
					&lt;th&gt;Apollo&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;配置推送&lt;/td&gt;
					&lt;td&gt;依赖 Bus/Webhook&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;td&gt;完善（灰度规则）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;版本管理&lt;/td&gt;
					&lt;td&gt;Git 版本&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;td&gt;细粒度 RBAC&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;多集群&lt;/td&gt;
					&lt;td&gt;Profile&lt;/td&gt;
					&lt;td&gt;Namespace&lt;/td&gt;
					&lt;td&gt;Cluster + Namespace&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;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;td&gt;语法校验&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="3-apollo-详解"&gt;3. Apollo 详解&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;携程开源，功能最完善的配置中心。&lt;/p&gt;</description></item><item><title>服务注册发现与负载均衡</title><link>https://plumephp.com/architecture-service-discovery/</link><pubDate>Thu, 13 Aug 2026 01:20:00 +0800</pubDate><guid>https://plumephp.com/architecture-service-discovery/</guid><description>&lt;h1 id="服务注册发现与负载均衡"&gt;服务注册发现与负载均衡&lt;/h1&gt;
&lt;p&gt;在微服务架构中，服务实例动态扩缩容，客户端无法硬编码地址。注册中心与负载均衡解决了&amp;quot;如何找到服务&amp;quot;和&amp;quot;如何分配流量&amp;quot;的核心问题。&lt;/p&gt;</description></item><item><title>API 网关与 BFF 架构</title><link>https://plumephp.com/architecture-api-gateway-bff/</link><pubDate>Thu, 13 Aug 2026 01:15:00 +0800</pubDate><guid>https://plumephp.com/architecture-api-gateway-bff/</guid><description>&lt;h1 id="api-网关与-bff-架构"&gt;API 网关与 BFF 架构&lt;/h1&gt;
&lt;p&gt;网关是微服务架构的流量入口，BFF 是适配多端体验的专用层。两者结合实现灵活的前后端协作。&lt;/p&gt;
&lt;h2 id="1-api-网关核心职责"&gt;1. API 网关核心职责&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; Client
 ↓
 ┌───────────────┐
 │ API Gateway │ ← 流量入口
 └───────────────┘
 │
 ┌───────────────┼───────────────┐
 ↓ ↓ ↓
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Order │ │ Payment │ │ User │
│ Service │ │ Service │ │ Service │
└──────────┘ └──────────┘ └──────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="功能矩阵"&gt;功能矩阵&lt;/h3&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;按路径/Host/Header 转发到后端服务&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;负载均衡&lt;/td&gt;
					&lt;td&gt;多种 LB 算法：Round Robin、Least Conn&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;认证授权&lt;/td&gt;
					&lt;td&gt;JWT 校验、OAuth 集成、RBAC&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;HTTP ↔ gRPC、REST ↔ GraphQL&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;按用户比例/Header 路由&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="2-网关选型"&gt;2. 网关选型&lt;/h2&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;strong&gt;Nginx/OpenResty&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;高性能、Lua 扩展&lt;/td&gt;
					&lt;td&gt;简单路由、高并发入口&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Kong&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;插件丰富、企业级&lt;/td&gt;
					&lt;td&gt;全功能 API 管理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Apinto&lt;/strong&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;strong&gt;Spring Cloud Gateway&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Java 生态、Spring 集成&lt;/td&gt;
					&lt;td&gt;Spring 体系微服务&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Envoy&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;云原生、Service Mesh&lt;/td&gt;
					&lt;td&gt;K8s + Istio 场景&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Traefik&lt;/strong&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;h2 id="3-bff-模式"&gt;3. BFF 模式&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Backend for Frontend：为不同客户端提供定制化的 API。&lt;/p&gt;</description></item><item><title>领域驱动设计（DDD）</title><link>https://plumephp.com/architecture-domain-driven-design/</link><pubDate>Thu, 13 Aug 2026 01:10:00 +0800</pubDate><guid>https://plumephp.com/architecture-domain-driven-design/</guid><description>&lt;h1 id="领域驱动设计ddd"&gt;领域驱动设计（DDD）&lt;/h1&gt;
&lt;p&gt;DDD 是一种以业务领域为核心的软件设计方法，通过统一语言连接业务与技术，解决复杂业务系统的建模难题。&lt;/p&gt;
&lt;h2 id="1-ddd-核心思想"&gt;1. DDD 核心思想&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌────────────────────────────────┐
│ 统一语言 Ubiquitous │
│ Language │
└────────────────────────────────┘
 ↓ ↑
┌────────────────────────────────┐
│ 领域模型 Domain Model │
│ ┌─────┐ ┌─────┐ ┌────────┐ │
│ │实体 │ │值对象│ │ 聚合 │ │
│ └─────┘ └─────┘ └────────┘ │
└────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;核心&lt;/strong&gt;：技术与业务使用同一套语言进行沟通，模型直接反映业务概念。&lt;/p&gt;</description></item><item><title>单体应用 vs 微服务</title><link>https://plumephp.com/architecture-monolith-microservices/</link><pubDate>Thu, 13 Aug 2026 01:05:00 +0800</pubDate><guid>https://plumephp.com/architecture-monolith-microservices/</guid><description>&lt;h1 id="单体应用-vs-微服务"&gt;单体应用 vs 微服务&lt;/h1&gt;
&lt;p&gt;单体还是微服务？这不是非此即彼的选择，而是演进过程中的阶段性决策。&lt;/p&gt;
&lt;h2 id="1-单体架构"&gt;1. 单体架构&lt;/h2&gt;
&lt;p&gt;所有功能模块打包为单个应用，共享代码库与数据库。&lt;/p&gt;
&lt;h3 id="类型演进"&gt;类型演进&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;简单单体 → 模块化单体 → 分布式单体（伪微服务）
 ↑ ↑ ↑
 起步阶段 团队扩大 反模式
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="单体优势"&gt;单体优势&lt;/h3&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;单个 artifact，一键部署&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;单数据库天然支持 ACID&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="单体痛点"&gt;单体痛点&lt;/h3&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 id="模块化单体"&gt;模块化单体&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;渐进式改良&lt;/strong&gt;：在单体内部划分清晰模块，为未来拆分做准备。&lt;/p&gt;</description></item><item><title>架构设计基础原则</title><link>https://plumephp.com/architecture-design-principles/</link><pubDate>Thu, 13 Aug 2026 01:00:00 +0800</pubDate><guid>https://plumephp.com/architecture-design-principles/</guid><description>&lt;h1 id="架构设计基础原则"&gt;架构设计基础原则&lt;/h1&gt;
&lt;p&gt;架构设计不是凭空创造，而是在约束与目标之间寻找最优解。掌握基础原则是做出正确决策的前提。&lt;/p&gt;
&lt;h2 id="1-solid-原则"&gt;1. SOLID 原则&lt;/h2&gt;
&lt;h3 id="单一职责原则srp"&gt;单一职责原则（SRP）&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;一个类只应该有一个引起它变化的原因。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 反例：UserService 同时处理用户管理与邮件发送&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserService&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;sendEmail&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 职责混杂&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 正例：分离职责&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserService&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EmailService&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;sendEmail&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="开闭原则ocp"&gt;开闭原则（OCP）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;对扩展开放，对修改关闭。&lt;/strong&gt; 通过抽象和多态实现。&lt;/p&gt;</description></item><item><title>系统架构设计</title><link>https://plumephp.com/posts/architecture/</link><pubDate>Thu, 13 Aug 2026 00:00:00 +0800</pubDate><guid>https://plumephp.com/posts/architecture/</guid><description>&lt;h1 id="系统架构设计"&gt;系统架构设计&lt;/h1&gt;
&lt;p&gt;本专题从架构设计基础原则出发，深入讲解单体到微服务的演进、领域驱动设计（DDD）、云原生架构模式、服务治理、容量规划与架构评审等核心主题，帮助你建立完整的系统架构设计知识体系。&lt;/p&gt;</description></item></channel></rss>