什么是微服務
微服務是用一組小服務構建的一個應用,服務運行在不同的進程中,服務之間通過輕量的通訊機制進行交互,並且服務可以通過自動化部署方式獨立部署。正因為微服務架構中,服務之間是相互獨立的,所以不同的服務可以使用不同的語言來開發,或者根據業務的需求使用不同類型的數據庫。
優點
1、服務解耦
將原有的巨大的單體應用拆分為多個獨立的微服務,使得每個服務更專注於自己的業務,滿足高內聚低耦合的設計原則。比如將電商服務差費為用戶服務、賬戶服務、商品服務、購物車服務、訂單服務等。
2、獨立的開發環境
將應用拆分為獨立的微服務,服務之間彼此隔離,通過輕量級的通訊機制(比如:dubbo)進行交互,使得開發時無需關注具體的開發環境,只需要協商好通訊機制即可。
3、獨立的部署環境
微服務擁有獨立的開發環境,因此需要根據各自的開發環境規划部署環境,對於訪問量大的服務可以增加服務的部署數量,訪問量小的服務適當的減少部署數量。
4、更高的擴展性
基於服務的獨立性,服務之間的耦合性降低,無論從功能上,還是架構上,我們都可以進行更為靈活的擴展,而不影響其他服務。
缺點
1、通訊機制的不標准問題
微服務之間相互獨立,但是服務間的交互需要依賴規范的通訊機制,沒有規范的通訊機制作為橋梁,服務間交互將變得非常復雜。保證規范的通訊機制,是微服務的前提。
2、事務一致性問題
單體應用通過數據庫事務保證一致性,拆分為微服務后,會形成分布式處理的業務,進而就會產生分布式事務一致性問題。分布式系統的事務一致性本身就是一個技術難題,目前沒有一種很簡單很完美的方案能夠應對所有場景。分布式系統的一個難點就是因為“網絡通信的不可靠”,只能通過“確認機制”、“重試機制”、“補償機制”等各方面來解決一些問題。在綜合考慮可用性、性能、實現復雜度等各方面的情況上,比較好的選擇是“異步確保最終一致性”,只是具體實現方式上有一些差異。
3、服務間的依賴變得復雜
需要根據業務的重要性進行系統梳理,定義出關鍵業務和非關鍵業務;梳理服務調用的主要路徑,明確強弱依賴、限流、降級規則等。服務治理就是基於以上規則進行的,否則無法進行系統運維或管理。比如非關鍵業務被關鍵業務所依賴,會導致非關鍵業務變成關鍵業務,服務鏈中就會出現“木桶效應”,即整個服務質量由最差的那個服務所決定。
數據庫也需要做相應的隔離:避免非關鍵業務把數據庫拖死,進而導致全站不可用。不允許直接讀取對方的數據庫進行系統交互,只允許通過服務接口進行系統交互。這也是微服務的要求:拆分服務和相應數據庫。
應避免服務間的循環調用,如果產生循環引用,需要通過架構層面解決循環問題,避免因循環引用導致的系統奔潰問題。同時要對接口進行降級、限流控制,以應對系統的高並發。
4、微服務運維變得復雜
微服務的架構一般會包含基礎層、中間件層、應用層、接入層、安全層,同時需要有相應的團隊負責各層的運維。各層之間有比較明確的職責,共同支撐着整個系統的運行。一旦某個環節出現問題,整個系統就會像 “多米諾骨牌”一樣倒下。因此需要統一的運維平台,實時監控服務調用鏈路,及時發現和定位問題。而建立統一的運維平台的成本和難度是相當之大的,目前也只有幾家互聯網大公司擁有這種能力。
5、系統監控變得復雜
對系統的監控依賴於系統的調用鏈路,鏈路中包含:http請求、服務間調用、消息隊列、數據庫、nosql、線程間調用等,如何將監控整個鏈路將變得非常困難,可能需要修改各中間件的請求數據包。
6、系統測試變得復雜
由於服務的依賴變得復雜,在進行系統測試時,要考慮服務間強弱依賴、降級、限流等問題。在進行壓測時要考慮依賴的服務的性能。在制造測試場景時應充分考慮各服務的數據量,避免出現測試誤差。
更多學習資料可關注:gzitcast