應(yīng)用

技術(shù)

物聯(lián)網(wǎng)世界 >> 物聯(lián)網(wǎng)新聞 >> 物聯(lián)網(wǎng)熱點(diǎn)新聞
企業(yè)注冊(cè)個(gè)人注冊(cè)登錄

為什么分布式應(yīng)用需要有依賴管理?

2022-04-21 10:54 51cto

導(dǎo)讀:對(duì)于如何治理錯(cuò)綜復(fù)雜的組件關(guān)系網(wǎng),經(jīng)過(guò)幾十年的積累,開(kāi)發(fā)者們已經(jīng)提煉出了一套通用的解決方案:依賴管理(Dependency Management)。

  前言

  分布式云應(yīng)用(也叫微服務(wù))在大行其道的同時(shí),也給應(yīng)用本身的設(shè)計(jì)和運(yùn)維帶來(lái)巨大的復(fù)雜性。以前單體服務(wù)時(shí)代,尚可將這種復(fù)雜性隱藏于自身內(nèi)部,而到了微服務(wù)時(shí)代,這種復(fù)雜性幾乎擴(kuò)散到了成百上千個(gè)“松耦合”的服務(wù)上面。盡管每個(gè)微服務(wù)都可以使用不同的語(yǔ)言構(gòu)建,也可以快速地橫向擴(kuò)展,但他們作為一個(gè)整體,相比于單體服務(wù),分布式的特性常常會(huì)帶來(lái)規(guī)劃、部署和安全上的難題。

  這些問(wèn)題也給云原生應(yīng)用的管理和發(fā)展帶來(lái)挑戰(zhàn)。我們不禁要思考,怎樣才能確保云原生應(yīng)用的持續(xù)健康,如何才能取其精華,去其糟粕,既保持面向服務(wù)設(shè)計(jì)的優(yōu)勢(shì),同時(shí)不增加開(kāi)發(fā)維護(hù)等成本?

  還好在微服務(wù)之前就遇到過(guò)類似的問(wèn)題,對(duì)于如何治理錯(cuò)綜復(fù)雜的組件關(guān)系網(wǎng),經(jīng)過(guò)幾十年的積累,開(kāi)發(fā)者們已經(jīng)提煉出了一套通用的解決方案:依賴管理(Dependency Management)。

  其實(shí)我們每天都在使用依賴管理器提供的公共或者私有的軟件包,在這些包的基礎(chǔ)之上增加自己的功能,最后再精心地打包為標(biāo)準(zhǔn)格式以供后續(xù)使用。筆者認(rèn)為依賴管理正是釋放分布式應(yīng)用強(qiáng)大能力的關(guān)鍵,現(xiàn)在是時(shí)候引入依賴管理機(jī)制來(lái)推動(dòng)云原生技術(shù)的發(fā)展了,具體來(lái)說(shuō),有以下5點(diǎn)原因。

  1.開(kāi)發(fā)者之間的相互協(xié)作

  NPM, Pip, Maven等依賴管理器最重要的作用之一,就是促進(jìn)了開(kāi)發(fā)者之間的相互協(xié)作。通過(guò)提供一套統(tǒng)一的打包管理機(jī)制,依賴管理器可以讓你的代碼被其他團(tuán)隊(duì)使用或者增強(qiáng)。此外,不僅在企業(yè)內(nèi)部團(tuán)隊(duì)之間,我們也看到了依賴管理大范圍地用于促進(jìn)開(kāi)源社區(qū)上的協(xié)作。工具的一致性和使用的廣泛性也使我們能夠創(chuàng)建強(qiáng)大易得的軟件庫(kù),從而供所有人使用并在其上進(jìn)行構(gòu)建。

  這種級(jí)別的協(xié)作已經(jīng)在各個(gè)語(yǔ)言社區(qū)中實(shí)現(xiàn),比如JavaScript的NPM,Python的Pip等,但在云原生社區(qū)里還沒(méi)有成型的落地方案。雖然有Docker定義了云服務(wù)打包的規(guī)范,但各種容器方案還缺乏足夠的信息去解析和拓展服務(wù)間的依賴關(guān)系。如果我們希望微服務(wù)也能實(shí)現(xiàn)這種協(xié)作效果,就像各個(gè)語(yǔ)言對(duì)軟件庫(kù)做的那樣,就非常有必要增加合適的依賴管理機(jī)制,使其能檢索并處理各個(gè)終端服務(wù)之間的關(guān)系。

  2.環(huán)境的自服務(wù)

  依賴管理器的協(xié)作效果并不能憑空產(chǎn)生,而是得益于統(tǒng)一的依賴解析。統(tǒng)一的依賴解析之所以強(qiáng)大,主要是因?yàn)槭澜绺鞯氐拈_(kāi)發(fā)者都能夠使用相同的命令和程序來(lái)重現(xiàn)他們的效果??芍貜?fù)性(Reproducibility)是依賴管理器的一個(gè)關(guān)鍵要素,缺少了這個(gè)要素,如果沒(méi)有定制復(fù)雜的啟動(dòng)邏輯,開(kāi)發(fā)者們就不能方便地下載和操作其他人創(chuàng)建的庫(kù)和包,而這些將增加開(kāi)發(fā)成本,成為大規(guī)模采用和分發(fā)的巨大障礙。

  在這方面,微服務(wù)與各種語(yǔ)言庫(kù)之間沒(méi)有太大的差別。我們擴(kuò)展他人工作的成果,取決于我們可以運(yùn)行或調(diào)用期望的服務(wù)和應(yīng)用程序的能力。目前,我們已經(jīng)可以通過(guò)沙盒環(huán)境,集中QA的形式來(lái)完成任務(wù),但還無(wú)法真正做到環(huán)境的完全重現(xiàn),從而會(huì)產(chǎn)生一系列的問(wèn)題。由于依賴他人的服務(wù)無(wú)法輕松交付,開(kāi)發(fā)者并沒(méi)有完全操控自己的開(kāi)發(fā)環(huán)境的能力,需要被迫編寫(xiě)自己的腳本來(lái)本地或者遠(yuǎn)程地運(yùn)行他人的應(yīng)用程序,同時(shí)每個(gè)團(tuán)隊(duì)都需要開(kāi)發(fā)生產(chǎn)級(jí)別的工具,自行保證網(wǎng)絡(luò)問(wèn)題和安全問(wèn)題。

  如果擁有統(tǒng)一的依賴關(guān)系管理解決方案,每個(gè)團(tuán)隊(duì)只需要聲明其服務(wù)的網(wǎng)絡(luò)依賴關(guān)系,即可為組織中的每個(gè)人提供相同的方式來(lái)運(yùn)行其技術(shù)棧中的服務(wù),并同時(shí)準(zhǔn)備好服務(wù)的依賴,可以使每個(gè)開(kāi)發(fā)者真正地?fù)碛胁倏丨h(huán)境的能力。

  3.自動(dòng)化

  自助服務(wù)優(yōu)勢(shì)不僅僅意味著開(kāi)發(fā)者可以操控自己的環(huán)境,也意味著開(kāi)發(fā)環(huán)境可以通過(guò)程序自動(dòng)化來(lái)提供并且細(xì)化。只需使用一個(gè)命令或程序,就能實(shí)現(xiàn)依賴關(guān)系的解析、網(wǎng)絡(luò)的豐富、安全性的自動(dòng)保證,這是能否集成到CI/CD管道的關(guān)鍵。

  如果每個(gè)服務(wù)都可以使用統(tǒng)一的機(jī)制運(yùn)行(例如,使用容器平臺(tái))并且知道自己的依賴關(guān)系,那么每次Git合并請(qǐng)求就能提供一套新的環(huán)境,并且無(wú)縫地發(fā)布到預(yù)生產(chǎn)和生產(chǎn)環(huán)境。這意味著每個(gè)團(tuán)隊(duì)都可以為每個(gè)成員和每個(gè)添加到應(yīng)用里的新服務(wù)提供非常靈活的基于Git的自動(dòng)運(yùn)維部署,即GitOps。

  4.安全性

  微服務(wù)架構(gòu)其中的一個(gè)安全風(fēng)險(xiǎn),是每個(gè)服務(wù)都需要暴露API接口以提供功能的調(diào)用。由于這些服務(wù)作為單獨(dú)的進(jìn)程存在,因此通過(guò)網(wǎng)絡(luò)進(jìn)行通信幾乎是服務(wù)間相互連接、接收處理請(qǐng)求的唯一方式。這意味著每個(gè)新服務(wù)都會(huì)公開(kāi)一些其他人可以訪問(wèn)的接口,如果開(kāi)發(fā)者不小心,可能會(huì)錯(cuò)誤地暴露接口給到本不允許訪問(wèn)的服務(wù)。

  防止網(wǎng)絡(luò)接口的意外暴露是依賴管理可以大展身手的另一個(gè)領(lǐng)域。通過(guò)帶有網(wǎng)絡(luò)依賴的結(jié)構(gòu)化索引,我們不僅可以自動(dòng)解析服務(wù)間的依賴,還可以豐富環(huán)境配置,生成對(duì)應(yīng)的網(wǎng)絡(luò)策略來(lái)保障接口的合法訪問(wèn),也就是說(shuō)只有相互依賴的服務(wù)才能相互訪問(wèn)。這種結(jié)構(gòu)化的方式將極大減少開(kāi)發(fā)者了解網(wǎng)絡(luò)安全工具的需求,并讓他們可以更自由地創(chuàng)建新服務(wù)。

  5.靈活性

  微服務(wù)或者說(shuō)分布式應(yīng)用的依賴管理的另一個(gè)好處是靈活性。一旦開(kāi)發(fā)者確定好依賴項(xiàng)并關(guān)聯(lián)到自己的服務(wù)上,解析器自己就可以在每個(gè)部署的環(huán)境中唯一地構(gòu)建好關(guān)系網(wǎng)絡(luò)。想嘗試不同的API網(wǎng)關(guān)(API Gateway)或服務(wù)網(wǎng)格(Service Mesh)?想通過(guò)每個(gè)服務(wù)的入口和出口流量來(lái)進(jìn)行鏈接追蹤?通過(guò)依賴解析器的自動(dòng)化分析,開(kāi)發(fā)者可以自由地試驗(yàn)新工具和配置,而無(wú)需分散精力對(duì)現(xiàn)有的任何代碼進(jìn)行更改。

  那為什么分布式應(yīng)用的依賴管理還沒(méi)出現(xiàn)?

  依賴解析將是一個(gè)非常強(qiáng)大的解決方案,使得開(kāi)發(fā)者能夠相互協(xié)作并對(duì)云原生應(yīng)用做出貢獻(xiàn),那么我們能使用現(xiàn)有的包管理器來(lái)幫助實(shí)現(xiàn)嗎?盡管使用現(xiàn)有的工具也許可行,但解決網(wǎng)絡(luò)應(yīng)用的依賴關(guān)系和解決二進(jìn)制庫(kù)文件之間還是有著明顯的差異。

  依賴的二進(jìn)制庫(kù)文件是在主庫(kù)文件編譯構(gòu)建時(shí)才下載的,但是微服務(wù)不會(huì)捆綁到單個(gè)二進(jìn)制文件中,它們需要作為獨(dú)立服務(wù)運(yùn)行,然后通過(guò)網(wǎng)絡(luò)連接交互形成一個(gè)完整的應(yīng)用。這意味著解析有著額外的步驟,并且發(fā)生在與二進(jìn)制庫(kù)完全不同的生命周期階段。事實(shí)證明,可以正確解析分布式應(yīng)用依賴關(guān)系的最早時(shí)間是在部署階段。正是在部署時(shí),我們既知道技術(shù)棧中所有服務(wù)間的關(guān)系,也了解正確配置和連接服務(wù)所需的工具與目標(biāo)環(huán)境細(xì)節(jié)。

  結(jié)語(yǔ)

  總而言之,目前還很難創(chuàng)建一個(gè)大規(guī)模的解析器用于解決網(wǎng)絡(luò)依賴,但這樣做會(huì)給工程團(tuán)隊(duì)和整個(gè)云社區(qū)帶來(lái)巨大的好處。如果我們要正確引導(dǎo)云原生工具的發(fā)展方向,我們就需要從過(guò)去的依賴管理實(shí)踐中總結(jié)學(xué)習(xí)。

  

  原文標(biāo)題:Why Distributed Apps Need Dependency Management,作者:David Thor