慣性聚合 高效追蹤和閱讀你感興趣的部落格、新聞、科技資訊
閱讀原文 在慣性聚合中打開

推薦訂閱源

博客园 - 司徒正美
V
V2EX
T
Tailwind CSS Blog
有赞技术团队
有赞技术团队
aimingoo的专栏
aimingoo的专栏
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
Blog — PlanetScale
Blog — PlanetScale
A
About on SuperTechFans
月光博客
月光博客
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
V
Visual Studio Blog
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI

阮一峰的网络日志

科技爱好者周刊(第 396 期):互联网通信的替代方案 科技爱好者周刊(第 396 期):互联网通信的替代方案 - 阮一峰的网络日志 科技爱好者周刊(第 395 期):软件开发的第三种方式 科技爱好者周刊(第 395 期):软件开发的第三种方式 - 阮一峰的网络日志 科技爱好者周刊(第 393 期):脑腐状态 科技爱好者周刊(第 392 期):axios 投毒与好莱坞式骗术 科技爱好者周刊(第 391 期):AI 的贫富分化 科技爱好者周刊(第 390 期):没有语料,大模型就是智障 套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的"套壳"疑云 科技爱好者周刊(第 389 期):未来如何招聘程序员 科技爱好者周刊(第 388 期):测试是新的护城河 零安装的"云养虾":ArkClaw 使用指南 科技爱好者周刊(第 387 期):你是领先的 科技爱好者周刊(第 386 期):当外卖员接入 AI 字节全家桶 Seed 2.0 + TRAE 玩转 Skill 科技爱好者周刊(第 385 期):马斯克害怕中国车企吗? 智谱旗舰 GLM-5 实测:对比 Opus 4.6 和 GPT-5.3-Codex 科技爱好者周刊(第 384 期):为什么软件股下跌 科技爱好者周刊(第 383 期):你是第几级 AI 编程 Kimi 的一体化,Manus 的分层 科技爱好者周刊(第 382 期):独立软件的黄昏 AI native Workspace 也许是智能体的下一阶段 科技爱好者周刊(第 381 期):中国 AI 大模型领导者在想什么 科技爱好者周刊(第 380 期):为什么人们拥抱"不对称收益" 科技爱好者周刊(第 379 期):《硅谷钢铁侠》摘录 我如何用 AI 处理历史遗留代码:MiniMax M2.1 升级体验 科技爱好者周刊(第 378 期):预测是新的互联网热点 科技爱好者周刊(第 377 期):14万美元的贫困线 科技爱好者周刊(第 376 期):太空数据中心的争议 科技爱好者周刊(第 375 期):一扇门的 Bug 终于有人做了 Subagent,TRAE 国内版 SOLO 模式来了 科技爱好者周刊(第 374 期):6GHz 的问题 VS Code 使用国产大模型 MiniMax M2 教程 科技爱好者周刊(第 373 期):数据模型是新产品的核心 国产大模型接入 Claude Code 教程:以 Doubao-Seed-Code 为例 科技爱好者周刊(第 372 期):软件界面如何设计 大模型比拼:MiniMax M2 vs GLM 4.6 vs Claude Sonnet 4.5 科技爱好者周刊(第 371 期):一个乐观主义者的专访 科技爱好者周刊(第 370 期):正确的代码高亮 错误处理:异常好于状态码 科技爱好者周刊(第 369 期):Tim 与罗永浩的对谈 科技爱好者周刊(第 368 期):不要这样管理软件团队 一天之内,智谱和 Anthropic 都发了最强编程模型 科技爱好者周刊(第 367 期):Nano Banana 的几个妙用 科技爱好者周刊(第 366 期):旧金山疯狂的 AI 广告 科技爱好者周刊(第 365 期):流量变现正在崩塌 科技爱好者周刊(第 364 期):最难还原的魔方 科技爱好者周刊(第 363 期):最好懂的神经网络解释 科技爱好者周刊(第 362 期):GitHub 工程师谈系统设计 科技爱好者周刊(第 361 期):暗网 Tor 安全吗?
微服務是什麼?
阮一峰 · 2022-04-29 · via 阮一峰的网络日志

微服務(microservice)是一種軟件架構,正得到越來越多的關注。

但是,它到底是什麼意思?什麼樣的架構可以叫做微服務?

網上的文章雖然很多,但是都太複雜,初學者不容易看懂。我認為,這個概念其實非常簡單,可以很通俗地說明白。

一、單體軟件

要理解微服務,首先需要理解軟件架構的演變。

早期的軟件,所有功能都寫在一起,這稱為單體架構(monolithic software)。

整個軟件就是單一的整體,彷佛一體化的機器。

可以想到,軟件的功能越多,單體架構就會越複雜,很多缺點也隨之暴露出來。

(1)所有功能耦合在一起,互相影響,最終難以管理。

(2)哪怕只修改一行代碼,整個軟件就要重新構建和部署,成本非常高。

(3)因為軟件做成了一個整體,不可能每個功能單獨開發和測試,只能整體開發和測試,導致必須採用瀑布式開發模型。

以上三個原因的詳細分析,可以參考我以前的文章《軟件工程的最大難題》

總之,單體架構的大型軟件,不僅開發速度慢,而且會形成難以維護和升級的複雜代碼,成為程序員的沉重負擔。

二、面向服務架構

為了解決上面這些問題,很早就有人提出來,必須打破代碼的耦合,拆分單體架構,將軟件拆分成一個個獨立的功能單元。

大概在20多年前,隨著互聯網的出現,功能單元可以用遠程"服務"的形式提供,就誕生出了"面向服務架構"(service-oriented architecture,簡稱 SOA)。

所謂服務(service),就是在後臺不間斷運行、提供某種功能的一個程序。最常見的服務就是 Web 服務,通過80端口向外界提供網頁訪問。

"面向服務架構"就是把一個大型的單體程序,拆分成一個個獨立服務,也就是較小的程序。每個服務都是一個獨立的功能單元,承擔不同的功能,服務之間通過通信協議連在一起。

這種架構有很多優點。

(1)每種服務功能單一,相當於一個小型軟件,便於開發和測試。

(2)各個服務獨立運行,簡化了架構,提高了可靠性。

(3)鼓勵和支持代碼重用,同一個服務可以用於多種目的。

(4)不同服務可以單獨開發和部署,便於升級。

(5)擴展性好,可以容易地加機器、加功能,承受高負載。

(6)不容易出現單點故障。即使一個服務失敗了,不會影響到其他服務。

跟單體架構不一樣,面向服務架構是語言不敏感的,不同服務可以使用不同的語言和工具開發,可能需要部署在不同的系統和環境。

這意味著,面向服務架構默認運行在不同服務器上,每臺服務器提供一種服務,多臺服務器共同組成一個完整的網絡應用。

三、微服務

2014年,Docker 出現了,徹底改變了軟件開發的面貌。它讓程序運行在容器中,每個容器可以分別設定運行環境,並且只佔用很少的系統資源。

顯而易見,可以用容器來實現"面向服務架構",每個服務不再佔用一臺服務器,而是佔用一個容器。

這樣就不需要多臺服務器了,最簡單的情況下,本機運行多個容器,只用一臺服務器就實現了面向服務架構,這在以前是做不到的。這種實現方式就叫做微服務。

簡單說,微服務就是採用容器技術的面向服務架構。它依然使用"服務"作為功能單元,但是變成了輕量級實現,不需要新增服務器,只需要新建容器(一個進程),所以才叫做"微服務"。

一個微服務就是一個獨立的進程 這個進程可以運行在本機,也可以運行在別的服務器,或者在雲端(比如雲服務和雲函數 FaaS)。

它的特點與面向服務架構是一樣的,但因為更輕量級,所以功能的解耦和服務化可以做得更徹底。而且,它可以標準化,同樣的容器不管在哪裡運行,結果都是一樣的,所以市場上有很多 SaaS 產品,提供標準化的微服務。

正是由於微服務這些突出的優點,這幾年才會變得如此流行。它和容器技術、雲服務一起,一定會在未來的軟件開發中,扮演越來越重要的角色。

(完)