那么,你要如何屏蔽服務(wù)化架構(gòu)中服務(wù)治理的細(xì)節(jié),或者說,如何讓服務(wù)治理的策略在多語言之間復(fù)用呢?
有沒有考慮過這個問題?我們實現(xiàn)的一整套服務(wù)治理的組件 熔斷、限流、認(rèn)證、負(fù)載均衡器、分布式日志追蹤怎么來平滑的使用到跨語言的應(yīng)用中呢?
可以考慮將服務(wù)治理的細(xì)節(jié),從 RPC 客戶端中拆分出來,形成一個代理層單獨部署。這個代理層可以使用單一的語言實現(xiàn),所有的流量都經(jīng)過代理層來使用其中的服務(wù)治理策略。這是一種“關(guān)注點分離”的實現(xiàn)方式,也是 Service Mesh 的核心思想。
Service Mesh 是如何工作的
1. 什么是 Service Mesh
Service Mesh 主要處理服務(wù)之間的通信,它的主要實現(xiàn)形式就是在應(yīng)用程序同主機上部署一個代理程序。一般來講,我們將這個代理程序稱為“Sidecar(邊車)”,服務(wù)之間的通信也從之前的客戶端和服務(wù)端直連,變成了下面這種形式:

在這種形式下,RPC 客戶端將數(shù)據(jù)包先發(fā)送給與自身同主機部署的 Sidecar,在 Sidecar 中經(jīng)過服務(wù)發(fā)現(xiàn)、負(fù)載均衡、服務(wù)路由、流量控制之后,再將數(shù)據(jù)發(fā)往指定服務(wù)節(jié)點的 Sidecar,在服務(wù)節(jié)點的 Sidecar 中,經(jīng)過記錄訪問日志、記錄分布式追蹤日志、限流之后,再將數(shù)據(jù)發(fā)送給 RPC 服務(wù)端。
這種方式可以把業(yè)務(wù)代碼和服務(wù)治理的策略隔離開,將服務(wù)治理策略下沉,讓它成為獨立的基礎(chǔ)模塊。這樣一來,不僅可以實現(xiàn)跨語言服務(wù)治理策略的復(fù)用,還能對這些 Sidecar 做統(tǒng)一的管理。
目前,業(yè)界提及最多的 Service Mesh 方案當(dāng)屬Istio, 它的玩法是這樣的:

它將組件分為數(shù)據(jù)平面和控制平面,數(shù)據(jù)平面就是我提到的 Sidecar(Istio 使用Envoy作為 Sidecar 的實現(xiàn))。控制平面主要負(fù)責(zé)服務(wù)治理策略的執(zhí)行,在 Istio 中,主要分為 Mixer、Pilot 和 Istio-auth 三部分。
你可以先不了解每一部分的作用,只知道它們共同構(gòu)成了服務(wù)治理體系就可以了。
然而,在 Istio 中,每次請求都需要經(jīng)過控制平面,也就是說,每次請求都需要跨網(wǎng)絡(luò)地調(diào)用 Mixer,這會極大地影響性能。因此,國內(nèi)大廠開源出來的 Service Mesh 方案中,一般只借鑒 Istio 的數(shù)據(jù)平面和控制平面的思路,然后將服務(wù)治理策略做到了 Sidecar 中,控制平面只負(fù)責(zé)策略的下發(fā),這樣就不需要每次請求都經(jīng)過控制平面,性能上會改善很多。
-
如何將流量轉(zhuǎn)發(fā)到 Sidecar 中
Iptables 方式的優(yōu)勢在于對業(yè)務(wù)完全透明,業(yè)務(wù)甚至不知道有 Sidecar 存在,這樣會減少業(yè)務(wù)接入的時間。不過它也有缺陷,那就是它是在高并發(fā)下,性能上會有損耗,因此國內(nèi)大廠采用了另外一種方式:輕量級客戶端。
請求被發(fā)送到服務(wù)端的 Sidecar 上后,然后在服務(wù)端記錄訪問日志和分布式追蹤日志,再把請求轉(zhuǎn)發(fā)到真正的服務(wù)節(jié)點上。當(dāng)然,服務(wù)節(jié)點在啟動時,會委托服務(wù)端 Sidecar 向注冊中心注冊節(jié)點,Sidecar 也就知道了真正服務(wù)節(jié)點部署的端口是多少。整個請求過程如圖所示:

與此同時,我也建議你了解目前業(yè)界一些開源的 Service Mesh 框架,這樣在選擇方案時可以多一些選擇。目前在開源領(lǐng)域比較成熟的 Service Mesh 框架有下面幾個,你可以通過閱讀它們的文檔來深入了解,作為本節(jié)課的引申閱讀。
Istio 這個框架在業(yè)界最為著名,它提出了數(shù)據(jù)平面和控制平面的概念,是 Service Mesh 的先驅(qū),缺陷就是剛才提到的 Mixer 的性能問題。
Linkerd 是第一代的 Service Mesh,使用 Scala 語言編寫,其劣勢就是內(nèi)存的占用。
SOFAMesh 是螞蟻金服開源的 Service Mesh 組件,在螞蟻金服已經(jīng)有大規(guī)模落地的經(jīng)驗。