...

用微服務之前,你應該知道(dào)的微服務知識

2021-06-19
用微服務之前,你應該知道(dào)的微服務知識

目前,微服務正在改變我們構建應用程序的方式。當讨論軟件體系架構時(shí),微服務無疑是最熱門的趨勢之一。現在,有越來越多的開(kāi)發(fā)人員開(kāi)始考慮使用或已經(jīng)采用了微服務。


微服務是傳統軟件構造方法的替代選項,它讓開(kāi)發(fā)人員在構建複雜的軟件應用時(shí),可以具有更高的靈活性、可伸縮性以及便利性。世界上的諸多知名公司,比如 Amazon、Netflix、eBay、Spotify、Uber 和 Groupon 等都(dōu)已經(jīng)意識到使用微服務帶來的優勢。


本文總結了關于微服務的一些知識,可以方便你更快上手使用微服務。


微服務是什麼(me)?



使用微服務意味著(zhe)以松耦合的模式來構建應用程序。在微服務模式下,我們會(huì)將(jiāng)程序分割成(chéng)幾個小的應用服務,每個小的服務代表一個獨立的業務目标。


將(jiāng)複雜的應用拆解爲多個小的微服務後(hòu),每個服務可以使用合适的編程語言(比如 Node.js、Java、PHP 等)單獨進(jìn)行開(kāi)發(fā)和維護。


微服務讓開(kāi)發(fā)團隊可以自由選擇他們最喜歡的技術棧,不用再擔心自己或别人開(kāi)發(fā)的應用因爲技術棧的不同而對(duì)整個應用造成(chéng)影響。與單體架構時(shí)代相比,這(zhè)使得開(kāi)發(fā)人員可以更高效地操作和運維,并且對(duì)應用的正常運行更有信心。


但是,這(zhè)并不意味著(zhe)我們可以完全抛棄單體架構。在單體架構與微服務架構的選擇問題上,很多公司十分謹慎。确實也應該這(zhè)樣(yàng),做好(hǎo)準确地評估是十分重要的舉措。


所以,我們接下來一起(qǐ)看看微服務與單體架構之間的差異。


單體架構與微服務架構的對(duì)比


單體架構意味著(zhe)整個系統需要創建一個獨立單元作爲所有功能(néng)模塊的基礎。該獨立單元包括數據庫操作、業務邏輯、後(hòu)台處理等。所有這(zhè)些組件可以一次部署并在同一服務器上運行。


系統的所有功能(néng)都(dōu)編寫在一個單獨的代碼庫中,後(hòu)續的所有更新也均在該代碼庫中進(jìn)行。随著(zhe)業務功能(néng)的擴展,應用程序會(huì)變得太過(guò)複雜而無法處理,這(zhè)使得擴展變得十分棘手。當代碼庫較大時(shí),爲系統拓展新功能(néng)將(jiāng)會(huì)成(chéng)爲非常大的挑戰,這(zhè)會(huì)嚴重限制系統開(kāi)發(fā)和運維的靈活性和創造力。


單體架構意味著(zhe)代碼過(guò)耦合。如果其中某個模塊存在問題,那麼(me)整個系統將(jiāng)崩潰,導緻用戶無法使用。整個系統僅僅因爲一個小小的錯誤導緻整體無法使用,這(zhè)是非常危險的。


另一方面(miàn),與單體架構不同,微服務體系結構由多個微小的服務組成(chéng),服務之間通過(guò)相應的 API 進(jìn)行通信。由于每個服務代表了獨立的功能(néng),因此可以針對(duì)某個服務進(jìn)行獨立更新、部署和擴展,而不影響其他的微服務模塊。


單體架構主要應用在下面(miàn)幾個場景:


  • 正在開(kāi)發(fā)的應用程序比較簡單,并且編寫的代碼模塊使用了相同的語言和框架。

  • 如果你想要通過(guò)簡單地啓動應用程序來快速便捷地進(jìn)行測試,并且

  • 整個應用程序後(hòu)期沒(méi)有太多新的功能(néng)特性引發(fā)整個應用程序的變更。


爲什麼(me)選擇使用微服務?


選擇使用微服務的原因主要有以下幾個方面(miàn):


可擴展性



在微服務架構中,每個服務都(dōu)可以相互獨立地進(jìn)行擴展。這(zhè)意味著(zhe)每個功能(néng)都(dōu)可以獨立運行,從而各個團隊可以選擇最合适的技術棧。并且,項目團隊可以估算每個功能(néng)模塊的成(chéng)本,在需要時(shí)進(jìn)行相應的修改和調整。


高生産力


微服務絕對(duì)是大型項目團隊的必經(jīng)之路。當他們處理費時(shí)費力的大型項目時(shí),微服務模式允許團隊將(jiāng)項目分爲幾個相互獨立的服務。


這(zhè)些服務獨立運行。 這(zhè)意味著(zhe)團隊之間可以在無需協調的情況下從事(shì)同一項目。從事(shì)特定微服務的團隊可以自行制定決策,而無需等待其他團隊的響應。如果要開(kāi)始某個新功能(néng)模塊的開(kāi)發(fā),他們完全可以自由選擇要編寫微服務的語言,而不再需要與其他團隊正在使用的技術棧進(jìn)行協調。


敏捷性


敏捷開(kāi)發(fā)是當今大多數開(kāi)發(fā)團隊所追求的目标。微服務架構允許將(jiāng)整個團隊分成(chéng)幾個負責獨立服務的小團隊。這(zhè)不僅賦予了他們自主決策的權利,而且在多數情況下,可以通過(guò)縮短開(kāi)發(fā)周期來提高生産效率。


可重用性


使用微服務意味著(zhe)大型項目需要集成(chéng)的代碼量會(huì)減少。項目中不同功能(néng)的代碼可以獨立運行,這(zhè)意味著(zhe)我們可以將(jiāng)這(zhè)些功能(néng)代碼作爲基礎代碼或者其他功能(néng)代碼的補充。這(zhè)樣(yàng)一來,開(kāi)發(fā)者可以節省大量時(shí)間,因爲他們不必再重新造輪子,隻需要拿來即用,省時(shí)省力。


另外,所有這(zhè)些功能(néng)模塊都(dōu)是可以替換的。因此,如果應用程序的某個功能(néng)模塊已經(jīng)過(guò)時(shí),那麼(me)可以輕松地對(duì)其進(jìn)行重構或變更替換,而不會(huì)破壞整個項目的功能(néng)點。更重要的是,我們可以随時(shí)根據項目的目标和性能(néng)需要進(jìn)行更改。


微服務面(miàn)臨的挑戰


在決定將(jiāng)項目遷移到微服務架構之前,你應該了解一下未來可能(néng)面(miàn)臨的一些挑戰:


服務間通信複雜


對(duì)于微服務架構,應用程序由幾個獨立運行的服務組成(chéng),不同服務間的通信需要謹慎地配置。服務模塊之間會(huì)有相應的請求,這(zhè)些都(dōu)需要開(kāi)發(fā)人員進(jìn)行處理。對(duì)于服務間的通信,很多時(shí)候需要添加一些額外的代碼以保證服務間通信的正常進(jìn)行。如果微服務項目較大,服務間的通信可能(néng)會(huì)導緻一些複雜情況的産生。


更多的維護成(chéng)本


與所有組件運行在同一單元中的單體架構不同,微服務具有更多的數據庫,需要更完善的事(shì)務管理。另外,每個獨立的單元都(dōu)必須分别部署和監控。這(zhè)意味著(zhe)項目團隊將(jiāng)不得不花費更多的時(shí)間和精力來做運維工作。


測試環節更加複雜


采用單體架構時(shí),我們隻需要在某個服務器上啓動應用程序,并确保程序可以正常連接數據庫即可。而對(duì)于微服務架構,我們擁有了更多的服務和數據庫,我們必須确保所有的服務以及數據庫正常,才能(néng)進(jìn)行下一步的測試工作。在某些情況下,某一個服務或者數據庫的異常都(dōu)會(huì)導緻測試失敗,同時(shí)影響到其他服務的正常部署和測試。


這(zhè)意味著(zhe)在測試上,微服務需要花費更多時(shí)間。因爲測試接口會(huì)有很多,并且每個功能(néng)測試需要與其他過(guò)程分開(kāi)進(jìn)行。


雖然上面(miàn)提到了微服務的一些缺點,但非常重要的一點是,這(zhè)些問題都(dōu)有一些相應的解決方案。


微服務與 Docker


微服務通常部署在容器中,這(zhè)些容器提供微服務正常運行必須的操作系統環境。


Docker 是最受歡迎的容器解決方案之一。Docker 是虛拟機的輕量級系統,可幫助開(kāi)發(fā)人員更有效地管理和部署微服務。



使用 Docker,每個微服務都(dōu)放置和運行在 Docker 鏡像和 Docker 容器中,并且完全獨立于宿主系統環境。


Docker 通過(guò)在其 Docker 宿主機上共享操作系統内核,來實現自己獨立的虛拟操作系統環境的需求。


Docker 允許將(jiāng)微服務拆分爲更小的代碼段,并通過(guò)Dockerfiles文件將(jiāng)其創建爲Docker 鏡像。這(zhè)些 Dockerfile 使得將(jiāng)單個服務整合到整個微服務變得更加容易。


微服務系統通常由多個 Docker 容器構建,這(zhè)些容器通過(guò)虛拟網絡進(jìn)行協調通信。Docker 可以構建 Docker Compose 環境,該環境允許服務器之間進(jìn)行通信。


Docker 通常與 Kubernetes 搭配使用。但是,他們不是競争對(duì)手。實際上,兩(liǎng)者的組合可以帶來更好(hǎo)的結果。


微服務與 Kubernetes


Kubernetes(k8s 或“ kube”)是一個開(kāi)源系統,用于容器的自動化部署、擴展和管理。它最初是由 Google 工程師開(kāi)發(fā)的。自那時(shí)起(qǐ),Google便將(jiāng)所有服務運行在容器之上,并且每周有超過(guò) 20 億個容器上線部署。


開(kāi)發(fā)者正在廣泛采用 Kubernetes 技術,因爲它讓工作更加輕松。全世界很多開(kāi)發(fā)者活躍在 Kubernetes 社區,該社區有成(chéng)千上萬的貢獻者以及許多認證的合作夥伴。


通過(guò)將(jiāng)運行的容器組織在一起(qǐ),Kubernetes 可以創建易于管理的集群。我們可以在各種(zhǒng)雲平台中管理這(zhè)些集群,包括公共雲、私有雲和混合雲。這(zhè)便是使用 Kubernetes 可以快速擴展雲原生應用的原因。


因此,Kubernetes 并不能(néng)替代 Docker, Docker 也不可能(néng)取代 Kubernetes。它們都(dōu)可以獨立運行。但是兩(liǎng)者在協作時(shí),彼此受益。


Docker 是一種(zhǒng)可安裝在計算機上并運行容器化應用的軟件。如果你的計算機上安裝了 Docker,那麼(me)可以使用 Kubernetes 自動化容器操作,例如網絡管理、安全管理、擴展管理等。如果 Docker 安裝在多個 Docker 主機或節點上,那麼(me)可以借助 Kubernetes 執行此操作,非常方便。


Kubernetes 管理的一組節點稱爲Kubernetes 集群


借助 k8s,可以實現很多功能(néng):


  • 將(jiāng)整個應用拆分成(chéng)在不同雲環境中運行的小容器

  • 整合及編排容器

  • 管理代碼庫并有效地測試獨立的輸入和輸出

  • 即時(shí)擴展應用程序并加速應用上線時(shí)間

  • 從一家主機供應商遷移到另一家主機供應商,整個過(guò)程無需進(jìn)行重大更改即可實現

  • 通過(guò)配置文件确保應用程序完全按照規範運行,方便進(jìn)行管理

  • 可以實現自動重啓,複制和擴展應用程序,保證程序能(néng)夠獨立修複


構建微服務架構


我們可以在許多不同的框架中構建微服務。下面(miàn)幾個是目前較受歡迎的,推薦給大家:


  • Spring Boot with Spring Cloud —基于 Java Spring Cloud 的全棧微服務框架,擴展功能(néng)豐富。

  • Vert.x —運行于 JVM 之上的一個工具,支持選擇不同語言并提供簡單的 API 接口。

  • Akka —一款 Actor 模型框架,非常适合響應式微服務。

  • Quarkus —用于構建模塊化微服務應用程序的 Kurbernetes Native Java 框架

  • Falcon —一個專注于質量控制并針對(duì)微服務進(jìn)行了優化的 Python 框架。

  • Molecular —一款支持事(shì)件驅動的 Node.js 微服務框架。


  • 如何部署微服務



  • 下面(miàn)是幾種(zhǒng)選擇。也可以選擇其中的幾個合并使用進(jìn)行微服務部署。

  • 雲上部署,擁有非常好(hǎo)的擴展能(néng)力,可以爲不同地區的用戶提供相應服務

  • 容器部署,可以大大縮短産品上線時(shí)間,同時(shí)可以輕松擴展應用并快速解決問題

  • PaaS(Platform-as-a-Service,平台即服務)部署,從雲提供商租用開(kāi)發(fā)工具,基礎架構和操作系統

  • Serverless 部署,應對(duì)彈性的高峰流量場景時(shí)考慮使用該部署方式

  • 構建自己的 IT 基礎設施,如果有足夠的資源,可以考慮使用該方式部署。


  • 如何對(duì)微服務進(jìn)行監控



  • 有很多監控工具供你挑選使用,下面(miàn)是我的一些推薦:

  • Datadog該工具常用于業務監控、日志追蹤分析以及異常告警。在異常檢測及性能(néng)監控方面(miàn)非常高效。

  • Dynatrace一款由 AI 驅動的平台,可用于監控動态混合雲環境。

  • NewRelic一款用于雲環境的集中監控及報告的監控工具。

  • Splunk一款用于日志分析的輕便工具。

  • AppDynamix一款實時(shí)監控應用程序和服務器性能(néng)的工具。

  • — 一個開(kāi)源的性能(néng)監控及網絡監控工具。


  • 如何自動化CI/CD過(guò)程



  • 從完整的雲基礎架構設置到使用 Kubernetes 在雲中交付應用程序和服務,Microtica涵蓋整個軟件交付自動化過(guò)程。Microtica 針對(duì)開(kāi)發(fā)人員在雲中開(kāi)發(fā)、測試和代碼部署的方式制定了相應标準。這(zhè)讓他們的工作在未來的項目中得以複用。


  • 如何進(jìn)行測試



  • 下面(miàn)是我們使用的一些方法:

  • 使用Mocha+Chai進(jìn)行單元集成(chéng)測試

  • 使用Postman進(jìn)行 API 自動化測試。我們爲每個公共 API 定義了一個測試用例,在每天淩晨時(shí)執行它們,并立即獲得測試報告。如果出現問題時(shí),我們會(huì)立即修複問題并將(jiāng)變更部署到生産環境。


何時(shí)使用微服務?


在以下幾個情況,微服務架構是最佳解決方案:


  • 項目未來會(huì)有很多新功能(néng)

  • 項目經(jīng)常發(fā)布新功能(néng)

  • 項目有多個子域名及子服務

  • 公司業務正在計劃擴張

  • 項目有一個大型團隊可以同時(shí)處理不同的微服務

  • 擁有敏捷的、跨職能(néng)的團隊并且正在進(jìn)行大型的項目協作

  • 但是,在開(kāi)始使用微服務架構前,請務必仔細考慮下面(miàn)幾個問題:

  • 項目需要多少存儲空間?如果項目依賴本地存儲,則將(jiāng)無法靈活地進(jìn)行服務擴展。應用也將(jiāng)無法處理大量工作負載。

  • 應用程序是事(shì)件驅動嗎?如果是這(zhè)樣(yàng),那麼(me)程序應該能(néng)實現異步處理,因爲你的應用程序將(jiāng)跨多台機器進(jìn)行部署擴展。

  • 需要靈活的消息傳輸機制。微服務項目中有多個事(shì)件源,并且都(dōu)必須對(duì)其進(jìn)行處理。因此,需要一個強大的消息傳遞模型。

  • 由于微服務將(jiāng)使用其 API 進(jìn)行通信,因此創建API 通信模式是必不可少的。

  • 微服務需要一個更加安全的模型,該模型允許一個微服務僅能(néng)訪問其所需的資源,而不會(huì)使其他微服務受到安全威脅。 微服務在軟件體系架構方面(miàn)進(jìn)行了重大的革命。在構建微服務應用時(shí),應認真考慮各種(zhǒng)情況。 Netflix、Amazon、Uber 和 Spotify 決定將(jiāng)微服務架構應用于構建各自大型複雜的應用程序,以充分利用微服務的特有優勢。然而,能(néng)夠充分做到微服務架構并發(fā)揮其優勢的,僅僅是科技巨頭中的一小部分而已。 但是,是否遷移到微服務應取決于項目以及團隊結構。這(zhè)對(duì)整個公司來說(shuō)都(dōu)是非常重要的,因此在使用微服務之前,應該認真進(jìn)行讨論和評估。


原文鏈接:


https://hackernoon.com/how-to-start-using-microservices-0e1z3


來源:InfoQ