聊一聊微網(wǎng)關(guān)與服務(wù)嚙合
現(xiàn)在越來(lái)越多的大型組織在向更加自組織的團(tuán)隊(duì)結(jié)構(gòu)轉(zhuǎn)型,這些團(tuán)隊(duì)擁有并運(yùn)營(yíng)自己的微服務(wù),但他們?nèi)绾卧诓灰蕾?lài)集中式托管的基礎(chǔ)架構(gòu)下,確保服務(wù)之間必要的一致性與兼容性呢?為了確保服務(wù)之間的有效協(xié)作,即使是自組織的微服務(wù)也需要與一些組織標(biāo)準(zhǔn)對(duì)齊。服務(wù)嚙合(SERVICE MESH)在服務(wù)發(fā)現(xiàn)、安全、跟蹤、監(jiān)控與故障處理方面提供了一致性,且不需要像API網(wǎng)關(guān)或ESB這樣的共享資產(chǎn)。服務(wù)嚙合的一個(gè)典型實(shí)現(xiàn)包含輕量級(jí)反向代理進(jìn)程,這些進(jìn)程可能伴隨每個(gè)服務(wù)進(jìn)程一起被部署在單獨(dú)的容器中。反向代理會(huì)和服務(wù)注冊(cè)表、身份提供者和日志聚合器等進(jìn)行通信。通過(guò)該代理的共享實(shí)現(xiàn)(而非共享的運(yùn)行時(shí)實(shí)例),我們可以獲得服務(wù)的互操作性和可觀測(cè)性。一段時(shí)間以來(lái),我們一直主張去中心化的微服務(wù)管理方法,也很高興看到服務(wù)嚙合這種一致性模式的出現(xiàn)。隨著linkerd和Istio等開(kāi)源項(xiàng)目的成熟,服務(wù)嚙合的實(shí)現(xiàn)將更加容易。
新瓶舊酒還是厚積薄發(fā)?
對(duì)于持續(xù)關(guān)注云服務(wù)架構(gòu)設(shè)計(jì)***發(fā)展趨勢(shì)的同學(xué)來(lái)說(shuō),剛過(guò)去的2017年,最火的詞莫過(guò)于CNCF了,這是一個(gè)專(zhuān)注于“云原生”(Cloud Native)的基金會(huì),由眾多戰(zhàn)斗在云服務(wù)一線(xiàn)的公司(包括了谷歌、AWS、阿里云等等)組建而來(lái),旨在推進(jìn)云原生的架構(gòu)標(biāo)準(zhǔn)化與***實(shí)踐的普及。
最近,“云原生”(Cloud Native)和 “微服務(wù)”(Microservices)也引出了許多相關(guān)的技術(shù),隨著 Kubernetes、Docker 等一眾容器管理工具的普及,我們也看到在容器的內(nèi)部,微服務(wù)的架構(gòu)設(shè)計(jì)也發(fā)生著一些變化,其中“服務(wù)嚙合”(Service Mesh)就成為了大家關(guān)注的熱點(diǎn)。
那么這些變化到底是新瓶舊酒,還是厚積薄發(fā)?我們不妨先從一個(gè)更耳熟能詳?shù)募軜?gòu)——“網(wǎng)關(guān)”(Gateway)談起。
網(wǎng)關(guān)(Gateway)的作用
作為微服務(wù)工具鏈中的元老,“網(wǎng)關(guān)”(Gateway) 的引入為微服務(wù)API提供統(tǒng)一的入口和平臺(tái),不同的服務(wù)可以得到一致的管理。使用網(wǎng)關(guān)的架構(gòu)可以減少企業(yè)大量的重復(fù)開(kāi)發(fā)。甚至有一些通用的邏輯也可以使用網(wǎng)關(guān)來(lái)承載(如Zuul、Enovy、OpenResty等)。
不論初心為何,這些網(wǎng)關(guān)們隨著時(shí)光流轉(zhuǎn),功能也變得越來(lái)越豐富,網(wǎng)關(guān)可以負(fù)責(zé)解決不同服務(wù)的服務(wù)注冊(cè)發(fā)現(xiàn)、負(fù)載均衡、配額流控、監(jiān)控日志、緩存加速、配置分離、安全管控、跟蹤審計(jì)等問(wèn)題。這一系列的功能,我們可以大致分為兩類(lèi):“數(shù)據(jù)面”和“控制面”。
數(shù)據(jù)面(Data Plane)負(fù)責(zé)在數(shù)據(jù)包粒度上進(jìn)行篩選和處理:
- 路由轉(zhuǎn)發(fā)
- 負(fù)載均衡
- 安全通信
- 緩存加速
- 認(rèn)證鑒權(quán)
- 日志審計(jì)
- 健康檢查
- 熔斷限流
控制面(Control Plane)負(fù)責(zé)在服務(wù)粒度上進(jìn)行統(tǒng)籌和管理:
- 注冊(cè)發(fā)現(xiàn)
- 配置管控
- 彈性伸縮
- 統(tǒng)籌遙測(cè)
- 容錯(cuò)自愈
- 策略執(zhí)行
- 證書(shū)簽發(fā)
這一系列的功能,就是網(wǎng)關(guān)面臨的問(wèn)題域。在了解問(wèn)題域之后,讓我們回歸本篇的主題:繼承了“網(wǎng)關(guān)”(Gateway)衣缽的“微網(wǎng)關(guān)”(MicroGateway)和“服務(wù)嚙合”(Service Mesh),它們到底是什么?
什么是微網(wǎng)關(guān)?
隨著微服務(wù)的普及,傳統(tǒng)的中心化網(wǎng)關(guān)變得越來(lái)越厚重,由于與中心化節(jié)點(diǎn)通信,帶來(lái)了大量網(wǎng)絡(luò)、IO開(kāi)銷(xiāo)以及單點(diǎn)問(wèn)題,往往無(wú)法滿(mǎn)足我們對(duì)于實(shí)時(shí)性、高可用的要求。另外越來(lái)越多的自治化需求,與原有集權(quán)式微服務(wù)治理方法之間,也產(chǎn)生出許多沖突矛盾。因此,與微服務(wù)化相適應(yīng)的,可以本地化、分布式部署的微網(wǎng)關(guān)(MicroGateway)也逐漸涌現(xiàn)出來(lái)。
什么是服務(wù)嚙合?
服務(wù)嚙合(Service Mesh)是一種為了保證“服務(wù)到服務(wù)”的安全、快速和可靠的通信而產(chǎn)生的基礎(chǔ)架構(gòu)層,區(qū)別于應(yīng)用層、通信層的一種新的云原生上下文內(nèi)的抽象層。如果你正在構(gòu)建云原生的應(yīng)用程序,在微服務(wù)拓?fù)浣Y(jié)構(gòu)日益復(fù)雜的今天,服務(wù)嚙合層的提出,可以幫助開(kāi)發(fā)者將服務(wù)的交互通信問(wèn)題與微服務(wù)內(nèi)部的業(yè)務(wù)問(wèn)題隔離開(kāi)來(lái),專(zhuān)注于各自的領(lǐng)域。
演進(jìn)中的微網(wǎng)關(guān)與服務(wù)嚙合
當(dāng)我們了解到微網(wǎng)關(guān)與服務(wù)嚙合的作用之后,就可以一起來(lái)看一下微網(wǎng)關(guān)與服務(wù)嚙合架構(gòu)是如何一步步設(shè)計(jì)出來(lái)的。
1. 低侵入性組件(Low-Invasive Component)
最初的服務(wù)間互訪(fǎng),常常由于業(yè)務(wù)尚不清晰,給標(biāo)準(zhǔn)化帶來(lái)了障礙。因此我們常常見(jiàn)到一些由領(lǐng)域?qū)<姨峁┑牡颓秩胄缘慕M件,為服務(wù)的開(kāi)發(fā)者提供抽象的規(guī)范,使其能輕松獲得定制化能力。
組件可以更好地規(guī)范問(wèn)題,并且盡可能地將組件封裝為簡(jiǎn)單的接口,早期的服務(wù)發(fā)現(xiàn)常常通過(guò)該類(lèi)方式實(shí)現(xiàn),例如 Eureka 套件通過(guò)引入 Client 來(lái)獲得完整的如報(bào)告、監(jiān)控、熔斷等能力。
我們?cè)谝恍?IAM (Identity Access Management)的服務(wù)設(shè)計(jì)中采用了這種模式,為各個(gè)業(yè)務(wù)服務(wù)提供了一致的認(rèn)證鑒權(quán)接口,由領(lǐng)域?qū)<因?qū)動(dòng),設(shè)計(jì)規(guī)范化的調(diào)用模式。由于該類(lèi)組件盡可能設(shè)計(jì)為低侵入性的接口,因此微服務(wù)團(tuán)隊(duì)也可以更加便利地根據(jù)不同場(chǎng)景取舍是否使用該組件提供的功能,例如通過(guò)配置文件加 feature toogle 簡(jiǎn)單地在開(kāi)發(fā)環(huán)境中關(guān)閉認(rèn)證鑒權(quán)的功能,以加快開(kāi)發(fā)進(jìn)程。
2. 反向代理(Reverse Proxy)
隨著服務(wù)成熟度的提高,我們可以發(fā)現(xiàn)一些常見(jiàn)的非業(yè)務(wù)強(qiáng)相關(guān)的邏輯,可以從原有的服務(wù)中剝離出來(lái),通過(guò)反向代理統(tǒng)一進(jìn)行過(guò)濾處理。
反向代理,可以為微服務(wù)處理請(qǐng)求的前后環(huán)節(jié)增添通用邏輯,例如 apigee 提供的 API proxy 封裝,通過(guò)反向代理模式為原有的服務(wù)添加 PreFlow、PostFlow,解決請(qǐng)求生命周期前后常見(jiàn)的問(wèn)題,例如檢查配額和記錄調(diào)用頻度,對(duì) CORS 等 Http Header 的添加和消費(fèi),這些功能有些類(lèi)似于傳統(tǒng)的 Filter 模型,但是卻可以獨(dú)立部署。
反向代理可以提供更高的可用性,并幫助微服務(wù)開(kāi)發(fā)者從這些常見(jiàn)細(xì)節(jié)中解脫出來(lái)。
3. 側(cè)車(chē)模式(Sidecar Pattern)
準(zhǔn)確來(lái)說(shuō),側(cè)車(chē)模式(Sidecar Pattern)本身并非微網(wǎng)關(guān)或者服務(wù)嚙合技術(shù)獨(dú)有,它只是一種特定的軟件模塊共生關(guān)系。側(cè)車(chē)模式可以是一個(gè)反向代理,也可以作為一個(gè)服務(wù)存在。
作為反向代理使用的Sidecar進(jìn)程可以過(guò)濾請(qǐng)求與返回內(nèi)容,實(shí)現(xiàn)如安全通信、認(rèn)證鑒權(quán)、服務(wù)端/客戶(hù)端負(fù)載均衡、自動(dòng)路由等功能。
作為服務(wù)使用的Sidecar進(jìn)程可以為主服務(wù)提供額外能力,實(shí)現(xiàn)分布式緩存同步、配置文件拉取、日志搜集等功能。
側(cè)車(chē)模式常見(jiàn)于分布式緩存和安全基礎(chǔ)設(shè)施網(wǎng)關(guān),通過(guò)與微服務(wù)進(jìn)程共同啟停的服務(wù)或容器,可以更方便地與微服務(wù)一并調(diào)度,享受微服務(wù)管理平臺(tái)本身提供的服務(wù)發(fā)現(xiàn)、注冊(cè)、配置、擴(kuò)容能力。通過(guò)共享生命周期,在簡(jiǎn)單部署和靈活應(yīng)用中尋找一個(gè)平衡。
我們?cè)谖⒎?wù)框架 Jhipster 提供的基礎(chǔ)能力中,可以直接通過(guò)注解使用 Hazelcast 的分布式緩存,正是通過(guò) Sidecar 模式實(shí)現(xiàn)的,擁有共生的分布式緩存實(shí)例后,可輕松實(shí)現(xiàn)服務(wù)接口的緩存,而分布式緩存自身的同步策略等問(wèn)題都被封裝在 Sidecar 進(jìn)程中,無(wú)需開(kāi)發(fā)者花費(fèi)大量時(shí)間重新開(kāi)發(fā)和調(diào)試。Sidecar也可以用于實(shí)現(xiàn)例如OAuth等安全相關(guān)的守護(hù)服務(wù),幫助微服務(wù)處理業(yè)務(wù)界限外的專(zhuān)項(xiàng)問(wèn)題。
4. 原生的基礎(chǔ)設(shè)施(Native Infrastructure)
服務(wù)嚙合帶來(lái)的***的不同就是原生無(wú)感知,通過(guò)側(cè)車(chē)模式部署的反向代理,與一些容器系統(tǒng)級(jí)的配置結(jié)合,更徹底地解決微服務(wù)在數(shù)據(jù)面與管理面的能力一致性問(wèn)題。
服務(wù)嚙合框架 Istio 提供了 Istio-Initializer 和 istioctl 工具,你可以在Kubernetes的容器整備過(guò)程中,注入所需的配置和 Envoy 容器,將Sidecar Proxy、Sidecar Service注冊(cè)為容器集群中的原生服務(wù),可以在享受彈性部署的同時(shí),享受數(shù)據(jù)面和控制面協(xié)同提供的標(biāo)準(zhǔn)化能力。無(wú)痛地加入Istio提供的功能,如 iptables 代理轉(zhuǎn)發(fā)、雙向TLS認(rèn)證、限流策略、日志收集等等。
我們?cè)谠O(shè)計(jì)服務(wù)嚙合層時(shí)也可以考慮使用更原生的服務(wù)組織與部署策略,例如將微服務(wù)容器注冊(cè)為系統(tǒng)服務(wù)、通過(guò)控制流對(duì)容器進(jìn)行編排、盡可能與微服務(wù)共享生命周期和運(yùn)行環(huán)境來(lái)提高可用性與性能等等。
從現(xiàn)在開(kāi)始,擁抱微服務(wù)的云原生生態(tài)
既是新瓶舊酒,又是厚積薄發(fā),云原生趨勢(shì)下的微服務(wù)也在不斷的演進(jìn),逐漸變成我們最初希望的“會(huì)呼吸”的模樣。我們建議您考慮在一些適用的場(chǎng)景,尤其是微服務(wù)化的架構(gòu)設(shè)計(jì)中,考慮使用微網(wǎng)關(guān)與服務(wù)嚙合,并總結(jié)***實(shí)踐與我們交流。
讓我們一起期待云原生生態(tài)下的微服務(wù),為數(shù)字化時(shí)代提供更多的想象力。
【本文是51CTO專(zhuān)欄作者“ThoughtWorks”的原創(chuàng)稿件,微信公眾號(hào):思特沃克,轉(zhuǎn)載請(qǐng)聯(lián)系原作者】