代理模式的典型例子_防火墻,代理模式的典型例子有哪些?

原創(chuàng):小姐姐味道(微信公眾號(hào)ID:xjjdog),歡迎分享,轉(zhuǎn)載請(qǐng)保留出處。

緊緊抓住最新技術(shù)的脈搏,用人話普及前沿技術(shù),是xjjdog的一貫作風(fēng),現(xiàn)在也是一種責(zé)任和習(xí)慣。從漫天飛舞的華麗辭藻中,抓住技術(shù)的本質(zhì),可以避免喧賓奪主,也可以避免被忽悠。

基礎(chǔ)架構(gòu),每一波都在革自己的命。ServiceMesh是處于云原生時(shí)代的改革尖兵,其中istio以其高貴的身份與絕佳的性能,一騎絕塵,隱隱有成為標(biāo)準(zhǔn)的可能。

接下來(lái),讓我們抽絲剝繭,來(lái)看一下istio到底是個(gè)啥。

1. 中間層是基礎(chǔ)架構(gòu)的絕招

在介紹istio到底為何物的時(shí)候,我們先來(lái)描述一個(gè)問(wèn)題。

假如你的公司,打算全面擁抱SpringCloud微服務(wù),那么你一定會(huì)選擇Java語(yǔ)言。然后一些比較古老的項(xiàng)目,都往上面靠。

但總有一些比較頑固的項(xiàng)目,無(wú)法用Java重構(gòu)。比如,你的某個(gè)工程是使用C++寫(xiě)的,重構(gòu)的成本非常大。那怎么辦呢?

1.1 sidecar

軟件行業(yè)有一個(gè)永恒不變的真理:如果你想要快速有效的解決兩個(gè)組件之間的問(wèn)題,那就加入一個(gè)中間層。

無(wú)論是概念上的“中臺(tái)”,還是技術(shù)層面的“proxy”,甚至是啰里啰唆的DDD分層,都可以這么玩!

對(duì)于網(wǎng)絡(luò)請(qǐng)求來(lái)說(shuō),Proxy可以接管所有的流量,然后對(duì)這些流量進(jìn)行轉(zhuǎn)化、分析、調(diào)度,就能夠把一個(gè)丑八怪服務(wù)套一層皮,變成一個(gè)外觀上漂漂亮亮的服務(wù)。

解決上面的問(wèn)題,我們只需要使用SpringCloud兼容的技術(shù)開(kāi)發(fā)這個(gè)Proxy,然后做一層轉(zhuǎn)化,將請(qǐng)求轉(zhuǎn)化成C++調(diào)用,就可以很好的完成工作。調(diào)用這個(gè)Proxy的請(qǐng)求,壓根不會(huì)想到后面竟然是C++。

通常情況下,我們需要把Proxy和C++服務(wù)部署在一臺(tái)機(jī)器上,它們就會(huì)有比較好的性能表現(xiàn);當(dāng)然,現(xiàn)在容器搞起來(lái)之后,就可以運(yùn)行在兩個(gè)不同的Docker實(shí)例上;再后來(lái),k8s來(lái)了,一個(gè)Pod里可以直接放上Proxy和C++兩個(gè)容器實(shí)例,它們之間就可以通過(guò)localhost通信,成為了一個(gè)整體。

這就是sidecar的概念。對(duì)這一部分不是很熟悉的同學(xué),可以看以前的一篇文章:《ServiceMesh的關(guān)鍵:邊車(chē)模式(sidecar);又要開(kāi)車(chē)了》。

為什么一定要講到代理呢?因?yàn)閕stio核心組件,本質(zhì)上,就是一個(gè)sidecar形式的proxy。你要請(qǐng)求后端的服務(wù),就一定要經(jīng)過(guò)istio。它接管了所有的流量,并根據(jù)這些流量的屬性進(jìn)行了劃分。

1.2 proxy的功能

理念就是這么簡(jiǎn)單。但一旦把微服務(wù)里各種亂七八糟的功能,全部交給istio去做,那事情就變得復(fù)雜起來(lái)。

眾所周知,微服務(wù)所引入的問(wèn)題,比它解決的問(wèn)題還要多。有了配套的設(shè)施,微服務(wù)才算是真正的微服務(wù)。

我們來(lái)看一個(gè)請(qǐng)求從外圍進(jìn)入微服務(wù)后,都要進(jìn)行哪些動(dòng)作。

  • 微服務(wù)要想被找到彼此,就需要有一個(gè)統(tǒng)一的注冊(cè)中心,當(dāng)然它本質(zhì)上是一個(gè)配置中心
  • 想要跟蹤一個(gè)請(qǐng)求在不同運(yùn)行實(shí)例上的運(yùn)行情況,就需要一個(gè)集中的Tracing系統(tǒng)
  • 請(qǐng)求通過(guò)RPC調(diào)用后端的服務(wù),首先要經(jīng)過(guò)負(fù)載均衡,還要熔斷、限流、重試、故障轉(zhuǎn)移等。當(dāng)然一切的基礎(chǔ),需要在安全的前提下進(jìn)行
  • 一個(gè)請(qǐng)求還有更多屬性,比如鑒權(quán)、加密、認(rèn)證,灰度等。如果每個(gè)功能都做一遍,又復(fù)雜又枯燥。
  • 配套的CI/CD等,加快研發(fā)流程

關(guān)鍵是,這些功能對(duì)于業(yè)務(wù)開(kāi)發(fā)的同學(xué)來(lái)說(shuō),并沒(méi)有什么用。業(yè)務(wù)的同學(xué)只需要關(guān)注自己的業(yè)務(wù)邏輯就可以了,但目前我們上面所提到的各種技術(shù)術(shù)語(yǔ)和功能組件,現(xiàn)階段的業(yè)務(wù)開(kāi)發(fā)一點(diǎn)都繞不開(kāi)。

更要命的是,不論我升級(jí)上面的哪一個(gè)組件,都需要業(yè)務(wù)重新引入一個(gè)新的SDK版本,然后滾動(dòng)進(jìn)行升級(jí)。因?yàn)樗鼈冎苑Q(chēng)之為基礎(chǔ)設(shè)施,就是因?yàn)闋恳话l(fā)而動(dòng)全身的。

所以我們的部署模式要有一些改變。如果我們的所有應(yīng)用,都不直接向外提供服務(wù),而是全部通過(guò)代理去轉(zhuǎn)發(fā)請(qǐng)求,那么它就會(huì)變成下面這張圖的樣子。

Envoy Proxy就相當(dāng)于我們的代理sidecar,而Service AService B,就代表我們真正的微服務(wù)。服務(wù)實(shí)例和代理的數(shù)量,是1:1的。

那么我們上面所提到的所有流量,都可以由Envoy來(lái)接管---它和你直接調(diào)用后面的Service是沒(méi)什么兩樣的,但由于它是一個(gè)Proxy,那就可以像Aop一樣,在外面包一層,干任何事!

所有神奇的事情,都可以在代理發(fā)生!

1.3 數(shù)據(jù)平面和控制平面

如果你以前接觸過(guò)ServiceMesh,你一定聽(tīng)說(shuō)過(guò)這兩個(gè)詞。

數(shù)據(jù)平面,其實(shí)指的就是我們的Proxy集合。它雖然是個(gè)網(wǎng)狀,但如果我們把它的概念統(tǒng)一一下,它就叫平面。

那么控制平面,就是配套的控制管理臺(tái),以及下發(fā)指令的管理后臺(tái)等。

也就是說(shuō),大多數(shù)情況下,僅僅數(shù)據(jù)平面,服務(wù)就能運(yùn)行。但要看框架強(qiáng)不強(qiáng),還得看控制平面易用不易用。


圖中的上半部分,就是傳說(shuō)中的數(shù)據(jù)平面。經(jīng)過(guò)我們上面的介紹,應(yīng)該對(duì)其非常熟了。istio把它搞復(fù)雜的地方在于,它加入了證書(shū)體系來(lái)控制認(rèn)證和授權(quán)。

但如果你的公司是自研ServiceMesh的話,那工作其實(shí)就簡(jiǎn)單的多了。你的工作量全部集中在proxy的開(kāi)發(fā)上。

控制平面,如果不按照istio的規(guī)則來(lái),其實(shí)也是可有可無(wú)的。比如,你的日志收集,可以直接穿透Pod連接到你的ELKB平臺(tái),遙測(cè)這一環(huán),就可以沿用你公司原來(lái)的技術(shù)架構(gòu)。

所以說(shuō)。

如果你的公司比較新,基礎(chǔ)設(shè)施還沒(méi)有完善,那么直接上istio,那是非常棒的,因?yàn)榇蟛糠只A(chǔ)架構(gòu)的組件,它都替你做了。

但如果你的公司有些年月,基礎(chǔ)設(shè)施都開(kāi)發(fā)的差不多了,那切換到istio的基礎(chǔ)設(shè)施,那就是閑的!你的最好選擇,就是開(kāi)發(fā)這樣一個(gè)代理,然后把流量導(dǎo)到自己的基礎(chǔ)組件上。

使用C++或者Go語(yǔ)言而不是Java開(kāi)發(fā)這樣的組件,是最好的選擇。因?yàn)镴ava開(kāi)發(fā)Agent往往會(huì)占用比較多的內(nèi)存。當(dāng)然,如果內(nèi)存對(duì)你來(lái)說(shuō)不值錢(qián)的話,這話當(dāng)我沒(méi)說(shuō)。

2. 統(tǒng)一是基礎(chǔ)架構(gòu)的首要目標(biāo)

因?yàn)榛A(chǔ)架構(gòu)的范圍很大,所以每一種技術(shù)都有多種解決方案。比如MQ,比較流行的就有Kafka、RabbitMQ、Pulsar等。

對(duì)于社區(qū)來(lái)說(shuō),競(jìng)爭(zhēng)和差異化是促進(jìn)創(chuàng)新的原則。但對(duì)于一個(gè)公司來(lái)說(shuō),基礎(chǔ)架構(gòu)的統(tǒng)一才是首要目標(biāo)(那些巨無(wú)霸另說(shuō))。

所以無(wú)論是調(diào)度也好,還是流量攔截也罷,這個(gè)代理的職責(zé)只會(huì)變得越來(lái)越大。如果技術(shù)不統(tǒng)一,那么功能就會(huì)成為笛卡爾乘積式的爆炸。istio選用了比較主流的方式,代理通過(guò)Envoy來(lái)實(shí)現(xiàn),而中間的網(wǎng)絡(luò)協(xié)議,則支持 HTTP/1.1,HTTP/2,gRPC 或者 TCP等主流的通信協(xié)議。

統(tǒng)一,是它在這里體現(xiàn)的價(jià)值。

在功能上,Pod天然能夠?qū)⒋砗头?wù)綁在一塊,所以k8s成了首選的調(diào)度平臺(tái)。當(dāng)然你非要做類(lèi)似NodePort一樣的機(jī)器代理,那也沒(méi)什么本質(zhì)的區(qū)別。

最終,經(jīng)過(guò)社區(qū)的融合(或者說(shuō)壟斷),istio成為了完成統(tǒng)一整個(gè)目標(biāo)的框架。它的職責(zé)也越來(lái)越多,慢慢演變成了上圖的模樣。

上半部分依然是雷打不動(dòng)的數(shù)據(jù)平面,但istio在控制平面上開(kāi)了花。

控制中心做了進(jìn)一步的細(xì)分,分成了 Pilot、Mixer、和 Citadel,它們的各自功能如下:

  • Mixer:為整個(gè)集群執(zhí)行訪問(wèn)控制策略管理(限流、限額等),并收集代理所觀察到的,服務(wù)之間的流量統(tǒng)計(jì)數(shù)據(jù),也就是遙測(cè)(監(jiān)控、APM等)數(shù)據(jù)。
  • Pilot:為 Envoy 提供了服務(wù)發(fā)現(xiàn)流量管理智能路由(AB測(cè)試、金絲雀發(fā)布等),以及錯(cuò)誤處理(超時(shí)、重試、熔斷)功能。
  • Citadel:為服務(wù)之間提供認(rèn)證和證書(shū)管理,可以讓服務(wù)自動(dòng)升級(jí)成 TLS 協(xié)議。
  • Galley:這個(gè)組件并不向數(shù)據(jù)平面直接提供業(yè)務(wù)能力,而是作為其他控制平面的協(xié)調(diào)組件,這樣解耦的更加徹底,核心功能也越來(lái)越多。

End

我們可以到,一個(gè)正常的請(qǐng)求,在加入istio之后,就全部變成了proxy和proxy之間的通訊。proxy既代理了入流量,也代理了出流量,所有的流量都從它這里轉(zhuǎn)了一圈,所以它能夠攔截和分析任何數(shù)據(jù)。借助于k8s的助力,服務(wù)和proxy之間可以通過(guò)localhost通信。

對(duì)于微服務(wù)架構(gòu)來(lái)說(shuō),一個(gè)請(qǐng)求會(huì)分散到多臺(tái)機(jī)器上,耗時(shí)、錯(cuò)誤日志等都會(huì)變的分散,問(wèn)題排查起來(lái)不得不依賴(lài)APM等組件。istio更加徹底,你根本不知道具體的服務(wù)節(jié)點(diǎn)到底被調(diào)度到哪里了,傳統(tǒng)的人肉運(yùn)維方式失效,對(duì)上游的工具依賴(lài)性更高。

使用istio有很多前置的知識(shí)點(diǎn)需要啃掉,比如虛擬化、k8s。新公司直接跳過(guò)這兩者擁抱istio甚至是更好的選擇。但如果你的公司已經(jīng)有了非常好用的基礎(chǔ)設(shè)置工具,又與社區(qū)不兼容的話,那恐怕只有借鑒理念,自研proxy了。

作者簡(jiǎn)介:小姐姐味道 (xjjdog),一個(gè)不允許程序員走彎路的公眾號(hào)。聚焦基礎(chǔ)架構(gòu)和Linux。十年架構(gòu),日百億流量,與你探討高并發(fā)世界,給你不一樣的味道。

推薦閱讀:

1. 玩轉(zhuǎn)Linux
2. 什么味道專(zhuān)輯

3. 藍(lán)牙如夢(mèng)
4. 殺機(jī)!
5. 失聯(lián)的架構(gòu)師,只留下一段腳本
6. 架構(gòu)師寫(xiě)的BUG,非比尋常

好了,這篇文章的內(nèi)容發(fā)貨聯(lián)盟就和大家分享到這里,如果大家網(wǎng)絡(luò)推廣引流創(chuàng)業(yè)感興趣,可以添加微信:80709525  備注:發(fā)貨聯(lián)盟引流學(xué)習(xí); 我拉你進(jìn)直播課程學(xué)習(xí)群,每周135晚上都是有實(shí)戰(zhàn)干貨的推廣引流技術(shù)課程免費(fèi)分享!


版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶(hù)自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 sumchina520@foxmail.com 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。

您可能還會(huì)喜歡:

發(fā)表評(píng)論

◎歡迎參與討論,請(qǐng)?jiān)谶@里發(fā)表您的看法、交流您的觀點(diǎn)。