六種隔離技術(shù)你知道幾種呢?

2021-02-06    分類(lèi): 網(wǎng)站建設(shè)

為了將我們的應(yīng)用部署到服務(wù)器上,我們需要為其配置一個(gè)運(yùn)行環(huán)境。從底層到頂層有這樣的運(yùn)行環(huán)境及容器:

  1. 隔離硬件:虛擬機(jī)
  2. 隔離操作系統(tǒng):容器虛擬化
  3. 隔離底層:Servlet容器
  4. 隔離依賴版本:虛擬環(huán)境
  5. 隔離運(yùn)行環(huán)境:語(yǔ)言虛擬機(jī)
  6. 隔離語(yǔ)言:DSL

實(shí)現(xiàn)上這是一個(gè)請(qǐng)求的處理過(guò)程,一個(gè)HTTP請(qǐng)求會(huì)先到達(dá)你的


從上圖中我們還可以發(fā)現(xiàn)一點(diǎn): Docker容器是建立在Aufs基礎(chǔ)上的。AUFS是一種Union File System,它可以不同的目錄掛載到同一個(gè)虛擬文件系統(tǒng)下。它的目的就是為了實(shí)現(xiàn)上圖的增量遞增的過(guò)程,同時(shí)又不會(huì)影響原有的目錄。即如下的流程如下:

程序員必知的六種隔離技術(shù)

image

其增量的過(guò)程和我們使用Git的過(guò)程中有點(diǎn)像,除了在最開(kāi)始的時(shí)候會(huì)有一個(gè)鏡像層。隨后我們的修改都可以保存下來(lái),并且當(dāng)下次我們提交修改的時(shí)候,我們也可以在舊有的提交上運(yùn)行。

因此,Docker與LXC的差距就如下如圖所示:

程序員必知的六種隔離技術(shù)

LXC時(shí)每個(gè)虛擬機(jī)只能是一個(gè)虛擬機(jī),而Docker則是一系列的虛擬機(jī)。

3、隔離底層(Servlet容器)

在上面的例子里我們已經(jīng)隔離開(kāi)了操作系統(tǒng)的因素,接著我們還需要解決操作系統(tǒng)、開(kāi)發(fā)環(huán)境引起的差異。早期開(kāi)發(fā)Web應(yīng)用時(shí),人們使用CGI技術(shù),它可以讓一個(gè)客戶端,從網(wǎng)頁(yè)瀏覽器向執(zhí)行在網(wǎng)絡(luò)服務(wù)器上的程序請(qǐng)求數(shù)據(jù)。并且CGI程序可以用任何腳本語(yǔ)言或者是完全獨(dú)立編程語(yǔ)言實(shí)現(xiàn),只要這個(gè)語(yǔ)言可以在這個(gè)系統(tǒng)上運(yùn)行。而這樣的腳本語(yǔ)言在多數(shù)情況下是依賴于系統(tǒng)環(huán)境的,特別是針對(duì)于C++這一類(lèi)的編譯語(yǔ)言來(lái)說(shuō),在不同的操作系統(tǒng)中都需要重新編譯。

而Java的Servlet則是另外一種有趣的存在,它是一種獨(dú)立于平臺(tái)和協(xié)議的服務(wù)器端的Java應(yīng)用程序,可以生成動(dòng)態(tài)的Web頁(yè)面。

Tomcat

在開(kāi)發(fā)Java Web應(yīng)用的過(guò)程中,我們?cè)陂_(kāi)始環(huán)境使用Jetty來(lái)運(yùn)行我們的服務(wù),而在生產(chǎn)環(huán)境使用Tomcat來(lái)運(yùn)行。他們都是Servlet容器,可以在其上面運(yùn)行著同一個(gè)Servlet應(yīng)用。Servlet是指由Java編寫(xiě)的服務(wù)器端程序,它們是為響應(yīng)Web應(yīng)用程序上下文中的HTTP請(qǐng)求而設(shè)計(jì)的。它是應(yīng)用服務(wù)器中位于組件和平臺(tái)之間的接口集合。

Tomcat服務(wù)器是一個(gè)免費(fèi)的開(kāi)放源代碼的Web應(yīng)用服務(wù)器。它運(yùn)行時(shí)占用的系統(tǒng)資源小,擴(kuò)展性好,支持負(fù)載平衡與郵件服務(wù)等開(kāi)發(fā)應(yīng)用系統(tǒng)常用的功能。除此,它還是一個(gè)Servlet和JSP容器,獨(dú)立的Servlet容器是Tomcat的默認(rèn)模式。其架構(gòu)如下圖所示:

程序員必知的六種隔離技術(shù)

Servlet被部署在應(yīng)用服務(wù)器中,并由容器來(lái)控制其生命周期。在運(yùn)行時(shí)由Web服務(wù)器軟件處理一般請(qǐng)求,并把Servlet調(diào)用傳遞給“容器”來(lái)處理。并且Tomcat也會(huì)負(fù)責(zé)對(duì)一些靜態(tài)資源的處理。

4、隔離依賴版本(虛擬環(huán)境)

對(duì)于Java這一類(lèi)的編譯語(yǔ)言來(lái)說(shuō),不存在太多語(yǔ)言運(yùn)行帶來(lái)的問(wèn)題。而對(duì)于動(dòng)態(tài)語(yǔ)言來(lái)說(shuō)就存在這樣的問(wèn)題,如Ruby、Python、Node.js等等,這一個(gè)問(wèn)題主要集中于開(kāi)發(fā)環(huán)境。當(dāng)然如果你在一個(gè)服務(wù)器上運(yùn)行著幾個(gè)不同的應(yīng)用來(lái)說(shuō),也會(huì)存在這樣的問(wèn)題。這一類(lèi)的工具在Python里有VirtualEnv,在Ruby里有RVM、Rbenv,在Node.js里有NVM。

下圖是使用VirtualEnv時(shí)的不同幾個(gè)應(yīng)用的架構(gòu)圖:

程序員必知的六種隔離技術(shù)

如下所示,在不同的虛擬環(huán)境里,我們可以使用不同的依賴庫(kù)。在這上面構(gòu)建不同的應(yīng)用,也可以使用不同的Python版本來(lái)構(gòu)建系統(tǒng)。通常來(lái)說(shuō),這一類(lèi)的工具主要用于本地的開(kāi)發(fā)環(huán)境。

5、隔離運(yùn)行環(huán)境(語(yǔ)言虛擬機(jī))

最后一個(gè)要介紹的可能就是更加抽象的,但是也是更加實(shí)用的一個(gè),JVM就是這方面的一個(gè)代表。在我們的編程生涯里,我們很容易就會(huì)遇到跨平臺(tái)問(wèn)題——即我們?cè)谖覀兊拈_(kāi)發(fā)機(jī)器上開(kāi)發(fā)的軟件,在我們的產(chǎn)品環(huán)境的機(jī)器上就沒(méi)有辦法運(yùn)行。特別是當(dāng)我們使用Mac OS或者Windows機(jī)器上開(kāi)發(fā)了我們的應(yīng)用,然后我們需要在Linux系統(tǒng)上運(yùn)行,就會(huì)遇到各種問(wèn)題。并且當(dāng)我們使用了一個(gè)需要重新編譯的庫(kù)時(shí),這種問(wèn)題就更加麻煩。

如下圖所示的是JVM的架構(gòu)示意圖

程序員必知的六種隔離技術(shù)

JVM是一種用于計(jì)算設(shè)備的規(guī)范,它是一個(gè)虛構(gòu)出來(lái)的計(jì)算機(jī),是通過(guò)在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來(lái)實(shí)現(xiàn)的。它可以實(shí)現(xiàn)“編寫(xiě)一次,到處運(yùn)行”。

換句話來(lái)說(shuō),它在底層實(shí)現(xiàn)了環(huán)境隔離,它屏蔽了與具體操作系統(tǒng)平臺(tái)相關(guān)的信息,使得Java程序只需生成在Java虛擬機(jī)上運(yùn)行的目標(biāo)代碼(字節(jié)碼),就可以在多種平臺(tái)上不加修改地運(yùn)行。

基于此,只要其他編程語(yǔ)言的編譯器能生成正確Java bytecode文件,這個(gè)語(yǔ)言也能實(shí)現(xiàn)在JVM上運(yùn)行。如下圖所示的是基于JVM的Jython語(yǔ)言的架構(gòu)圖:

程序員必知的六種隔離技術(shù)

其底層是基于JVM,而編寫(xiě)時(shí)則是用Python語(yǔ)言,并且他可以使用Java的模塊來(lái)編程。

常見(jiàn)擁有同樣架構(gòu)的工具,還有MySQL,如下圖是所示的是MySQL的架構(gòu)圖:

程序員必知的六種隔離技術(shù)

MySQL在最頂層提供了一個(gè)名為SQL的查詢語(yǔ)言,這個(gè)查詢語(yǔ)言只能用于查詢數(shù)據(jù)庫(kù),然而它卻是一種更高級(jí)的用法 。它不像通用目的語(yǔ)言那樣目標(biāo)范圍涵蓋一切軟件問(wèn)題,而是專(zhuān)門(mén)針對(duì)某一特定問(wèn)題的計(jì)算機(jī)語(yǔ)言,即領(lǐng)域特定語(yǔ)言。

6、隔離語(yǔ)言(DSL)

這是一門(mén)特別有意思也特別值得期待的技術(shù),但是實(shí)現(xiàn)它并不是一件容易的事。

作為討論隔離環(huán)境的一部分,我們只看外部DSL。內(nèi)部DSL與外部DSL大的區(qū)別在于:外部DSL近似于創(chuàng)建了一種新的語(yǔ)法和語(yǔ)義的全新語(yǔ)言。如下圖所示是兩中DSL的一種對(duì)比:

程序員必知的六種隔離技術(shù)

在這樣的外部DSL里,我們有自己的語(yǔ)法、自己的解析器、類(lèi)型檢測(cè)器等等。最簡(jiǎn)單且最常用的DSL就是Markdown,如下圖所示:

程序員必知的六種隔離技術(shù)

如果我們可以將我們的業(yè)務(wù)邏輯寫(xiě)成DSL,那么我們就不需要擔(dān)心底層語(yǔ)言的變動(dòng)過(guò)多地影響原有的業(yè)務(wù)邏輯。換句話說(shuō),這相當(dāng)于創(chuàng)建了我們自己的語(yǔ)言隔離環(huán)境,我們不需要思考用何種語(yǔ)言來(lái)實(shí)用我們的業(yè)務(wù)。

分享文章:六種隔離技術(shù)你知道幾種呢?
文章網(wǎng)址:http://muchs.cn/news25/99425.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)企業(yè)建站、外貿(mào)建站營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站、小程序開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作