這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
導讀:微服務是一個模糊的術語,通常指的是小型獨立服務,共同組成一個應用程式。 微服務架構與單片架構相反,其應用程式是一個大系統。 我們將討論如何開始作為初學者,並選擇正確的工具來建立微服務架構。
迅速崛起的微服務
根據Google趨勢指數的結果,近來微服務已經越來越流行:
在開始認識之前,我們先來瞭解為什麼微型伺服器正在普及,即使它不是一個新的概念。這可以通過康威定律來解釋:
設計系統的組織,其產生的設計和架構等價於組織間的溝通結構。
為什麼是微服務
技術棧中妥協更少
技術棧的選擇總是一個艱難的任務,團隊的技能,可擴充性,可維護性都是這一選擇的重要因素。但是很多時候對應用程式的一部分有好處,對其他部分來說卻是不好的。
例如,交易平台由於支援交易而需要 PostgreSQL,而使用者特定的資料必須儲存在 DynamoDB中,一般來說,這就需要做出妥協。但是在微服務體繫結構中,每個微伺服器都以其最佳形式擁有一組商務邏輯和相關資料,並提供一個與之互動的介面。因此,可以為 PostgreSQL 和 DynamoDB 託管的資料提供交易和使用者的微服務,只允許通過該介面訪問外部服務。 因此,計算密集的微服務可以用 Python 編寫,而 API Server 保留在 NodeJS 中,依此類推.
樣本架構如下所示
團隊獨立
在一個單一的應用程式中,Team Dev中的大多數人,即使開發一個小功能都需要知道應用程式的所有部分。他們必須與其他團隊在部署計劃,版本控制,資料移轉等方面進行合作。另一方面,在微服務架構中,團隊只需要知道其他服務提供的介面,並堅持其所提供的介面,每個微服務應該是獨立部署的。像 CirclCi,Travis 和 Heroku 這樣的 CI/CD 工具在開發微服務時都非常有協助,要開發/維護一個服務,一個小團隊就足夠了。
只做一件事,並把它做好
微服務架構也類似於 Unix 哲學的原則,做一件事,把它做好。 這是一個被證明很有價值的原則,也是幾十年之後 Unix 系統也不會過時的原因之一。 微服務應設計為做一件事,經過測試以處理所有可能的情況,然後通過 “管道” 形成一個健壯和靈活的應用程式。
故障隔離
想象一下「報告產生」模組中的錯誤,將整個交易應用程式關閉,這是可怕的和不必要的。 如果應用程式基底於微伺服器,則「報告產生」模組將失敗,只佔用該特定功能。 沒有產生報告的使用者甚至不會注意到,應用程式的關鍵區段仍然可以工作。 這是微型伺服器之間鬆散耦合的結果,現在可以通過這種架構實現。
怎麼開發微服務
在Node.js中,Seneca是開發微服務的廣泛使用的架構。但如果你想深入參與,請繼續閱讀。
API Gateway
微服務可以在沒有主要的中央服務的情況下進行部署,但是有時中介層通常會保留共用庫,有時它也可以作為一個 API Gateway。API Gateway用於向用戶端提供一致的 API,而不管後端服務如何,反之亦然。當您擁有適合移動,web,其他伺服器等用戶端的多種微服務時,這是很有協助的。此外,它可以阻止用戶端通過將其抽象為一個請求來向多個服務發出請求。
業務間通訊
這些服務應該如何相互連信?well,有很多選擇。
- HTTP:最直接的是使用 HTTP/HTTPS,並且介面可以作為 RESTful API。儘管如此,HTTP 使服務發現變得困難而且動態不足。這是我不喜歡的原因。
- 訊息佇列:諸如 AMQP,STOMP 和 MQTT 之類的訊息佇列協議允許使用發布訂閱模式來進行微服務之間的通訊,像 RabbitMQ 和 Apache Kafka 這樣的服務被廣泛用於這個目的。我個人更喜歡使用訊息佇列,因為它們是容錯的,並支援訊息持久性。
microservice-template 是我們在基於 Microservices 的項目中使用的基本樣板。它在 Node 中,並將 MongoDB 配置為資料存放區。它通過 servicebus 接到 RabbitMQ 進行業務間通訊,這是它的最低限度的外觀:
還有其他概念,例如 Event Sourcing 和 CQRS ,它們補充了微服務架構。Event Sourcing 基本上是儲存資料的變化,而不是資料的改變狀態。 在高度並發的環境中,Event Sourcing 帶來更進階別的一致性。
但是事實卻是,微服務體系架構不是銀彈,對於相當小的應用程式使用微服務可能導致生產力的損失,如所示。
原文: Microservices for beginners, how to get started with right tools | Codebrahma
擴充閱讀:Web 開發人員的安全檢查清單 - 知乎專欄
歡迎關註:
- 知乎專欄「極光日報」,每天為 Makers 導讀三篇優質英文文章。
- 極光 Github 項目:「Aurora UI」,一個通用 IM 聊天 UI 組件。