-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
332 lines (153 loc) · 157 KB
/
search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>使用TypeScript提升JavaScript代码质量</title>
<link href="/2025/03/23/article10/"/>
<url>/2025/03/23/article10/</url>
<content type="html"><![CDATA[<h1 id="使用TypeScript提升JavaScript代码质量"><a href="#使用TypeScript提升JavaScript代码质量" class="headerlink" title="使用TypeScript提升JavaScript代码质量"></a>使用TypeScript提升JavaScript代码质量</h1><h2 id="什么是TypeScript?"><a href="#什么是TypeScript?" class="headerlink" title="什么是TypeScript?"></a>什么是TypeScript?</h2><p>TypeScript是JavaScript的超集,增加了静态类型和其他特性,使得代码更健壮和可维护。</p><h2 id="安装TypeScript"><a href="#安装TypeScript" class="headerlink" title="安装TypeScript"></a>安装TypeScript</h2><p>使用npm安装TypeScript:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install -g typescript</span><br></pre></td></tr></table></figure><h2 id="基本语法"><a href="#基本语法" class="headerlink" title="基本语法"></a>基本语法</h2><p>以下是一个简单的TypeScript示例:</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">greeter</span>(<span class="params"><span class="attr">person</span>: <span class="built_in">string</span></span>) {</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"Hello, "</span> + person;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">let</span> user = <span class="string">"Jane User"</span>;</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="title function_">greeter</span>(user));</span><br></pre></td></tr></table></figure><h2 id="类型注解"><a href="#类型注解" class="headerlink" title="类型注解"></a>类型注解</h2><p>TypeScript允许你为变量和函数添加类型注解:</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> <span class="attr">isDone</span>: <span class="built_in">boolean</span> = <span class="literal">false</span>;</span><br><span class="line"><span class="keyword">let</span> <span class="attr">decimal</span>: <span class="built_in">number</span> = <span class="number">6</span>;</span><br><span class="line"><span class="keyword">let</span> <span class="attr">color</span>: <span class="built_in">string</span> = <span class="string">"blue"</span>;</span><br><span class="line"><span class="keyword">let</span> <span class="attr">list</span>: <span class="built_in">number</span>[] = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>];</span><br></pre></td></tr></table></figure><h2 id="接口"><a href="#接口" class="headerlink" title="接口"></a>接口</h2><p>接口用于定义对象的结构:</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">interface</span> <span class="title class_">Person</span> {</span><br><span class="line"> <span class="attr">firstName</span>: <span class="built_in">string</span>;</span><br><span class="line"> <span class="attr">lastName</span>: <span class="built_in">string</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">greeter</span>(<span class="params"><span class="attr">person</span>: <span class="title class_">Person</span></span>) {</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"Hello, "</span> + person.<span class="property">firstName</span> + <span class="string">" "</span> + person.<span class="property">lastName</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">let</span> user = { <span class="attr">firstName</span>: <span class="string">"Jane"</span>, <span class="attr">lastName</span>: <span class="string">"User"</span> };</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="title function_">greeter</span>(user));</span><br></pre></td></tr></table></figure><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>TypeScript通过引入静态类型检查和其他特性,显著提升了JavaScript代码的质量和可维护性。如果你正在编写大型JavaScript应用,强烈推荐使用TypeScript。</p><h2 id="思维导图"><a href="#思维导图" class="headerlink" title="思维导图"></a>思维导图</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">graph TD;</span><br><span class="line"> A[使用TypeScript提升JavaScript代码质量] --> B[什么是TypeScript]</span><br><span class="line"> A --> C[安装TypeScript]</span><br><span class="line"> A --> D[基本语法]</span><br><span class="line"> A --> E[类型注解]</span><br><span class="line"> A --> F[接口]</span><br></pre></td></tr></table></figure>]]></content>
</entry>
<entry>
<title>理解数据库事务</title>
<link href="/2025/03/23/article11/"/>
<url>/2025/03/23/article11/</url>
<content type="html"><![CDATA[<h1 id="理解数据库事务"><a href="#理解数据库事务" class="headerlink" title="理解数据库事务"></a>理解数据库事务</h1><h2 id="什么是数据库事务?"><a href="#什么是数据库事务?" class="headerlink" title="什么是数据库事务?"></a>什么是数据库事务?</h2><p>数据库事务是一组操作的集合,这些操作要么全部执行成功,要么全部回滚,以确保数据的一致性。</p><h2 id="ACID特性"><a href="#ACID特性" class="headerlink" title="ACID特性"></a>ACID特性</h2><p>事务具有四个重要特性,通常称为ACID:</p><ol><li><strong>原子性 (Atomicity)</strong>:事务中的所有操作要么全部完成,要么全部回滚。</li><li><strong>一致性 (Consistency)</strong>:事务执行前后,数据库保持一致状态。</li><li><strong>隔离性 (Isolation)</strong>:事务的执行不受其他事务的影响。</li><li><strong>持久性 (Durability)</strong>:一旦事务提交,结果永久保存。</li></ol><h2 id="使用事务"><a href="#使用事务" class="headerlink" title="使用事务"></a>使用事务</h2><p>以下是一个使用事务的示例:</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">BEGIN</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 执行操作</span></span><br><span class="line"><span class="keyword">INSERT INTO</span> accounts (user_id, balance) <span class="keyword">VALUES</span> (<span class="number">1</span>, <span class="number">100</span>);</span><br><span class="line"><span class="keyword">UPDATE</span> accounts <span class="keyword">SET</span> balance <span class="operator">=</span> balance <span class="operator">-</span> <span class="number">50</span> <span class="keyword">WHERE</span> user_id <span class="operator">=</span> <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 提交事务</span></span><br><span class="line"><span class="keyword">COMMIT</span>;</span><br></pre></td></tr></table></figure><p>如果在事务过程中发生错误,可以回滚事务:</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">ROLLBACK</span>;</span><br></pre></td></tr></table></figure><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>事务是保证数据库数据一致性和完整性的重要机制,理解并正确使用事务可以提高数据库操作的可靠性和安全性。</p><h2 id="思维导图"><a href="#思维导图" class="headerlink" title="思维导图"></a>思维导图</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">graph TD;</span><br><span class="line"> A[理解数据库事务] --> B[什么是数据库事务]</span><br><span class="line"> A --> C[ACID特性]</span><br><span class="line"> A --> D[使用事务]</span><br></pre></td></tr></table></figure>]]></content>
</entry>
<entry>
<title>理解微服务架构</title>
<link href="/2025/03/23/article13/"/>
<url>/2025/03/23/article13/</url>
<content type="html"><![CDATA[<h1 id="理解微服务架构"><a href="#理解微服务架构" class="headerlink" title="理解微服务架构"></a>理解微服务架构</h1><h2 id="什么是微服务架构?"><a href="#什么是微服务架构?" class="headerlink" title="什么是微服务架构?"></a>什么是微服务架构?</h2><p>微服务架构是一种软件架构风格,将应用程序拆分为一组小的、独立部署的服务,每个服务负责特定的业务功能。</p><h2 id="优点"><a href="#优点" class="headerlink" title="优点"></a>优点</h2><ol><li><strong>独立部署</strong>:每个服务可以独立开发、测试和部署,减少了开发周期。</li><li><strong>技术多样性</strong>:不同的服务可以使用不同的技术栈,选择最适合的技术。</li><li><strong>弹性和可扩展性</strong>:可以根据需求独立扩展服务,提高系统的弹性和可扩展性。</li></ol><h2 id="挑战"><a href="#挑战" class="headerlink" title="挑战"></a>挑战</h2><ol><li><strong>复杂性</strong>:管理和协调多个服务增加了系统的复杂性。</li><li><strong>通信开销</strong>:服务之间通过网络通信,增加了通信开销和延迟。</li><li><strong>数据一致性</strong>:保证跨服务的数据一致性是一个挑战。</li></ol><h2 id="实现微服务"><a href="#实现微服务" class="headerlink" title="实现微服务"></a>实现微服务</h2><p>使用Docker和Kubernetes实现微服务架构:</p><ol><li><strong>Docker</strong>:将每个服务打包成Docker镜像,并使用Docker Compose进行编排。</li><li><strong>Kubernetes</strong>:使用Kubernetes进行容器编排和管理,提高系统的可扩展性和可靠性。</li></ol><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>微服务架构是一种灵活且强大的架构风格,适用于构建复杂和大规模的分布式系统。理解其优点和挑战,合理设计和实现微服务架构,可以大幅提升系统的开发效率和运行稳定性。</p><h2 id="思维导图"><a href="#思维导图" class="headerlink" title="思维导图"></a>思维导图</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">graph TD;</span><br><span class="line"> A[理解微服务架构] --> B[什么是微服务架构]</span><br><span class="line"> A --> C[优点]</span><br><span class="line"> A --> D[挑战]</span><br><span class="line"> A --> E[实现微服务]</span><br></pre></td></tr></table></figure>]]></content>
</entry>
<entry>
<title>深入理解JavaScript闭包</title>
<link href="/2025/03/23/article1/"/>
<url>/2025/03/23/article1/</url>
<content type="html"><![CDATA[<h1 id="深入理解JavaScript闭包"><a href="#深入理解JavaScript闭包" class="headerlink" title="深入理解JavaScript闭包"></a>深入理解JavaScript闭包</h1><h2 id="什么是闭包?"><a href="#什么是闭包?" class="headerlink" title="什么是闭包?"></a>什么是闭包?</h2><p>闭包是指那些能够访问自由变量的函数。换句话说,闭包可以让你在一个函数内部访问其外部的变量。</p><h2 id="闭包的原理"><a href="#闭包的原理" class="headerlink" title="闭包的原理"></a>闭包的原理</h2><p>闭包的实现依赖于JavaScript的函数作用域链。当一个函数定义在另一个函数内部时,内部函数会形成一个包含外部函数变量的闭包。</p><h2 id="闭包的应用"><a href="#闭包的应用" class="headerlink" title="闭包的应用"></a>闭包的应用</h2><p>闭包常用于创建私有变量、实现函数柯里化和在事件处理器中保持状态。</p><h2 id="示例代码"><a href="#示例代码" class="headerlink" title="示例代码"></a>示例代码</h2><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">createCounter</span>(<span class="params"></span>) {</span><br><span class="line"> <span class="keyword">let</span> count = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">function</span>(<span class="params"></span>) {</span><br><span class="line"> count++;</span><br><span class="line"> <span class="keyword">return</span> count;</span><br><span class="line"> };</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> counter = <span class="title function_">createCounter</span>();</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="title function_">counter</span>()); <span class="comment">// 1</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="title function_">counter</span>()); <span class="comment">// 2</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="title function_">counter</span>()); <span class="comment">// 3</span></span><br></pre></td></tr></table></figure><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>闭包是JavaScript中一个强大的特性,理解并善用闭包可以让你写出更灵活、更强大的代码。</p><h2 id="思维导图"><a href="#思维导图" class="headerlink" title="思维导图"></a>思维导图</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">graph TD;</span><br><span class="line"> A[JavaScript闭包] --> B[什么是闭包]</span><br><span class="line"> A --> C[闭包的原理]</span><br><span class="line"> A --> D[闭包的应用]</span><br><span class="line"> D --> E[私有变量]</span><br><span class="line"> D --> F[函数柯里化]</span><br><span class="line"> D --> G[事件处理器]</span><br></pre></td></tr></table></figure>]]></content>
</entry>
<entry>
<title>使用Python进行数据分析</title>
<link href="/2025/03/23/article12/"/>
<url>/2025/03/23/article12/</url>
<content type="html"><![CDATA[<h1 id="使用Python进行数据分析"><a href="#使用Python进行数据分析" class="headerlink" title="使用Python进行数据分析"></a>使用Python进行数据分析</h1><h2 id="安装必要的库"><a href="#安装必要的库" class="headerlink" title="安装必要的库"></a>安装必要的库</h2><p>使用pip安装Pandas和Matplotlib:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install pandas matplotlib</span><br></pre></td></tr></table></figure><h2 id="读取数据"><a href="#读取数据" class="headerlink" title="读取数据"></a>读取数据</h2><p>使用Pandas读取CSV文件:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"></span><br><span class="line">data = pd.read_csv(<span class="string">'data.csv'</span>)</span><br><span class="line"><span class="built_in">print</span>(data.head())</span><br></pre></td></tr></table></figure><h2 id="数据清洗"><a href="#数据清洗" class="headerlink" title="数据清洗"></a>数据清洗</h2><p>进行数据清洗和预处理:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 删除缺失值</span></span><br><span class="line">data.dropna(inplace=<span class="literal">True</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 转换数据类型</span></span><br><span class="line">data[<span class="string">'column'</span>] = data[<span class="string">'column'</span>].astype(<span class="string">'int'</span>)</span><br></pre></td></tr></table></figure><h2 id="数据分析"><a href="#数据分析" class="headerlink" title="数据分析"></a>数据分析</h2><p>进行基本的数据分析和统计:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 计算平均值</span></span><br><span class="line">mean_value = data[<span class="string">'column'</span>].mean()</span><br><span class="line"><span class="built_in">print</span>(<span class="string">f"Mean: <span class="subst">{mean_value}</span>"</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 分组统计</span></span><br><span class="line">grouped_data = data.groupby(<span class="string">'category'</span>).mean()</span><br><span class="line"><span class="built_in">print</span>(grouped_data)</span><br></pre></td></tr></table></figure><h2 id="数据可视化"><a href="#数据可视化" class="headerlink" title="数据可视化"></a>数据可视化</h2><p>使用Matplotlib进行数据可视化:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"></span><br><span class="line"><span class="comment"># 绘制柱状图</span></span><br><span class="line">data[<span class="string">'column'</span>].plot(kind=<span class="string">'bar'</span>)</span><br><span class="line">plt.show()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 绘制折线图</span></span><br><span class="line">data[<span class="string">'column'</span>].plot(kind=<span class="string">'line'</span>)</span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>Python提供了强大的数据分析工具,通过使用Pandas和Matplotlib,你可以轻松地进行数据读取、清洗、分析和可视化。</p><h2 id="思维导图"><a href="#思维导图" class="headerlink" title="思维导图"></a>思维导图</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">graph TD;</span><br><span class="line"> A[使用Python进行数据分析] --> B[安装必要的库]</span><br><span class="line"> A --> C[读取数据]</span><br><span class="line"> A --> D[数据清洗]</span><br><span class="line"> A --> E[数据分析]</span><br><span class="line"> A --> F[数据可视化]</span><br></pre></td></tr></table></figure>]]></content>
</entry>
<entry>
<title>使用TensorFlow进行深度学习</title>
<link href="/2025/03/23/article14/"/>
<url>/2025/03/23/article14/</url>
<content type="html"><![CDATA[<h1 id="使用TensorFlow进行深度学习"><a href="#使用TensorFlow进行深度学习" class="headerlink" title="使用TensorFlow进行深度学习"></a>使用TensorFlow进行深度学习</h1><h2 id="安装TensorFlow"><a href="#安装TensorFlow" class="headerlink" title="安装TensorFlow"></a>安装TensorFlow</h2><p>使用pip安装TensorFlow:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install tensorflow</span><br></pre></td></tr></table></figure><h2 id="创建简单的神经网络"><a href="#创建简单的神经网络" class="headerlink" title="创建简单的神经网络"></a>创建简单的神经网络</h2><p>以下是一个使用TensorFlow创建简单神经网络的示例:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> tensorflow <span class="keyword">as</span> tf</span><br><span class="line"><span class="keyword">from</span> tensorflow.keras.models <span class="keyword">import</span> Sequential</span><br><span class="line"><span class="keyword">from</span> tensorflow.keras.layers <span class="keyword">import</span> Dense</span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建模型</span></span><br><span class="line">model = Sequential([</span><br><span class="line"> Dense(<span class="number">128</span>, activation=<span class="string">'relu'</span>, input_shape=(<span class="number">784</span>,)),</span><br><span class="line"> Dense(<span class="number">64</span>, activation=<span class="string">'relu'</span>),</span><br><span class="line"> Dense(<span class="number">10</span>, activation=<span class="string">'softmax'</span>)</span><br><span class="line">])</span><br><span class="line"></span><br><span class="line"><span class="comment"># 编译模型</span></span><br><span class="line">model.<span class="built_in">compile</span>(optimizer=<span class="string">'adam'</span>,</span><br><span class="line"> loss=<span class="string">'sparse_categorical_crossentropy'</span>,</span><br><span class="line"> metrics=[<span class="string">'accuracy'</span>])</span><br><span class="line"></span><br><span class="line"><span class="comment"># 训练模型</span></span><br><span class="line">model.fit(x_train, y_train, epochs=<span class="number">5</span>)</span><br></pre></td></tr></table></figure><h2 id="评估模型"><a href="#评估模型" class="headerlink" title="评估模型"></a>评估模型</h2><p>评估模型的性能:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">loss, accuracy = model.evaluate(x_test, y_test)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">f"Test accuracy: <span class="subst">{accuracy}</span>"</span>)</span><br></pre></td></tr></table></figure><h2 id="预测"><a href="#预测" class="headerlink" title="预测"></a>预测</h2><p>使用训练好的模型进行预测:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">predictions = model.predict(x_test)</span><br><span class="line"><span class="built_in">print</span>(predictions[<span class="number">0</span>])</span><br></pre></td></tr></table></figure><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>TensorFlow是一个强大的深度学习框架,通过其高层API,开发者可以快速构建和训练神经网络模型。本文介绍了如何使用TensorFlow进行基本的深度学习任务,帮助你快速入门。</p><h2 id="思维导图"><a href="#思维导图" class="headerlink" title="思维导图"></a>思维导图</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">graph TD;</span><br><span class="line"> A[使用TensorFlow进行深度学习] --> B[安装TensorFlow]</span><br><span class="line"> A --> C[创建简单的神经网络]</span><br><span class="line"> A --> D[评估模型]</span><br><span class="line"> A --> E[预测]</span><br></pre></td></tr></table></figure>]]></content>
</entry>
<entry>
<title>使用GraphQL构建灵活的API</title>
<link href="/2025/03/23/article18/"/>
<url>/2025/03/23/article18/</url>
<content type="html"><![CDATA[<h1 id="使用GraphQL构建灵活的API"><a href="#使用GraphQL构建灵活的API" class="headerlink" title="使用GraphQL构建灵活的API"></a>使用GraphQL构建灵活的API</h1><h2 id="什么是GraphQL?"><a href="#什么是GraphQL?" class="headerlink" title="什么是GraphQL?"></a>什么是GraphQL?</h2><p>GraphQL是由Facebook开发的一个用于API的查询语言,它提供了比传统REST API更灵活和高效的数据获取方式。</p><h2 id="GraphQL的基本概念"><a href="#GraphQL的基本概念" class="headerlink" title="GraphQL的基本概念"></a>GraphQL的基本概念</h2><ol><li><strong>Schema</strong>:定义API的类型和结构。</li><li><strong>Query</strong>:用于获取数据的请求。</li><li><strong>Mutation</strong>:用于修改数据的请求。</li><li><strong>Resolver</strong>:处理查询和变更请求的函数。</li></ol><h2 id="示例"><a href="#示例" class="headerlink" title="示例"></a>示例</h2><p>以下是一个简单的GraphQL服务器示例(使用Node.js和Express):</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> express = <span class="built_in">require</span>(<span class="string">'express'</span>);</span><br><span class="line"><span class="keyword">const</span> { graphqlHTTP } = <span class="built_in">require</span>(<span class="string">'express-graphql'</span>);</span><br><span class="line"><span class="keyword">const</span> { buildSchema } = <span class="built_in">require</span>(<span class="string">'graphql'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 定义Schema</span></span><br><span class="line"><span class="keyword">const</span> schema = <span class="title function_">buildSchema</span>(<span class="string">`</span></span><br><span class="line"><span class="string"> type Query {</span></span><br><span class="line"><span class="string"> hello: String</span></span><br><span class="line"><span class="string"> }</span></span><br><span class="line"><span class="string">`</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 定义Resolver</span></span><br><span class="line"><span class="keyword">const</span> root = {</span><br><span class="line"> <span class="attr">hello</span>: <span class="function">() =></span> <span class="string">'Hello, world!'</span></span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="comment">// 创建Express应用</span></span><br><span class="line"><span class="keyword">const</span> app = <span class="title function_">express</span>();</span><br><span class="line">app.<span class="title function_">use</span>(<span class="string">'/graphql'</span>, <span class="title function_">graphqlHTTP</span>({</span><br><span class="line"> <span class="attr">schema</span>: schema,</span><br><span class="line"> <span class="attr">rootValue</span>: root,</span><br><span class="line"> <span class="attr">graphiql</span>: <span class="literal">true</span>,</span><br><span class="line">}));</span><br><span class="line"></span><br><span class="line"><span class="comment">// 启动服务器</span></span><br><span class="line">app.<span class="title function_">listen</span>(<span class="number">4000</span>, <span class="function">() =></span> {</span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">'Running a GraphQL API server at http://localhost:4000/graphql'</span>);</span><br><span class="line">});</span><br></pre></td></tr></table></figure><h2 id="使用GraphiQL进行查询"><a href="#使用GraphiQL进行查询" class="headerlink" title="使用GraphiQL进行查询"></a>使用GraphiQL进行查询</h2><p>启动服务器后,可以在浏览器中打开<a href="http://localhost:4000/graphql%EF%BC%8C%E4%BD%BF%E7%94%A8GraphiQL%E8%BF%9B%E8%A1%8C%E6%9F%A5%E8%AF%A2%EF%BC%9A">http://localhost:4000/graphql,使用GraphiQL进行查询:</a></p><figure class="highlight graphql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line"> hello</span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>GraphQL通过其灵活的查询语言和强大的类型系统,提供了比传统REST API更高效的数据获取方式。通过本文的介绍,你可以快速上手并开始使用GraphQL构建API。</p><h2 id="思维导图"><a href="#思维导图" class="headerlink" title="思维导图"></a>思维导图</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">graph TD;</span><br><span class="line"> A[使用GraphQL构建灵活的API] --> B[什么是GraphQL]</span><br><span class="line"> A --> C[GraphQL的基本概念]</span><br><span class="line"> A --> D[示例]</span><br><span class="line"> A --> E[使用GraphiQL进行查询]</span><br></pre></td></tr></table></figure>]]></content>
</entry>
<entry>
<title>使用Nginx进行负载均衡</title>
<link href="/2025/03/23/article15/"/>
<url>/2025/03/23/article15/</url>
<content type="html"><![CDATA[<h1 id="使用Nginx进行负载均衡"><a href="#使用Nginx进行负载均衡" class="headerlink" title="使用Nginx进行负载均衡"></a>使用Nginx进行负载均衡</h1><h2 id="什么是负载均衡?"><a href="#什么是负载均衡?" class="headerlink" title="什么是负载均衡?"></a>什么是负载均衡?</h2><p>负载均衡是一种将网络流量分配到多个服务器的技术,以提高系统的可用性和性能。</p><h2 id="安装Nginx"><a href="#安装Nginx" class="headerlink" title="安装Nginx"></a>安装Nginx</h2><p>使用以下命令在Ubuntu上安装Nginx:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt-get update</span><br><span class="line"><span class="built_in">sudo</span> apt-get install -y nginx</span><br></pre></td></tr></table></figure><h2 id="配置负载均衡"><a href="#配置负载均衡" class="headerlink" title="配置负载均衡"></a>配置负载均衡</h2><p>编辑Nginx配置文件,添加负载均衡配置:</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">http</span> {</span><br><span class="line"> <span class="section">upstream</span> myapp {</span><br><span class="line"> <span class="attribute">server</span> backend1.example.com;</span><br><span class="line"> <span class="attribute">server</span> backend2.example.com;</span><br><span class="line"> <span class="attribute">server</span> backend3.example.com;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="section">server</span> {</span><br><span class="line"> <span class="attribute">listen</span> <span class="number">80</span>;</span><br><span class="line"></span><br><span class="line"> <span class="section">location</span> / {</span><br><span class="line"> <span class="attribute">proxy_pass</span> http://myapp;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="启动Nginx"><a href="#启动Nginx" class="headerlink" title="启动Nginx"></a>启动Nginx</h2><p>启动Nginx服务:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> systemctl start nginx</span><br><span class="line"><span class="built_in">sudo</span> systemctl <span class="built_in">enable</span> nginx</span><br></pre></td></tr></table></figure><h2 id="验证负载均衡"><a href="#验证负载均衡" class="headerlink" title="验证负载均衡"></a>验证负载均衡</h2><p>访问Nginx服务器的IP地址,验证负载均衡是否正常工作。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>通过Nginx进行负载均衡,可以有效提高Web应用的可用性和性能。本文介绍了基本的负载均衡配置,帮助你快速上手。</p><h2 id="思维导图"><a href="#思维导图" class="headerlink" title="思维导图"></a>思维导图</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">graph TD;</span><br><span class="line"> A[使用Nginx进行负载均衡] --> B[什么是负载均衡]</span><br><span class="line"> A --> C[安装Nginx]</span><br><span class="line"> A --> D[配置负载均衡]</span><br><span class="line"> A --> E[启动Nginx]</span><br><span class="line"> A --> F[验证负载均衡]</span><br></pre></td></tr></table></figure>]]></content>
</entry>
<entry>
<title>使用Redis进行缓存</title>
<link href="/2025/03/23/article16/"/>
<url>/2025/03/23/article16/</url>
<content type="html"><![CDATA[<h1 id="使用Redis进行缓存"><a href="#使用Redis进行缓存" class="headerlink" title="使用Redis进行缓存"></a>使用Redis进行缓存</h1><h2 id="什么是Redis?"><a href="#什么是Redis?" class="headerlink" title="什么是Redis?"></a>什么是Redis?</h2><p>Redis是一个开源的内存数据库,支持多种数据结构,常用于缓存、会话存储和消息队列等场景。</p><h2 id="安装Redis"><a href="#安装Redis" class="headerlink" title="安装Redis"></a>安装Redis</h2><p>使用以下命令在Ubuntu上安装Redis:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt-get update</span><br><span class="line"><span class="built_in">sudo</span> apt-get install -y redis-server</span><br></pre></td></tr></table></figure><p>启动Redis服务:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> systemctl start redis</span><br><span class="line"><span class="built_in">sudo</span> systemctl <span class="built_in">enable</span> redis</span><br></pre></td></tr></table></figure><h2 id="基本操作"><a href="#基本操作" class="headerlink" title="基本操作"></a>基本操作</h2><p>连接Redis服务器:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">redis-cli</span><br></pre></td></tr></table></figure><p>设置键值对:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SET key <span class="string">"value"</span></span><br></pre></td></tr></table></figure><p>获取键值:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">GET key</span><br></pre></td></tr></table></figure><h2 id="使用Redis进行缓存-1"><a href="#使用Redis进行缓存-1" class="headerlink" title="使用Redis进行缓存"></a>使用Redis进行缓存</h2><p>以下是一个使用Redis进行缓存的示例(Python):</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> redis</span><br><span class="line"></span><br><span class="line"><span class="comment"># 连接Redis</span></span><br><span class="line">r = redis.Redis(host=<span class="string">'localhost'</span>, port=<span class="number">6379</span>, db=<span class="number">0</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置缓存</span></span><br><span class="line">r.<span class="built_in">set</span>(<span class="string">'my_key'</span>, <span class="string">'my_value'</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取缓存</span></span><br><span class="line">value = r.get(<span class="string">'my_key'</span>)</span><br><span class="line"><span class="built_in">print</span>(value)</span><br></pre></td></tr></table></figure><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>Redis是一个高性能的内存数据库,通过使用Redis进行缓存,可以显著提高应用程序的性能。本文介绍了Redis的基本概念和操作,帮助你快速上手。</p><h2 id="思维导图"><a href="#思维导图" class="headerlink" title="思维导图"></a>思维导图</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">graph TD;</span><br><span class="line"> A[使用Redis进行缓存] --> B[什么是Redis]</span><br><span class="line"> A --> C[安装Redis]</span><br><span class="line"> A --> D[基本操作]</span><br><span class="line"> A --> E[使用Redis进行缓存]</span><br></pre></td></tr></table></figure>]]></content>
</entry>
<entry>
<title>使用Ansible进行自动化运维</title>
<link href="/2025/03/23/article19/"/>
<url>/2025/03/23/article19/</url>
<content type="html"><![CDATA[<h1 id="使用Ansible进行自动化运维"><a href="#使用Ansible进行自动化运维" class="headerlink" title="使用Ansible进行自动化运维"></a>使用Ansible进行自动化运维</h1><h2 id="什么是Ansible?"><a href="#什么是Ansible?" class="headerlink" title="什么是Ansible?"></a>什么是Ansible?</h2><p>Ansible是一个开源的自动化工具,用于配置管理、应用部署和任务自动化。它通过SSH进行通信,无需在目标主机上安装代理软件。</p><h2 id="安装Ansible"><a href="#安装Ansible" class="headerlink" title="安装Ansible"></a>安装Ansible</h2><p>使用以下命令在Ubuntu上安装Ansible:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt-get update</span><br><span class="line"><span class="built_in">sudo</span> apt-get install -y ansible</span><br></pre></td></tr></table></figure><h2 id="基本概念"><a href="#基本概念" class="headerlink" title="基本概念"></a>基本概念</h2><ol><li><strong>Playbook</strong>:定义自动化任务的YAML文件。</li><li><strong>Inventory</strong>:定义主机和组的清单文件。</li><li><strong>Module</strong>:Ansible中执行具体任务的单元。</li></ol><h2 id="示例"><a href="#示例" class="headerlink" title="示例"></a>示例</h2><p>以下是一个简单的Ansible Playbook示例,用于安装Nginx:</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">hosts:</span> <span class="string">webservers</span></span><br><span class="line"> <span class="attr">become:</span> <span class="literal">yes</span></span><br><span class="line"> <span class="attr">tasks:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">安装Nginx</span></span><br><span class="line"> <span class="attr">apt:</span></span><br><span class="line"> <span class="attr">name:</span> <span class="string">nginx</span></span><br><span class="line"> <span class="attr">state:</span> <span class="string">present</span></span><br></pre></td></tr></table></figure><p>定义Inventory文件(hosts):</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[webservers]</span></span><br><span class="line">192.168.1.10</span><br><span class="line">192.168.1.11</span><br></pre></td></tr></table></figure><p>运行Playbook:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ansible-playbook -i hosts playbook.yml</span><br></pre></td></tr></table></figure><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>Ansible通过其简单且强大的自动化功能,可以显著提高运维效率。本文介绍了Ansible的基本概念和使用方法,帮助你快速上手。</p><h2 id="思维导图"><a href="#思维导图" class="headerlink" title="思维导图"></a>思维导图</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">graph TD;</span><br><span class="line"> A[使用Ansible进行自动化运维] --> B[什么是Ansible]</span><br><span class="line"> A --> C[安装Ansible]</span><br><span class="line"> A --> D[基本概念]</span><br><span class="line"> A --> E[示例]</span><br></pre></td></tr></table></figure>]]></content>
</entry>
<entry>
<title>使用Flutter构建跨平台移动应用</title>
<link href="/2025/03/23/article20/"/>
<url>/2025/03/23/article20/</url>
<content type="html"><![CDATA[<h1 id="使用Flutter构建跨平台移动应用"><a href="#使用Flutter构建跨平台移动应用" class="headerlink" title="使用Flutter构建跨平台移动应用"></a>使用Flutter构建跨平台移动应用</h1><h2 id="什么是Flutter?"><a href="#什么是Flutter?" class="headerlink" title="什么是Flutter?"></a>什么是Flutter?</h2><p>Flutter是Google开发的一个开源框架,用于构建高性能、跨平台的移动应用。它使用Dart语言,并提供丰富的组件和工具。</p><h2 id="安装Flutter"><a href="#安装Flutter" class="headerlink" title="安装Flutter"></a>安装Flutter</h2><p>按照以下步骤安装Flutter:</p><ol><li>从<a href="https://flutter.dev/">Flutter官网</a>下载Flutter SDK。</li><li>解压缩下载的文件并将其路径添加到环境变量中。</li><li>验证安装:</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">flutter doctor</span><br></pre></td></tr></table></figure><h2 id="创建Flutter应用"><a href="#创建Flutter应用" class="headerlink" title="创建Flutter应用"></a>创建Flutter应用</h2><p>使用以下命令创建一个新的Flutter应用:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">flutter create my_app</span><br><span class="line"><span class="built_in">cd</span> my_app</span><br></pre></td></tr></table></figure><h2 id="编写代码"><a href="#编写代码" class="headerlink" title="编写代码"></a>编写代码</h2><p>以下是一个简单的Flutter应用示例:</p><figure class="highlight dart"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> <span class="string">'package:flutter/material.dart'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">void</span> main() {</span><br><span class="line"> runApp(MyApp());</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">MyApp</span> <span class="keyword">extends</span> <span class="title">StatelessWidget</span> </span>{</span><br><span class="line"> <span class="meta">@override</span></span><br><span class="line"> Widget build(BuildContext context) {</span><br><span class="line"> <span class="keyword">return</span> MaterialApp(</span><br><span class="line"> home: Scaffold(</span><br><span class="line"> appBar: AppBar(</span><br><span class="line"> title: Text(<span class="string">'Flutter Demo'</span>),</span><br><span class="line"> ),</span><br><span class="line"> body: Center(</span><br><span class="line"> child: Text(<span class="string">'Hello, Flutter!'</span>),</span><br><span class="line"> ),</span><br><span class="line"> ),</span><br><span class="line"> );</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="运行应用"><a href="#运行应用" class="headerlink" title="运行应用"></a>运行应用</h2><p>使用以下命令运行Flutter应用:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">flutter run</span><br></pre></td></tr></table></figure><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>Flutter通过其高性能和跨平台特性,使得移动应用开发变得更加高效和便捷。本文介绍了Flutter的基本概念和使用方法,帮助你快速上手并开始构建跨平台移动应用。</p><h2 id="思维导图"><a href="#思维导图" class="headerlink" title="思维导图"></a>思维导图</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">graph TD;</span><br><span class="line"> A[使用Flutter构建跨平台移动应用] --> B[什么是Flutter]</span><br><span class="line"> A --> C[安装Flutter]</span><br><span class="line"> A --> D[创建Flutter应用]</span><br><span class="line"> A --> E[编写代码]</span><br><span class="line"> A --> F[运行应用]</span><br></pre></td></tr></table></figure>]]></content>
</entry>
<entry>
<title>使用Docker进行容器化部署</title>
<link href="/2025/03/23/article2/"/>
<url>/2025/03/23/article2/</url>
<content type="html"><![CDATA[<h1 id="使用Docker进行容器化部署"><a href="#使用Docker进行容器化部署" class="headerlink" title="使用Docker进行容器化部署"></a>使用Docker进行容器化部署</h1><h2 id="什么是Docker?"><a href="#什么是Docker?" class="headerlink" title="什么是Docker?"></a>什么是Docker?</h2><p>Docker是一个开源的容器化平台,它使得开发者能够打包应用及其依赖项到一个轻量级的、可移植的容器中。</p><h2 id="安装Docker"><a href="#安装Docker" class="headerlink" title="安装Docker"></a>安装Docker</h2><p>在不同的操作系统上安装Docker的步骤略有不同,以下是一些常见操作系统的安装步骤:</p><h3 id="在Ubuntu上安装Docker"><a href="#在Ubuntu上安装Docker" class="headerlink" title="在Ubuntu上安装Docker"></a>在Ubuntu上安装Docker</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt-get update</span><br><span class="line"><span class="built_in">sudo</span> apt-get install -y docker.io</span><br><span class="line"><span class="built_in">sudo</span> systemctl start docker</span><br><span class="line"><span class="built_in">sudo</span> systemctl <span class="built_in">enable</span> docker</span><br></pre></td></tr></table></figure><h3 id="在Windows上安装Docker"><a href="#在Windows上安装Docker" class="headerlink" title="在Windows上安装Docker"></a>在Windows上安装Docker</h3><ol><li>下载Docker Desktop安装包</li><li>双击安装包并按照提示完成安装</li><li>启动Docker Desktop</li></ol><h2 id="使用Docker进行容器化部署-1"><a href="#使用Docker进行容器化部署-1" class="headerlink" title="使用Docker进行容器化部署"></a>使用Docker进行容器化部署</h2><h3 id="创建Dockerfile"><a href="#创建Dockerfile" class="headerlink" title="创建Dockerfile"></a>创建Dockerfile</h3><p>Dockerfile是一个文本文件,其中包含了构建Docker镜像的指令。以下是一个简单的示例:</p><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 选择基础镜像</span></span><br><span class="line"><span class="keyword">FROM</span> node:<span class="number">14</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建应用目录</span></span><br><span class="line"><span class="keyword">WORKDIR</span><span class="language-bash"> /app</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 复制项目文件</span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> . /app</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装依赖</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> npm install</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动应用</span></span><br><span class="line"><span class="keyword">CMD</span><span class="language-bash"> [<span class="string">"npm"</span>, <span class="string">"start"</span>]</span></span><br></pre></td></tr></table></figure><h3 id="构建Docker镜像"><a href="#构建Docker镜像" class="headerlink" title="构建Docker镜像"></a>构建Docker镜像</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker build -t my-app .</span><br></pre></td></tr></table></figure><h3 id="运行Docker容器"><a href="#运行Docker容器" class="headerlink" title="运行Docker容器"></a>运行Docker容器</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run -d -p 3000:3000 my-app</span><br></pre></td></tr></table></figure><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>通过Docker,开发者可以轻松地进行应用的容器化部署,提高开发和运维的效率。</p><h2 id="思维导图"><a href="#思维导图" class="headerlink" title="思维导图"></a>思维导图</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">graph TD;</span><br><span class="line"> A[使用Docker进行容器化部署] --> B[什么是Docker]</span><br><span class="line"> A --> C[安装Docker]</span><br><span class="line"> A --> D[使用Docker进行容器化部署]</span><br><span class="line"> D --> E[创建Dockerfile]</span><br><span class="line"> D --> F[构建Docker镜像]</span><br><span class="line"> D --> G[运行Docker容器]</span><br></pre></td></tr></table></figure>]]></content>
</entry>
<entry>
<title>理解RESTful API设计</title>
<link href="/2025/03/23/article4/"/>
<url>/2025/03/23/article4/</url>
<content type="html"><![CDATA[<h1 id="理解RESTful-API设计"><a href="#理解RESTful-API设计" class="headerlink" title="理解RESTful API设计"></a>理解RESTful API设计</h1><h2 id="什么是RESTful-API?"><a href="#什么是RESTful-API?" class="headerlink" title="什么是RESTful API?"></a>什么是RESTful API?</h2><p>REST(Representational State Transfer)是一种设计风格,用于构建可扩展的Web服务。RESTful API遵循这一设计风格,使用HTTP协议进行通信。</p><h2 id="设计原则"><a href="#设计原则" class="headerlink" title="设计原则"></a>设计原则</h2><ol><li><strong>资源的表示</strong>:每个资源使用URI进行唯一标识,并通过HTTP方法进行操作(GET, POST, PUT, DELETE)。</li><li><strong>无状态性</strong>:每个请求都是独立的,包含所有必要的信息。</li><li><strong>统一接口</strong>:使用标准的HTTP方法和状态码。</li><li><strong>客户端-服务器架构</strong>:客户端和服务器职责分离,提高系统的可扩展性。</li></ol><h2 id="最佳实践"><a href="#最佳实践" class="headerlink" title="最佳实践"></a>最佳实践</h2><ol><li><strong>使用名词表示资源</strong>:例如,/users表示用户资源。</li><li><strong>使用HTTP状态码</strong>:例如,200表示成功,404表示资源未找到。</li><li><strong>版本控制</strong>:在URL中包含版本号,例如/v1/users。</li><li><strong>分页和过滤</strong>:对于大量数据,提供分页和过滤功能。</li></ol><h2 id="示例"><a href="#示例" class="headerlink" title="示例"></a>示例</h2><p>以下是一个简单的RESTful API示例:</p><figure class="highlight http"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">GET /api/v1/users</span><br><span class="line"><span class="attribute">Host</span><span class="punctuation">: </span>example.com</span><br><span class="line"><span class="attribute">Accept</span><span class="punctuation">: </span>application/json</span><br></pre></td></tr></table></figure><p>响应:</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">[</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"id"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"John Doe"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"id"</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"Jane Doe"</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">]</span></span><br></pre></td></tr></table></figure><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>RESTful API设计是一种构建Web服务的流行方法,遵循其原则和最佳实践可以提高API的可维护性和可扩展性。</p><h2 id="思维导图"><a href="#思维导图" class="headerlink" title="思维导图"></a>思维导图</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">graph TD;</span><br><span class="line"> A[理解RESTful API设计] --> B[什么是RESTful API]</span><br><span class="line"> A --> C[设计原则]</span><br><span class="line"> A --> D[最佳实践]</span><br><span class="line"> A --> E[示例]</span><br></pre></td></tr></table></figure>]]></content>
</entry>
<entry>
<title>Git的基本操作指南</title>
<link href="/2025/03/23/article3/"/>
<url>/2025/03/23/article3/</url>
<content type="html"><![CDATA[<h1 id="Git的基本操作指南"><a href="#Git的基本操作指南" class="headerlink" title="Git的基本操作指南"></a>Git的基本操作指南</h1><h2 id="初始化Git仓库"><a href="#初始化Git仓库" class="headerlink" title="初始化Git仓库"></a>初始化Git仓库</h2><p>在一个新的项目目录中初始化Git仓库:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git init</span><br></pre></td></tr></table></figure><h2 id="提交更改"><a href="#提交更改" class="headerlink" title="提交更改"></a>提交更改</h2><p>添加文件到暂存区并提交:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git add .</span><br><span class="line">git commit -m <span class="string">"Initial commit"</span></span><br></pre></td></tr></table></figure><h2 id="分支管理"><a href="#分支管理" class="headerlink" title="分支管理"></a>分支管理</h2><p>创建新分支并切换到该分支:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git branch new-feature</span><br><span class="line">git checkout new-feature</span><br></pre></td></tr></table></figure><p>合并分支:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git checkout main</span><br><span class="line">git merge new-feature</span><br></pre></td></tr></table></figure><h2 id="查看历史记录"><a href="#查看历史记录" class="headerlink" title="查看历史记录"></a>查看历史记录</h2><p>查看提交历史:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">log</span></span><br></pre></td></tr></table></figure><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>Git是一个功能强大的版本控制系统,掌握其基本操作将有助于更高效地管理代码。</p><h2 id="思维导图"><a href="#思维导图" class="headerlink" title="思维导图"></a>思维导图</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">graph TD;</span><br><span class="line"> A[Git的基本操作指南] --> B[初始化Git仓库]</span><br><span class="line"> A --> C[提交更改]</span><br><span class="line"> A --> D[分支管理]</span><br><span class="line"> A --> E[查看历史记录]</span><br></pre></td></tr></table></figure>]]></content>
</entry>
<entry>
<title>使用React Hooks进行状态管理</title>
<link href="/2025/03/23/article5/"/>
<url>/2025/03/23/article5/</url>
<content type="html"><![CDATA[<h1 id="使用React-Hooks进行状态管理"><a href="#使用React-Hooks进行状态管理" class="headerlink" title="使用React Hooks进行状态管理"></a>使用React Hooks进行状态管理</h1><h2 id="什么是React-Hooks?"><a href="#什么是React-Hooks?" class="headerlink" title="什么是React Hooks?"></a>什么是React Hooks?</h2><p>React Hooks是React 16.8引入的新特性,它允许你在不编写class组件的情况下使用状态和其他React特性。</p><h2 id="useState"><a href="#useState" class="headerlink" title="useState"></a>useState</h2><p>useState是一个用于在函数组件中添加状态的Hook。以下是一个简单的示例:</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> <span class="title class_">React</span>, { useState } <span class="keyword">from</span> <span class="string">'react'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">Counter</span>(<span class="params"></span>) {</span><br><span class="line"> <span class="keyword">const</span> [count, setCount] = <span class="title function_">useState</span>(<span class="number">0</span>);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> (</span><br><span class="line"> <span class="language-xml"><span class="tag"><<span class="name">div</span>></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">p</span>></span>You clicked {count} times<span class="tag"></<span class="name">p</span>></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">button</span> <span class="attr">onClick</span>=<span class="string">{()</span> =></span> setCount(count + 1)}></span></span><br><span class="line"><span class="language-xml"> Click me</span></span><br><span class="line"><span class="language-xml"> <span class="tag"></<span class="name">button</span>></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"></<span class="name">div</span>></span></span></span><br><span class="line"> );</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="useEffect"><a href="#useEffect" class="headerlink" title="useEffect"></a>useEffect</h2><p>useEffect是一个用于在函数组件中执行副作用的Hook。以下是一个示例:</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> <span class="title class_">React</span>, { useState, useEffect } <span class="keyword">from</span> <span class="string">'react'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">Example</span>(<span class="params"></span>) {</span><br><span class="line"> <span class="keyword">const</span> [count, setCount] = <span class="title function_">useState</span>(<span class="number">0</span>);</span><br><span class="line"></span><br><span class="line"> <span class="title function_">useEffect</span>(<span class="function">() =></span> {</span><br><span class="line"> <span class="variable language_">document</span>.<span class="property">title</span> = <span class="string">`You clicked <span class="subst">${count}</span> times`</span>;</span><br><span class="line"> }, [count]);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> (</span><br><span class="line"> <span class="language-xml"><span class="tag"><<span class="name">div</span>></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">p</span>></span>You clicked {count} times<span class="tag"></<span class="name">p</span>></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">button</span> <span class="attr">onClick</span>=<span class="string">{()</span> =></span> setCount(count + 1)}></span></span><br><span class="line"><span class="language-xml"> Click me</span></span><br><span class="line"><span class="language-xml"> <span class="tag"></<span class="name">button</span>></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"></<span class="name">div</span>></span></span></span><br><span class="line"> );</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>React Hooks使得在函数组件中管理状态和副作用变得更加简单和直观,鼓励你在项目中尝试使用它们。</p><h2 id="思维导图"><a href="#思维导图" class="headerlink" title="思维导图"></a>思维导图</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">graph TD;</span><br><span class="line"> A[使用React Hooks进行状态管理] --> B[什么是React Hooks]</span><br><span class="line"> A --> C[useState]</span><br><span class="line"> A --> D[useEffect]</span><br></pre></td></tr></table></figure>]]></content>
</entry>
<entry>
<title>Python中的面向对象编程</title>
<link href="/2025/03/23/article6/"/>
<url>/2025/03/23/article6/</url>
<content type="html"><![CDATA[<h1 id="Python中的面向对象编程"><a href="#Python中的面向对象编程" class="headerlink" title="Python中的面向对象编程"></a>Python中的面向对象编程</h1><h2 id="什么是面向对象编程?"><a href="#什么是面向对象编程?" class="headerlink" title="什么是面向对象编程?"></a>什么是面向对象编程?</h2><p>面向对象编程(OOP)是一种编程范式,它将程序组织为对象的集合,每个对象都包含数据和行为。</p><h2 id="定义类和对象"><a href="#定义类和对象" class="headerlink" title="定义类和对象"></a>定义类和对象</h2><p>在Python中,类使用class关键字定义,对象是类的实例。以下是一个简单的示例:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Dog</span>:</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, name, age</span>):</span><br><span class="line"> <span class="variable language_">self</span>.name = name</span><br><span class="line"> <span class="variable language_">self</span>.age = age</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">bark</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">f"<span class="subst">{self.name}</span> is barking"</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建对象</span></span><br><span class="line">dog1 = Dog(<span class="string">"Buddy"</span>, <span class="number">3</span>)</span><br><span class="line">dog1.bark()</span><br></pre></td></tr></table></figure><h2 id="继承"><a href="#继承" class="headerlink" title="继承"></a>继承</h2><p>继承允许一个类继承另一个类的属性和方法。以下是一个示例:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Animal</span>:</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, name</span>):</span><br><span class="line"> <span class="variable language_">self</span>.name = name</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">speak</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="keyword">raise</span> NotImplementedError(<span class="string">"Subclass must implement abstract method"</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Dog</span>(<span class="title class_ inherited__">Animal</span>):</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">speak</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="keyword">return</span> <span class="string">f"<span class="subst">{self.name}</span> says woof"</span></span><br><span class="line"></span><br><span class="line">dog = Dog(<span class="string">"Buddy"</span>)</span><br><span class="line"><span class="built_in">print</span>(dog.speak())</span><br></pre></td></tr></table></figure><h2 id="多态"><a href="#多态" class="headerlink" title="多态"></a>多态</h2><p>多态允许你在不考虑对象具体类型的情况下使用对象。以下是一个示例:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">make_animal_speak</span>(<span class="params">animal</span>):</span><br><span class="line"> <span class="built_in">print</span>(animal.speak())</span><br><span class="line"></span><br><span class="line">dog = Dog(<span class="string">"Buddy"</span>)</span><br><span class="line">make_animal_speak(dog)</span><br></pre></td></tr></table></figure><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>面向对象编程是Python中的一个重要概念,理解并掌握OOP可以帮助你编写更具组织性和可维护性的代码。</p><h2 id="思维导图"><a href="#思维导图" class="headerlink" title="思维导图"></a>思维导图</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">graph TD;</span><br><span class="line"> A[Python中的面向对象编程] --> B[什么是面向对象编程]</span><br><span class="line"> A --> C[定义类和对象]</span><br><span class="line"> A --> D[继承]</span><br><span class="line"> A --> E[多态]</span><br></pre></td></tr></table></figure>]]></content>
</entry>
<entry>
<title>使用Node.js构建RESTful API</title>
<link href="/2025/03/23/article7/"/>
<url>/2025/03/23/article7/</url>
<content type="html"><![CDATA[<h1 id="使用Node-js构建RESTful-API"><a href="#使用Node-js构建RESTful-API" class="headerlink" title="使用Node.js构建RESTful API"></a>使用Node.js构建RESTful API</h1><h2 id="安装Node-js和Express"><a href="#安装Node-js和Express" class="headerlink" title="安装Node.js和Express"></a>安装Node.js和Express</h2><p>首先,确保你已经安装了Node.js。然后使用npm安装Express框架:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install express</span><br></pre></td></tr></table></figure><h2 id="创建Express应用"><a href="#创建Express应用" class="headerlink" title="创建Express应用"></a>创建Express应用</h2><p>创建一个基本的Express应用:</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> express = <span class="built_in">require</span>(<span class="string">'express'</span>);</span><br><span class="line"><span class="keyword">const</span> app = <span class="title function_">express</span>();</span><br><span class="line"><span class="keyword">const</span> port = <span class="number">3000</span>;</span><br><span class="line"></span><br><span class="line">app.<span class="title function_">use</span>(express.<span class="title function_">json</span>());</span><br><span class="line"></span><br><span class="line">app.<span class="title function_">get</span>(<span class="string">'/'</span>, <span class="function">(<span class="params">req, res</span>) =></span> {</span><br><span class="line"> res.<span class="title function_">send</span>(<span class="string">'Hello World!'</span>);</span><br><span class="line">});</span><br><span class="line"></span><br><span class="line">app.<span class="title function_">listen</span>(port, <span class="function">() =></span> {</span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`Server is running on port <span class="subst">${port}</span>`</span>);</span><br><span class="line">});</span><br></pre></td></tr></table></figure><h2 id="定义RESTful-API路由"><a href="#定义RESTful-API路由" class="headerlink" title="定义RESTful API路由"></a>定义RESTful API路由</h2><p>以下是一个简单的CRUD示例:</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> items = [];</span><br><span class="line"></span><br><span class="line">app.<span class="title function_">post</span>(<span class="string">'/items'</span>, <span class="function">(<span class="params">req, res</span>) =></span> {</span><br><span class="line"> <span class="keyword">const</span> item = req.<span class="property">body</span>;</span><br><span class="line"> items.<span class="title function_">push</span>(item);</span><br><span class="line"> res.<span class="title function_">status</span>(<span class="number">201</span>).<span class="title function_">send</span>(item);</span><br><span class="line">});</span><br><span class="line"></span><br><span class="line">app.<span class="title function_">get</span>(<span class="string">'/items'</span>, <span class="function">(<span class="params">req, res</span>) =></span> {</span><br><span class="line"> res.<span class="title function_">send</span>(items);</span><br><span class="line">});</span><br><span class="line"></span><br><span class="line">app.<span class="title function_">get</span>(<span class="string">'/items/:id'</span>, <span class="function">(<span class="params">req, res</span>) =></span> {</span><br><span class="line"> <span class="keyword">const</span> item = items.<span class="title function_">find</span>(<span class="function"><span class="params">i</span> =></span> i.<span class="property">id</span> === <span class="built_in">parseInt</span>(req.<span class="property">params</span>.<span class="property">id</span>));</span><br><span class="line"> <span class="keyword">if</span> (!item) <span class="keyword">return</span> res.<span class="title function_">status</span>(<span class="number">404</span>).<span class="title function_">send</span>(<span class="string">'Item not found'</span>);</span><br><span class="line"> res.<span class="title function_">send</span>(item);</span><br><span class="line">});</span><br><span class="line"></span><br><span class="line">app.<span class="title function_">put</span>(<span class="string">'/items/:id'</span>, <span class="function">(<span class="params">req, res</span>) =></span> {</span><br><span class="line"> <span class="keyword">const</span> item = items.<span class="title function_">find</span>(<span class="function"><span class="params">i</span> =></span> i.<span class="property">id</span> === <span class="built_in">parseInt</span>(req.<span class="property">params</span>.<span class="property">id</span>));</span><br><span class="line"> <span class="keyword">if</span> (!item) <span class="keyword">return</span> res.<span class="title function_">status</span>(<span class="number">404</span>).<span class="title function_">send</span>(<span class="string">'Item not found'</span>);</span><br><span class="line"></span><br><span class="line"> item.<span class="property">name</span> = req.<span class="property">body</span>.<span class="property">name</span>;</span><br><span class="line"> res.<span class="title function_">send</span>(item);</span><br><span class="line">});</span><br><span class="line"></span><br><span class="line">app.<span class="title function_">delete</span>(<span class="string">'/items/:id'</span>, <span class="function">(<span class="params">req, res</span>) =></span> {</span><br><span class="line"> <span class="keyword">const</span> itemIndex = items.<span class="title function_">findIndex</span>(<span class="function"><span class="params">i</span> =></span> i.<span class="property">id</span> === <span class="built_in">parseInt</span>(req.<span class="property">params</span>.<span class="property">id</span>));</span><br><span class="line"> <span class="keyword">if</span> (itemIndex === -<span class="number">1</span>) <span class="keyword">return</span> res.<span class="title function_">status</span>(<span class="number">404</span>).<span class="title function_">send</span>(<span class="string">'Item not found'</span>);</span><br><span class="line"></span><br><span class="line"> items.<span class="title function_">splice</span>(itemIndex, <span class="number">1</span>);</span><br><span class="line"> res.<span class="title function_">status</span>(<span class="number">204</span>).<span class="title function_">send</span>();</span><br><span class="line">});</span><br></pre></td></tr></table></figure><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>使用Node.js和Express构建RESTful API非常简单且高效,这使得它成为构建后端服务的流行选择。</p><h2 id="思维导图"><a href="#思维导图" class="headerlink" title="思维导图"></a>思维导图</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">graph TD;</span><br><span class="line"> A[使用Node.js构建RESTful API] --> B[安装Node.js和Express]</span><br><span class="line"> A --> C[创建Express应用]</span><br><span class="line"> A --> D[定义RESTful API路由]</span><br></pre></td></tr></table></figure>]]></content>
</entry>
<entry>
<title>学习Go语言的基础知识</title>
<link href="/2025/03/23/article8/"/>
<url>/2025/03/23/article8/</url>
<content type="html"><![CDATA[<h1 id="学习Go语言的基础知识"><a href="#学习Go语言的基础知识" class="headerlink" title="学习Go语言的基础知识"></a>学习Go语言的基础知识</h1><h2 id="Go语言简介"><a href="#Go语言简介" class="headerlink" title="Go语言简介"></a>Go语言简介</h2><p>Go语言是由Google开发的一种静态类型、编译型编程语言,具有简单、高效和并发编程的特点。</p><h2 id="基本语法"><a href="#基本语法" class="headerlink" title="基本语法"></a>基本语法</h2><p>以下是一个简单的Go程序:</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">"fmt"</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> {</span><br><span class="line"> fmt.Println(<span class="string">"Hello, World!"</span>)</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="数据类型"><a href="#数据类型" class="headerlink" title="数据类型"></a>数据类型</h2><p>Go语言支持多种数据类型,包括基本类型、复合类型和引用类型。</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> a <span class="type">int</span> = <span class="number">10</span></span><br><span class="line"><span class="keyword">var</span> b <span class="type">float64</span> = <span class="number">3.14</span></span><br><span class="line"><span class="keyword">var</span> c <span class="type">string</span> = <span class="string">"Hello"</span></span><br><span class="line"><span class="keyword">var</span> d <span class="type">bool</span> = <span class="literal">true</span></span><br></pre></td></tr></table></figure><h2 id="控制结构"><a href="#控制结构" class="headerlink" title="控制结构"></a>控制结构</h2><p>Go语言提供了丰富的控制结构,包括条件语句、循环语句和选择语句。</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> a > b {</span><br><span class="line"> fmt.Println(<span class="string">"a is greater than b"</span>)</span><br><span class="line">} <span class="keyword">else</span> {</span><br><span class="line"> fmt.Println(<span class="string">"a is not greater than b"</span>)</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i := <span class="number">0</span>; i < <span class="number">10</span>; i++ {</span><br><span class="line"> fmt.Println(i)</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>Go语言是一种功能强大的编程语言,适合用于构建高效和可扩展的应用程序。通过学习其基础知识,你可以快速上手并开始编写Go程序。</p><h2 id="思维导"><a href="#思维导" class="headerlink" title="思维导"></a>思维导</h2>]]></content>
</entry>
<entry>
<title>理解Kubernetes中的Pod</title>
<link href="/2025/03/23/article9/"/>
<url>/2025/03/23/article9/</url>
<content type="html"><![CDATA[<h1 id="理解Kubernetes中的Pod"><a href="#理解Kubernetes中的Pod" class="headerlink" title="理解Kubernetes中的Pod"></a>理解Kubernetes中的Pod</h1><h2 id="什么是Pod?"><a href="#什么是Pod?" class="headerlink" title="什么是Pod?"></a>什么是Pod?</h2><p>Pod是Kubernetes中最小的可部署单元,通常包含一个或多个容器,这些容器共享存储和网络资源。</p><h2 id="Pod的结构"><a href="#Pod的结构" class="headerlink" title="Pod的结构"></a>Pod的结构</h2><p>一个Pod由以下部分组成:</p><ol><li><strong>容器</strong>:Pod中的应用程序运行在容器中。</li><li><strong>存储卷</strong>:Pod中的容器可以共享存储卷,用于持久化数据。</li><li><strong>网络</strong>:Pod中的容器共享一个IP地址和端口空间。</li></ol><h2 id="创建Pod"><a href="#创建Pod" class="headerlink" title="创建Pod"></a>创建Pod</h2><p>使用YAML文件创建Pod的示例:</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Pod</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"> <span class="attr">name:</span> <span class="string">my-pod</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"> <span class="attr">containers:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">my-container</span></span><br><span class="line"> <span class="attr">image:</span> <span class="string">nginx</span></span><br><span class="line"> <span class="attr">ports:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">containerPort:</span> <span class="number">80</span></span><br></pre></td></tr></table></figure><p>应用Pod配置:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">kubectl apply -f my-pod.yaml</span><br></pre></td></tr></table></figure><h2 id="查看Pod状态"><a href="#查看Pod状态" class="headerlink" title="查看Pod状态"></a>查看Pod状态</h2><p>查看Pod的状态:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">kubectl get pods</span><br></pre></td></tr></table></figure><p>查看Pod的详细信息:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">kubectl describe pod my-pod</span><br></pre></td></tr></table></figure><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>Pod是Kubernetes中的核心概念,理解Pod的结构和使用方法是掌握Kubernetes的重要一步。通过Pod,开发者可以灵活地管理和编排容器化应用。</p><h2 id="思维导图"><a href="#思维导图" class="headerlink" title="思维导图"></a>思维导图</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">graph TD;</span><br><span class="line"> A[理解Kubernetes中的Pod] --> B[什么是Pod]</span><br><span class="line"> A --> C[Pod的结构]</span><br><span class="line"> A --> D[创建Pod]</span><br><span class="line"> A --> E[查看Pod状态]</span><br></pre></td></tr></table></figure>]]></content>
</entry>
<entry>
<title>免费的LinuxONE服务器</title>
<link href="/2025/03/10/%E6%80%8E%E6%A0%B7%E7%99%BD%E5%AB%96LinuxOne%E5%85%8D%E8%B4%B9%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
<url>/2025/03/10/%E6%80%8E%E6%A0%B7%E7%99%BD%E5%AB%96LinuxOne%E5%85%8D%E8%B4%B9%E6%9C%8D%E5%8A%A1%E5%99%A8/</url>
<content type="html"><![CDATA[<p>今天来教大家白嫖一个免费的服务器,<strong>他不用海外的信用卡,只需要用电子邮箱即可</strong>!</p><p><strong>声明:这是一台S390X架构的服务器,很多软件都无法兼容.</strong></p><p>只教怎么创建服务器,不教ssh和链接方法,自行搜索!</p><p>服务器详细信息:</p><p><strong>OS: Ubuntu 22.04.1 LTS s390x</strong></p><p><strong>CPU: 8561 (2) @ 5.200GHz</strong></p><p><strong>Memory: 4GB</strong></p><p><strong>诚意也是非常到位</strong></p><p>准备:一个电子邮箱</p><p>访问<a href="https://linuxone.cloud.marist.edu/">linuxone官网</a>.点击Register,然后按照图片内容填写.接着到邮件去激活.</p><p>点击Vistual Servers.点击Create,并按你的需要填写.然后享受这台服务器吧!</p>]]></content>
</entry>
<entry>
<title>Blogger国内访问方法</title>
<link href="/2025/03/10/Blogger%E5%9B%BD%E5%86%85%E8%AE%BF%E9%97%AE%E6%96%B9%E6%B3%95/"/>
<url>/2025/03/10/Blogger%E5%9B%BD%E5%86%85%E8%AE%BF%E9%97%AE%E6%96%B9%E6%B3%95/</url>
<content type="html"><![CDATA[<p>Blogger是一个非常有实力的免费博客平台,一贯保持无广告,不作恶的原则.它既<strong>免去了Hexo,Hugo麻烦的DEPLOY操作,也没有CSDN那样的广告</strong>.但是它在国内被墙了(来自东方长城的力量),因此我们可以绑定自定义域名来绕过防火墙.</p><p><del>(当然你可以选择是否开启广告)</del></p><p>你可以不用它提供的*.blogspot.com域名,绑定自定义域名.</p><p>下面,我将一步步教你怎么拥有自己的博客,而且在国内正常访问.</p><p>首先,访问<a href="//blogger.com">Blogger官网</a>,然后点击”新建博客”,使用Google账号登陆.</p><p>然后点击左上角,再点击新建博客.</p><p>输入你的网站显示的标题,点击”下一步”.</p><p>然后输入一个域名(Blogspot),再点击保存.</p><p>现在点击”查看博客”,就可以看到你的博客了,点击右上角新建博文写文章.</p><p>但是Blogger在国内被墙了,所以我们要绑定自定义域名.(以us.kg为例)</p><p>访问<a href="https://register.us.kg/">注册us.kg官网</a>,注册后,按照提示,进行KYC验证.</p><p>KYC验证通过后,访问<a href="https://register.us.kg/panel/register">获取域名</a><br>输入一个域名,点击check.</p><p>当看到这个页面时,不要关闭,也不要输入任何内容.</p><p>在<a href="https://dash.cloudflare.com/">Cloudflare</a>注册帐号,然后点击”添加域”,输入你的域名,点击”继续”.</p><p>选择”Free”计划,继续.</p><p>当看到这个页面时,不要关闭,也不要输入任何内容.</p><p>回到Blogger点击”设置”,找到”发布”,再点击”自定义域名”.</p><p>输入网址后,点击”保存”,不要关闭.(<strong>注意:要在网站前加”www.</strong>“)</p><p>回到Cloudflare,点击”添加记录”,类型选择”CNAME”,名称填写”www”,目标填写”ghs.google.com”.</p><p><strong>注意:一定要把代理关掉,否则无法验证!!!</strong></p><p>再添加一个(验证CNAME),名称填第二个CNAME所显示的名称,目标网域填第二个.</p><p>然后点击继续.</p><p>滑到下面”更新名称服务器”,复制两个<em>Cloudflare名称服务器.</em></p><p>回到DomainRegistration这个页面,把这两个Cloudflare名称服务器粘贴进去,然后点击Register.</p><p>显示success后关闭.</p><p>回到Blogger再点击一次保存,即可保存.</p><p>把这张图里的3个开关全部打开,然后等待15分钟后就可以了.</p><p>现在,你的博客就可以在国内访问了.</p><p>感谢观看!</p>]]></content>
</entry>
<entry>
<title>Minecraft更新公告</title>
<link href="/2025/03/09/%E6%9B%B4%E6%96%B0%E5%85%AC%E5%91%8A/"/>
<url>/2025/03/09/%E6%9B%B4%E6%96%B0%E5%85%AC%E5%91%8A/</url>
<content type="html"><![CDATA[<p><strong>Minecraft已完成全面汉化!</strong><br>新增了<strong>演示模式(Demo Mode)</strong>,以丰富游戏体验.<br>内置PBR光影也已经升级.</p>]]></content>
</entry>
<entry>
<title>生产环境Docker部署的7个优化技巧</title>
<link href="/2024/03/22/%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83Docker%E9%83%A8%E7%BD%B2%E7%9A%847%E4%B8%AA%E4%BC%98%E5%8C%96%E6%8A%80%E5%B7%A7/"/>
<url>/2024/03/22/%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83Docker%E9%83%A8%E7%BD%B2%E7%9A%847%E4%B8%AA%E4%BC%98%E5%8C%96%E6%8A%80%E5%B7%A7/</url>
<content type="html"><![CDATA[<hr><h2 id="1-镜像瘦身三剑客"><a href="#1-镜像瘦身三剑客" class="headerlink" title="1. 镜像瘦身三剑客"></a>1. 镜像瘦身三剑客</h2><h3 id="多阶段构建实战"><a href="#多阶段构建实战" class="headerlink" title="多阶段构建实战"></a>多阶段构建实战</h3><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 构建阶段</span></span><br><span class="line"><span class="keyword">FROM</span> golang:<span class="number">1.20</span> AS builder</span><br><span class="line"><span class="keyword">WORKDIR</span><span class="language-bash"> /app</span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> . .</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> CGO_ENABLED=0 go build -o myapp .</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 运行阶段</span></span><br><span class="line"><span class="keyword">FROM</span> alpine:<span class="number">3.18</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> apk --no-cache add ca-certificates</span></span><br><span class="line"><span class="keyword">WORKDIR</span><span class="language-bash"> /root/</span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> --from=builder /app/myapp .</span></span><br><span class="line"><span class="keyword">CMD</span><span class="language-bash"> [<span class="string">"./myapp"</span>]</span></span><br></pre></td></tr></table></figure><h3 id="基础镜像对比"><a href="#基础镜像对比" class="headerlink" title="基础镜像对比"></a>基础镜像对比</h3><table><thead><tr><th>镜像类型</th><th>大小</th><th>特点</th></tr></thead><tbody><tr><td>ubuntu:22.04</td><td>72.8MB</td><td>完整系统工具</td></tr><tr><td>debian:12</td><td>54.3MB</td><td>精简版基础系统</td></tr><tr><td>alpine:3.18</td><td>5.7MB</td><td>最小化musl libc环境</td></tr><tr><td>scratch</td><td>0MB</td><td>空镜像(需静态编译)</td></tr></tbody></table><hr><h2 id="2-安全加固四要素"><a href="#2-安全加固四要素" class="headerlink" title="2. 安全加固四要素"></a>2. 安全加固四要素</h2><h3 id="安全配置示例"><a href="#安全配置示例" class="headerlink" title="安全配置示例"></a>安全配置示例</h3><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">FROM</span> alpine:<span class="number">3.18</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建非root用户</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> addgroup -S appgroup && adduser -S appuser -G appgroup</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置只读文件系统</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> <span class="built_in">mkdir</span> -p /app/data && <span class="built_in">chown</span> appuser:appgroup /app/data</span></span><br><span class="line"><span class="keyword">VOLUME</span><span class="language-bash"> /app/data</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">USER</span> appuser</span><br><span class="line"></span><br><span class="line"><span class="comment"># 移除默认能力</span></span><br><span class="line">docker <span class="keyword">run</span><span class="language-bash"> --cap-drop=ALL --cap-add=NET_BIND_SERVICE ...</span></span><br></pre></td></tr></table></figure><h3 id="安全扫描工具"><a href="#安全扫描工具" class="headerlink" title="安全扫描工具"></a>安全扫描工具</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 使用Trivy扫描镜像漏洞</span></span><br><span class="line">trivy image myapp:1.0</span><br><span class="line"></span><br><span class="line"><span class="comment"># 输出示例</span></span><br><span class="line">myapp:1.0 (alpine 3.18.3)</span><br><span class="line">=========================</span><br><span class="line">Total: 2 (HIGH: 2)</span><br><span class="line"></span><br><span class="line">+---------+------------------+----------+-------------------+---------------+---------------------------------------+</span><br><span class="line">| LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION | TITLE |</span><br><span class="line">+---------+------------------+----------+-------------------+---------------+---------------------------------------+</span><br><span class="line">| openssl | CVE-2023-3817 | HIGH | 3.1.1-r1 | 3.1.2-r0 | Excessive <span class="keyword">time</span> spent checking invalid |</span><br><span class="line">| | | | | | RSA public keys <span class="keyword">in</span> X.509 certificates</span><br></pre></td></tr></table></figure><hr><h2 id="3-资源限制黄金法则"><a href="#3-资源限制黄金法则" class="headerlink" title="3. 资源限制黄金法则"></a>3. 资源限制黄金法则</h2><h3 id="容器资源配额"><a href="#容器资源配额" class="headerlink" title="容器资源配额"></a>容器资源配额</h3><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># docker-compose.yml示例</span></span><br><span class="line"><span class="attr">services:</span></span><br><span class="line"> <span class="attr">web:</span></span><br><span class="line"> <span class="attr">image:</span> <span class="string">nginx:alpine</span></span><br><span class="line"> <span class="attr">deploy:</span></span><br><span class="line"> <span class="attr">resources:</span></span><br><span class="line"> <span class="attr">limits:</span></span><br><span class="line"> <span class="attr">cpus:</span> <span class="string">'0.5'</span></span><br><span class="line"> <span class="attr">memory:</span> <span class="string">512M</span></span><br><span class="line"> <span class="attr">reservations:</span></span><br><span class="line"> <span class="attr">memory:</span> <span class="string">256M</span></span><br><span class="line"> <span class="attr">ports:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">"80:80"</span></span><br></pre></td></tr></table></figure><h3 id="内存限制策略"><a href="#内存限制策略" class="headerlink" title="内存限制策略"></a>内存限制策略</h3><table><thead><tr><th>参数</th><th>作用</th><th>生产建议值</th></tr></thead><tbody><tr><td>–memory</td><td>硬性内存限制</td><td>物理内存的80%</td></tr><tr><td>–memory-swap</td><td>内存+交换分区总限制</td><td>建议设置为0</td></tr><tr><td>–memory-reservation</td><td>内存软限制(触发告警)</td><td>物理内存的70%</td></tr><tr><td>–oom-kill-disable</td><td>禁止OOM Killer</td><td>生产环境禁用</td></tr></tbody></table><hr><h2 id="4-构建缓存优化"><a href="#4-构建缓存优化" class="headerlink" title="4. 构建缓存优化"></a>4. 构建缓存优化</h2><h3 id="Dockerfile优化前后对比"><a href="#Dockerfile优化前后对比" class="headerlink" title="Dockerfile优化前后对比"></a>Dockerfile优化前后对比</h3><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 优化前</span></span><br><span class="line"><span class="keyword">FROM</span> node:<span class="number">18</span></span><br><span class="line"><span class="keyword">WORKDIR</span><span class="language-bash"> /app</span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> . .</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> npm install</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> npm run build</span></span><br><span class="line"><span class="keyword">CMD</span><span class="language-bash"> [<span class="string">"node"</span>, <span class="string">"dist/main.js"</span>]</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 优化后</span></span><br><span class="line"><span class="keyword">FROM</span> node:<span class="number">18</span> AS builder</span><br><span class="line"><span class="keyword">WORKDIR</span><span class="language-bash"> /app</span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> package*.json ./</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> npm ci --production</span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> src ./src</span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> tsconfig.json ./</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> npm run build</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">FROM</span> node:<span class="number">18</span>-alpine</span><br><span class="line"><span class="keyword">WORKDIR</span><span class="language-bash"> /app</span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> --from=builder /app/package*.json ./</span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> --from=builder /app/node_modules ./node_modules</span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> --from=builder /app/dist ./dist</span></span><br><span class="line"><span class="keyword">CMD</span><span class="language-bash"> [<span class="string">"node"</span>, <span class="string">"dist/main.js"</span>]</span></span><br></pre></td></tr></table></figure><h3 id="构建时间对比"><a href="#构建时间对比" class="headerlink" title="构建时间对比"></a>构建时间对比</h3><table><thead><tr><th>阶段</th><th>优化前</th><th>优化后</th><th>提升幅度</th></tr></thead><tbody><tr><td>依赖安装</td><td>45s</td><td>18s</td><td>60%</td></tr><tr><td>构建过程</td><td>32s</td><td>28s</td><td>12.5%</td></tr><tr><td>总镜像大小</td><td>1.2GB</td><td>256MB</td><td>78%</td></tr></tbody></table><hr><h2 id="5-高效日志管理"><a href="#5-高效日志管理" class="headerlink" title="5. 高效日志管理"></a>5. 高效日志管理</h2><h3 id="日志驱动配置"><a href="#日志驱动配置" class="headerlink" title="日志驱动配置"></a>日志驱动配置</h3><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"log-driver"</span><span class="punctuation">:</span> <span class="string">"json-file"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"log-opts"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"max-size"</span><span class="punctuation">:</span> <span class="string">"10m"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"max-file"</span><span class="punctuation">:</span> <span class="string">"5"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"compress"</span><span class="punctuation">:</span> <span class="string">"true"</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure><h3 id="日志收集架构"><a href="#日志收集架构" class="headerlink" title="日志收集架构"></a>日志收集架构</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">[容器] --> [Fluentd] --> [Elasticsearch]</span><br><span class="line"> │</span><br><span class="line"> └─>[AWS CloudWatch]</span><br></pre></td></tr></table></figure><hr><h2 id="6-健康检查策略"><a href="#6-健康检查策略" class="headerlink" title="6. 健康检查策略"></a>6. 健康检查策略</h2><h3 id="探针配置示例"><a href="#探针配置示例" class="headerlink" title="探针配置示例"></a>探针配置示例</h3><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">healthcheck:</span></span><br><span class="line"> <span class="attr">test:</span> [<span class="string">"CMD-SHELL"</span>, <span class="string">"curl -f http://localhost:8080/health || exit 1"</span>]</span><br><span class="line"> <span class="attr">interval:</span> <span class="string">30s</span></span><br><span class="line"> <span class="attr">timeout:</span> <span class="string">5s</span></span><br><span class="line"> <span class="attr">retries:</span> <span class="number">3</span></span><br><span class="line"> <span class="attr">start_period:</span> <span class="string">10s</span></span><br></pre></td></tr></table></figure><h3 id="探针类型对比"><a href="#探针类型对比" class="headerlink" title="探针类型对比"></a>探针类型对比</h3><table><thead><tr><th>类型</th><th>检查目标</th><th>应用场景</th></tr></thead><tbody><tr><td>HTTP探针</td><td>指定端口的HTTP状态码</td><td>Web服务</td></tr><tr><td>TCP探针</td><td>端口是否开放</td><td>数据库/中间件</td></tr><tr><td>命令探针</td><td>执行命令的返回值</td><td>复杂状态检查</td></tr></tbody></table><hr><h2 id="7-镜像仓库优化"><a href="#7-镜像仓库优化" class="headerlink" title="7. 镜像仓库优化"></a>7. 镜像仓库优化</h2><h3 id="镜像标签策略"><a href="#镜像标签策略" class="headerlink" title="镜像标签策略"></a>镜像标签策略</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 推送多架构镜像</span></span><br><span class="line">docker buildx build --platform linux/amd64,linux/arm64 -t myrepo/myapp:1.0 .</span><br><span class="line"></span><br><span class="line"><span class="comment"># 标记为最新版</span></span><br><span class="line">docker tag myrepo/myapp:1.0 myrepo/myapp:latest</span><br></pre></td></tr></table></figure><h3 id="镜像清理脚本"><a href="#镜像清理脚本" class="headerlink" title="镜像清理脚本"></a>镜像清理脚本</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="comment"># 保留最近3个标签</span></span><br><span class="line">docker images | grep myapp | awk <span class="string">'{print $3}'</span> | <span class="built_in">tail</span> -n +4 | xargs docker rmi -f</span><br></pre></td></tr></table></figure><hr><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>通过实施这7个维度的优化策略,可使生产环境Docker容器在安全性、性能和可维护性方面达到企业级标准。建议结合CI/CD流水线实现自动化优化,并定期进行镜像漏洞扫描。</p><blockquote><p><strong>延伸阅读</strong>: </p><ul><li>Docker官方最佳实践文档 </li><li>《Kubernetes生产化实践指南》 </li><li>CIS Docker安全基准</li></ul></blockquote>]]></content>
</entry>
<entry>
<title>React Hooks进阶:10个高效开发技巧</title>
<link href="/2024/03/21/ReactHooks%E8%BF%9B%E9%98%B610%E4%B8%AA%E9%AB%98%E6%95%88%E5%BC%80%E5%8F%91%E6%8A%80%E5%B7%A7/"/>
<url>/2024/03/21/ReactHooks%E8%BF%9B%E9%98%B610%E4%B8%AA%E9%AB%98%E6%95%88%E5%BC%80%E5%8F%91%E6%8A%80%E5%B7%A7/</url>
<content type="html"><![CDATA[<h2 id="1-精准控制useEffect依赖"><a href="#1-精准控制useEffect依赖" class="headerlink" title="1. 精准控制useEffect依赖"></a>1. 精准控制useEffect依赖</h2><h3 id="黄金法则"><a href="#黄金法则" class="headerlink" title="黄金法则"></a>黄金法则</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 错误示例:缺少依赖</span></span><br><span class="line"><span class="title function_">useEffect</span>(<span class="function">() =></span> {</span><br><span class="line"> <span class="title function_">fetchData</span>(params.<span class="property">id</span>);</span><br><span class="line">}, []);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 正确示例:完整声明依赖</span></span><br><span class="line"><span class="title function_">useEffect</span>(<span class="function">() =></span> {</span><br><span class="line"> <span class="keyword">const</span> controller = <span class="keyword">new</span> <span class="title class_">AbortController</span>();</span><br><span class="line"> <span class="title function_">fetchData</span>(params.<span class="property">id</span>, { <span class="attr">signal</span>: controller.<span class="property">signal</span> });</span><br><span class="line"> <span class="keyword">return</span> <span class="function">() =></span> controller.<span class="title function_">abort</span>();</span><br><span class="line">}, [params.<span class="property">id</span>]); <span class="comment">// ✅ 明确声明所有依赖项</span></span><br></pre></td></tr></table></figure><h3 id="依赖管理策略"><a href="#依赖管理策略" class="headerlink" title="依赖管理策略"></a>依赖管理策略</h3><table><thead><tr><th>场景</th><th>解决方案</th><th>工具支持</th></tr></thead><tbody><tr><td>频繁变化的依赖</td><td>使用useReducer</td><td>useReducer+dispatch</td></tr><tr><td>对象/数组依赖</td><td>深度比较或拆解基本类型</td><td>lodash.isEqual</td></tr><tr><td>函数依赖</td><td>useCallback包裹</td><td>eslint-plugin-react-hooks</td></tr></tbody></table><hr><h2 id="2-自定义Hook工程化实践"><a href="#2-自定义Hook工程化实践" class="headerlink" title="2. 自定义Hook工程化实践"></a>2. 自定义Hook工程化实践</h2><h3 id="数据请求Hook示例"><a href="#数据请求Hook示例" class="headerlink" title="数据请求Hook示例"></a>数据请求Hook示例</h3><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> useFetch<T>(<span class="attr">url</span>: <span class="built_in">string</span>, <span class="attr">options</span>?: <span class="title class_">RequestInit</span>) {</span><br><span class="line"> <span class="keyword">const</span> [data, setData] = useState<T | <span class="literal">null</span>>(<span class="literal">null</span>);</span><br><span class="line"> <span class="keyword">const</span> [error, setError] = useState<<span class="title class_">Error</span> | <span class="literal">null</span>>(<span class="literal">null</span>);</span><br><span class="line"> <span class="keyword">const</span> [loading, setLoading] = <span class="title function_">useState</span>(<span class="literal">true</span>);</span><br><span class="line"></span><br><span class="line"> <span class="title function_">useEffect</span>(<span class="function">() =></span> {</span><br><span class="line"> <span class="keyword">const</span> abortController = <span class="keyword">new</span> <span class="title class_">AbortController</span>();</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">const</span> <span class="title function_">fetchData</span> = <span class="keyword">async</span> (<span class="params"></span>) => {</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="keyword">const</span> response = <span class="keyword">await</span> <span class="title function_">fetch</span>(url, {</span><br><span class="line"> ...options,</span><br><span class="line"> <span class="attr">signal</span>: abortController.<span class="property">signal</span></span><br><span class="line"> });</span><br><span class="line"> <span class="keyword">const</span> json = <span class="keyword">await</span> response.<span class="title function_">json</span>();</span><br><span class="line"> <span class="title function_">setData</span>(json);</span><br><span class="line"> } <span class="keyword">catch</span> (err) {</span><br><span class="line"> <span class="keyword">if</span> (!abortController.<span class="property">signal</span>.<span class="property">aborted</span>) {</span><br><span class="line"> <span class="title function_">setError</span>(err <span class="keyword">as</span> <span class="title class_">Error</span>);</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">finally</span> {</span><br><span class="line"> <span class="title function_">setLoading</span>(<span class="literal">false</span>);</span><br><span class="line"> }</span><br><span class="line"> };</span><br><span class="line"></span><br><span class="line"> <span class="title function_">fetchData</span>();</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="function">() =></span> abortController.<span class="title function_">abort</span>();</span><br><span class="line"> }, [url, options]);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> { data, error, loading };</span><br><span class="line">}</span><br></pre></td></tr></table></figure><hr><h2 id="3-性能优化三重奏"><a href="#3-性能优化三重奏" class="headerlink" title="3. 性能优化三重奏"></a>3. 性能优化三重奏</h2><h3 id="优化策略对比"><a href="#优化策略对比" class="headerlink" title="优化策略对比"></a>优化策略对比</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 未优化组件:每次渲染都重新计算</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">List</span>(<span class="params">{ items }</span>) {</span><br><span class="line"> <span class="keyword">const</span> filtered = items.<span class="title function_">filter</span>(...); <span class="comment">// 🚫 重复计算</span></span><br><span class="line"> </span><br><span class="line"> <span class="keyword">return</span> <span class="language-xml"><span class="tag"><<span class="name">div</span>></span>{filtered.map(...)}<span class="tag"></<span class="name">div</span>></span></span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 优化后组件:使用useMemo缓存</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">OptimizedList</span>(<span class="params">{ items }</span>) {</span><br><span class="line"> <span class="keyword">const</span> filtered = <span class="title function_">useMemo</span>(</span><br><span class="line"> <span class="function">() =></span> items.<span class="title function_">filter</span>(...), </span><br><span class="line"> [items] <span class="comment">// ✅ 依赖项变更时才重新计算</span></span><br><span class="line"> );</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">return</span> <span class="language-xml"><span class="tag"><<span class="name">div</span>></span>{filtered.map(...)}<span class="tag"></<span class="name">div</span>></span></span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="渲染性能检测"><a href="#渲染性能检测" class="headerlink" title="渲染性能检测"></a>渲染性能检测</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 使用React DevTools的Profiler组件</span></span><br><span class="line"><span class="keyword">import</span> { <span class="title class_">Profiler</span> } <span class="keyword">from</span> <span class="string">'react'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">onRender</span> = (<span class="params">id, phase, actualDuration</span>) => {</span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`<span class="subst">${id}</span> <span class="subst">${phase}</span>耗时: <span class="subst">${actualDuration}</span>ms`</span>);</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">App</span>(<span class="params"></span>) {</span><br><span class="line"> <span class="keyword">return</span> (</span><br><span class="line"> <span class="language-xml"><span class="tag"><<span class="name">Profiler</span> <span class="attr">id</span>=<span class="string">"Navigation"</span> <span class="attr">onRender</span>=<span class="string">{onRender}</span>></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">Navigation</span> /></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"></<span class="name">Profiler</span>></span></span></span><br><span class="line"> );</span><br><span class="line">}</span><br></pre></td></tr></table></figure><hr><h2 id="4-状态提升与上下文共享"><a href="#4-状态提升与上下文共享" class="headerlink" title="4. 状态提升与上下文共享"></a>4. 状态提升与上下文共享</h2><h3 id="Context优化模式"><a href="#Context优化模式" class="headerlink" title="Context优化模式"></a>Context优化模式</h3><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 创建优化的Context</span></span><br><span class="line"><span class="keyword">const</span> <span class="title class_">UserContext</span> = <span class="title class_">React</span>.<span class="property">createContext</span><{</span><br><span class="line"> <span class="attr">user</span>: <span class="title class_">User</span>;</span><br><span class="line"> <span class="attr">update</span>: <span class="function">(<span class="params"><span class="attr">user</span>: <span class="title class_">User</span></span>) =></span> <span class="built_in">void</span>;</span><br><span class="line">}>(<span class="literal">null</span>!);</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">UserProvider</span>(<span class="params">{ children }</span>) {</span><br><span class="line"> <span class="keyword">const</span> [user, setUser] = <span class="title function_">useState</span>(initialUser);</span><br><span class="line"> </span><br><span class="line"> <span class="comment">// 使用useCallback避免Provider值不必要变化</span></span><br><span class="line"> <span class="keyword">const</span> updateUser = <span class="title function_">useCallback</span>(<span class="function">(<span class="params"><span class="attr">newUser</span>: <span class="title class_">User</span></span>) =></span> {</span><br><span class="line"> <span class="title function_">setUser</span>(<span class="function"><span class="params">prev</span> =></span> ({ ...prev, ...newUser }));</span><br><span class="line"> }, []);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">const</span> value = <span class="title function_">useMemo</span>(</span><br><span class="line"> <span class="function">() =></span> ({ user, <span class="attr">update</span>: updateUser }),</span><br><span class="line"> [user, updateUser]</span><br><span class="line"> );</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> (</span><br><span class="line"> <span class="language-xml"><span class="tag"><<span class="name">UserContext.Provider</span> <span class="attr">value</span>=<span class="string">{value}</span>></span></span></span><br><span class="line"><span class="language-xml"> {children}</span></span><br><span class="line"><span class="language-xml"> <span class="tag"></<span class="name">UserContext.Provider</span>></span></span></span><br><span class="line"> );</span><br><span class="line">}</span><br></pre></td></tr></table></figure><hr><h2 id="5-复杂状态管理方案"><a href="#5-复杂状态管理方案" class="headerlink" title="5. 复杂状态管理方案"></a>5. 复杂状态管理方案</h2><h3 id="状态机实现示例"><a href="#状态机实现示例" class="headerlink" title="状态机实现示例"></a>状态机实现示例</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> { useReducer } <span class="keyword">from</span> <span class="string">'react'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> initialState = {</span><br><span class="line"> <span class="attr">status</span>: <span class="string">'idle'</span>,</span><br><span class="line"> <span class="attr">data</span>: <span class="literal">null</span>,</span><br><span class="line"> <span class="attr">error</span>: <span class="literal">null</span></span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">fetchReducer</span>(<span class="params">state, action</span>) {</span><br><span class="line"> <span class="keyword">switch</span> (action.<span class="property">type</span>) {</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'FETCH_START'</span>:</span><br><span class="line"> <span class="keyword">return</span> { ...state, <span class="attr">status</span>: <span class="string">'pending'</span> };</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'FETCH_SUCCESS'</span>:</span><br><span class="line"> <span class="keyword">return</span> { <span class="attr">status</span>: <span class="string">'resolved'</span>, <span class="attr">data</span>: action.<span class="property">payload</span>, <span class="attr">error</span>: <span class="literal">null</span> };</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'FETCH_FAILURE'</span>:</span><br><span class="line"> <span class="keyword">return</span> { <span class="attr">status</span>: <span class="string">'rejected'</span>, <span class="attr">data</span>: <span class="literal">null</span>, <span class="attr">error</span>: action.<span class="property">error</span> };</span><br><span class="line"> <span class="attr">default</span>:</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">Error</span>();</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">useFetchMachine</span>(<span class="params">url</span>) {</span><br><span class="line"> <span class="keyword">const</span> [state, dispatch] = <span class="title function_">useReducer</span>(fetchReducer, initialState);</span><br><span class="line"></span><br><span class="line"> <span class="title function_">useEffect</span>(<span class="function">() =></span> {</span><br><span class="line"> <span class="title function_">dispatch</span>({ <span class="attr">type</span>: <span class="string">'FETCH_START'</span> });</span><br><span class="line"> </span><br><span class="line"> <span class="title function_">fetch</span>(url)</span><br><span class="line"> .<span class="title function_">then</span>(<span class="function"><span class="params">res</span> =></span> res.<span class="title function_">json</span>())</span><br><span class="line"> .<span class="title function_">then</span>(<span class="function"><span class="params">data</span> =></span> <span class="title function_">dispatch</span>({ <span class="attr">type</span>: <span class="string">'FETCH_SUCCESS'</span>, <span class="attr">payload</span>: data }))</span><br><span class="line"> .<span class="title function_">catch</span>(<span class="function"><span class="params">error</span> =></span> <span class="title function_">dispatch</span>({ <span class="attr">type</span>: <span class="string">'FETCH_FAILURE'</span>, error }));</span><br><span class="line"> }, [url]);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> state;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><hr><h2 id="进阶技巧汇总"><a href="#进阶技巧汇总" class="headerlink" title="进阶技巧汇总"></a>进阶技巧汇总</h2><ol><li><strong>依赖数组自动化</strong>:使用<a href="https://www.npmjs.com/package/eslint-plugin-react-hooks">eslint-plugin-react-hooks</a>自动检测依赖缺失</li><li><strong>Hook组合模式</strong>:将多个基础Hook组合成复合Hook<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">useWindowSize</span>(<span class="params"></span>) {</span><br><span class="line"> <span class="keyword">const</span> [size, setSize] = <span class="title function_">useState</span>({ <span class="attr">width</span>: <span class="number">0</span>, <span class="attr">height</span>: <span class="number">0</span> });</span><br><span class="line"> </span><br><span class="line"> <span class="title function_">useEffect</span>(<span class="function">() =></span> {</span><br><span class="line"> <span class="keyword">const</span> <span class="title function_">handler</span> = (<span class="params"></span>) => <span class="title function_">setSize</span>({</span><br><span class="line"> <span class="attr">width</span>: <span class="variable language_">window</span>.<span class="property">innerWidth</span>,</span><br><span class="line"> <span class="attr">height</span>: <span class="variable language_">window</span>.<span class="property">innerHeight</span></span><br><span class="line"> });</span><br><span class="line"> </span><br><span class="line"> <span class="variable language_">window</span>.<span class="title function_">addEventListener</span>(<span class="string">'resize'</span>, handler);</span><br><span class="line"> <span class="keyword">return</span> <span class="function">() =></span> <span class="variable language_">window</span>.<span class="title function_">removeEventListener</span>(<span class="string">'resize'</span>, handler);</span><br><span class="line"> }, []);</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">return</span> size;</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li><li><strong>调试技巧</strong>:使用<a href="https://github.com/welldone-software/why-did-you-render">useWhyDidYouUpdate</a>检测不必要的渲染</li></ol><hr><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>通过合理运用这些进阶技巧,开发者可以显著提升React应用的性能和可维护性。建议结合TypeScript类型系统,并持续关注React 19中即将推出的<a href="https://github.com/reactjs/rfcs/pull/220">use优化</a>等新特性。</p><blockquote><p><strong>扩展阅读</strong>: </p><ul><li>React官方Hooks API参考 </li><li>《Hooks in Depth》视频课程 </li><li>React Query状态管理库</li></ul></blockquote>]]></content>
</entry>
<entry>
<title>微服务架构中的六种核心设计模式</title>
<link href="/2024/03/20/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84%E4%B8%AD%E7%9A%84%E5%85%AD%E7%A7%8D%E6%A0%B8%E5%BF%83%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/"/>
<url>/2024/03/20/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84%E4%B8%AD%E7%9A%84%E5%85%AD%E7%A7%8D%E6%A0%B8%E5%BF%83%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/</url>
<content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>在数字化转型浪潮中,微服务架构已成为构建复杂系统的首选方案。本文将深入解析六大核心设计模式,通过实际代码示例和架构图,展示如何构建高可用、可扩展的分布式系统。</p><hr><h2 id="服务发现模式"><a href="#服务发现模式" class="headerlink" title="服务发现模式"></a>服务发现模式</h2><p>服务发现模式是微服务架构中通信层的核心设计模式之一。它通过动态实例管理和健康检查机制,确保服务能够被可靠地发现和调用。</p><h3 id="动态实例管理"><a href="#动态实例管理" class="headerlink" title="动态实例管理"></a>动态实例管理</h3><p>在微服务架构中,服务实例可能会动态增加或减少。服务发现模式通过注册中心(如 Eureka、Consul 或 Zookeeper)记录所有可用的服务实例,并实时更新其状态。</p><h3 id="健康检查机制"><a href="#健康检查机制" class="headerlink" title="健康检查机制"></a>健康检查机制</h3><p>健康检查机制确保只有健康的服务实例能够被调用。注册中心会定期检查服务实例的健康状况,并将不可用的实例从注册表中移除。</p><h3 id="客户端-服务端发现"><a href="#客户端-服务端发现" class="headerlink" title="客户端/服务端发现"></a>客户端/服务端发现</h3><ul><li><strong>客户端发现</strong>:客户端直接查询注册中心获取服务实例列表,并通过负载均衡策略选择目标实例。</li><li><strong>服务端发现</strong>:客户端请求被代理到服务端,服务端通过注册中心找到目标实例并转发请求。</li></ul><hr><h2 id="API网关模式"><a href="#API网关模式" class="headerlink" title="API网关模式"></a>API网关模式</h2><p>API 网关模式为微服务架构提供了一个统一的入口,简化了客户端与服务之间的交互。</p><h3 id="统一入口"><a href="#统一入口" class="headerlink" title="统一入口"></a>统一入口</h3><p>API 网关充当所有客户端请求的入口,屏蔽了后端服务的复杂性。它可以路由请求到不同的服务,并聚合多个服务的响应。</p><h3 id="安全防护"><a href="#安全防护" class="headerlink" title="安全防护"></a>安全防护</h3><p>API 网关可以实现身份验证、授权和数据加密等安全功能,保护后端服务免受恶意攻击。</p><h3 id="流量控制"><a href="#流量控制" class="headerlink" title="流量控制"></a>流量控制</h3><p>通过限流、熔断和负载均衡等机制,API 网关可以有效管理流量,防止服务过载。</p><hr><h2 id="断路器模式"><a href="#断路器模式" class="headerlink" title="断路器模式"></a>断路器模式</h2><p>断路器模式是容错层的重要设计模式,用于隔离故障并提高系统的稳定性。</p><h3 id="故障隔离"><a href="#故障隔离" class="headerlink" title="故障隔离"></a>故障隔离</h3><p>当某个服务出现故障时,断路器会阻止请求继续发送到该服务,从而避免故障扩散。</p><h3 id="自动恢复"><a href="#自动恢复" class="headerlink" title="自动恢复"></a>自动恢复</h3><p>断路器会定期尝试恢复连接,当目标服务恢复正常时,断路器会重新允许请求通过。</p><h3 id="降级策略"><a href="#降级策略" class="headerlink" title="降级策略"></a>降级策略</h3><p>在服务不可用时,断路器可以返回默认值或执行备用逻辑,确保系统的基本功能可用。</p><hr><h2 id="Saga事务模式"><a href="#Saga事务模式" class="headerlink" title="Saga事务模式"></a>Saga事务模式</h2><p>Saga 事务模式通过分布式事务管理,确保微服务之间的数据一致性。</p><h3 id="补偿事务"><a href="#补偿事务" class="headerlink" title="补偿事务"></a>补偿事务</h3><p>Saga 模式将事务拆分为一系列小的本地事务,每个事务都有对应的补偿操作,用于回滚失败的操作。</p><h3 id="编排式-协同式"><a href="#编排式-协同式" class="headerlink" title="编排式/协同式"></a>编排式/协同式</h3><ul><li><strong>编排式</strong>:由中央控制器负责管理事务的执行顺序。</li><li><strong>协同式</strong>:每个服务通过事件驱动的方式协同完成事务。</li></ul><h3 id="最终一致性"><a href="#最终一致性" class="headerlink" title="最终一致性"></a>最终一致性</h3><p>Saga 模式通过异步操作和补偿机制,确保系统最终达到一致性,而非强一致性。</p><hr><h2 id="事件溯源模式"><a href="#事件溯源模式" class="headerlink" title="事件溯源模式"></a>事件溯源模式</h2><p>事件溯源模式通过记录系统中的所有事件,提供了数据层的强大支持。</p><h3 id="事件存储"><a href="#事件存储" class="headerlink" title="事件存储"></a>事件存储</h3><p>所有的状态变化都以事件的形式存储在事件日志中,确保数据的完整性和可追溯性。</p><h3 id="状态重建"><a href="#状态重建" class="headerlink" title="状态重建"></a>状态重建</h3><p>通过回放事件日志,可以在任何时间点重建系统的状态,方便调试和审计。</p><h3 id="CQRS架构"><a href="#CQRS架构" class="headerlink" title="CQRS架构"></a>CQRS架构</h3><p>事件溯源模式通常与 CQRS(命令查询职责分离)架构结合使用,将写操作和读操作分离,提高系统性能。</p><hr><h2 id="边车模式"><a href="#边车模式" class="headerlink" title="边车模式"></a>边车模式</h2><p>边车模式是基础设施层的重要设计模式,通过附加的边车进程为主服务提供增强功能。</p><h3 id="服务网格"><a href="#服务网格" class="headerlink" title="服务网格"></a>服务网格</h3><p>边车模式是服务网格的核心组件,用于实现服务间的通信、负载均衡和安全策略。</p><h3 id="日志收集"><a href="#日志收集" class="headerlink" title="日志收集"></a>日志收集</h3><p>边车可以收集服务的日志并发送到集中式日志管理系统,便于监控和分析。</p><h3 id="监控代理"><a href="#监控代理" class="headerlink" title="监控代理"></a>监控代理</h3><p>边车还可以作为监控代理,收集服务的性能指标并发送到监控系统,帮助运维人员快速定位问题。</p><hr><p>通过以上六种核心设计模式,微服务架构能够实现高可用性、可扩展性和灵活性。在实际项目中,可以根据业务需求选择合适的模式,并结合工具和框架(如 Spring Cloud、Istio 等)进行实现。</p>]]></content>
</entry>
</search>