1. 程式人生 > >微服務1.0與2.0

微服務1.0與2.0

微服務1.0時代

Dubbo本質上只能算是一個服務治理框架,而不能算是一個微服務框架。雖然在未來的Dubbo 3.0中會提供對Spring Cloud,以及對Service Mesh的支援,但是單憑Dubbo仍然是無法搭建一個完整的微服務體系結構。

Spring Cloud則是通過整合眾多的元件的形式實現了相對完整的微服務技術棧,但是Spring Cloud的實現方式程式碼侵入性較強,而且只支援Java語言,無法支援其他語言開發的系統。Spring Cloud全家桶包括的內容較多,學習成本也相對較高,對老系統而言,框架升級或者替換的成本較高,導致一些開發團隊不願意擔負技術和時間上的風險與成本,使得微服務方案在落地時遇到了諸多的困難。

總結一下,微服務1.0時代的主要問題主要包括如下三方面:

  • 技術門檻高:開發團隊在實施微服務的過程中,除了基礎的服務發現、配置中心和鑑權管理之外,團隊在服務治理層面面臨了諸多的挑戰,包括負載均衡、熔斷降級、灰度釋出、故障切換、分散式跟蹤等,這對開發團隊提出了非常高的技術要求。
  • 多語言支援不足:對於網際網路公司,尤其是快速發展的網際網路創業公司,多語言的技術棧、跨語言的服務呼叫也是常態,但目前開源社群上並沒有一套統一的、跨語言的微服務技術棧,而跨語言呼叫恰恰是微服務概念誕生之初的要實現的一個重要特性之一。
  • 程式碼侵入性強:Spring Cloud、Dubbo等主流的微服務框架都對業務程式碼有一定的侵入性,技術升級替換成本高,導致開發團隊配合意願低,微服務落地困難。

 

微服務2.0時代

為了解決微服務1.0時代的諸多問題,Service Mesh概念開始走入了開發者的視線中。

在介紹Service Mesh概念之前,我們先來了解一下Sidecar。Sidecar是以第一次世界大戰時活躍在戰場上的軍用邊斗車命名(也是我們在抗日神劇中最常見的道具之一)。Sidecar是Service Mesh中的重要組成部分,Sidecar在軟體系統架構中特指邊斗車模式,這個模式的精髓在於實現了資料面(業務邏輯)和控制面的解耦。

1.jpg


在Service Mesh架構中,給每一個微服務例項部署一個Sidecar Proxy。該Sidecar Proxy負責接管對應服務的入流量和出流量,並將微服務架構中的服務訂閱、服務發現、熔斷、限流、降級、分散式跟蹤等功能從服務中抽離到該Proxy中。

Sidecar以一個獨立的程序啟動,可以每臺宿主機共用同一個Sidecar程序,也可以每個應用獨佔一個Sidecar程序。所有的服務治理功能,都由Sidecar接管,應用的對外訪問僅需要訪問Sidecar即可。當該Sidecar在微服務中大量部署時,這些Sidecar節點自然就形成了一個服務網格。

2.png


微服務的概念在2014年3月由Martin Fowler首次提出,而Service Mesh的概念則是在2016年左右提出,Service Mesh至今也經歷了第二代的發展。

第一代Service Mesh的代表為Linkerd和Envoy。Linkerd基於Twitter的Fingle,使用Scala編寫,是業界第一個開源的Service Mesh方案,在長期的實際生產環境中獲得驗證。Envoy底層基於C++,效能上優於使用Scala的Linkrd。同時,Envoy社群成熟度較高,商用穩定版本面世時間也較長。這兩個開源實現都是以Sidecar為核心,絕大部分關注點都是如何做好Proxy,並完成一些通用控制面的功能。但是當你在容器中大量部署Sidecar以後,如何管理和控制這些Sidecar本身就是一個不小的挑戰。

第二代Service Mesh主要改進集中在更加強大的控制面功能(與之對應的Sidecar Proxy被稱之為資料面),典型代表有Istio和Conduit。Istio是Google、IBM和Lyft合作的開源專案,是目前最主流的Service Mesh方案,也是事實上的第二代Service Mesh標準。在Istio中,直接把Envoy作為Sidecar。除了Sidecar,Istio中的控制面元件都是使用Go語言編寫。

淺談服務治理、微服務與Service Mesh(三): Service Mesh與Serverless