2021-02-06 分類: 網(wǎng)站建設(shè)
為了將我們的應(yīng)用部署到服務(wù)器上,我們需要為其配置一個運行環(huán)境。從底層到頂層有這樣的運行環(huán)境及容器:
實現(xiàn)上這是一個請求的處理過程,一個HTTP請求會先到達你的
從上圖中我們還可以發(fā)現(xiàn)一點: Docker容器是建立在Aufs基礎(chǔ)上的。AUFS是一種Union File System,它可以不同的目錄掛載到同一個虛擬文件系統(tǒng)下。它的目的就是為了實現(xiàn)上圖的增量遞增的過程,同時又不會影響原有的目錄。即如下的流程如下:
image
其增量的過程和我們使用Git的過程中有點像,除了在最開始的時候會有一個鏡像層。隨后我們的修改都可以保存下來,并且當(dāng)下次我們提交修改的時候,我們也可以在舊有的提交上運行。
因此,Docker與LXC的差距就如下如圖所示:
LXC時每個虛擬機只能是一個虛擬機,而Docker則是一系列的虛擬機。
3、隔離底層(Servlet容器)
在上面的例子里我們已經(jīng)隔離開了操作系統(tǒng)的因素,接著我們還需要解決操作系統(tǒng)、開發(fā)環(huán)境引起的差異。早期開發(fā)Web應(yīng)用時,人們使用CGI技術(shù),它可以讓一個客戶端,從網(wǎng)頁瀏覽器向執(zhí)行在網(wǎng)絡(luò)服務(wù)器上的程序請求數(shù)據(jù)。并且CGI程序可以用任何腳本語言或者是完全獨立編程語言實現(xiàn),只要這個語言可以在這個系統(tǒng)上運行。而這樣的腳本語言在多數(shù)情況下是依賴于系統(tǒng)環(huán)境的,特別是針對于C++這一類的編譯語言來說,在不同的操作系統(tǒng)中都需要重新編譯。
而Java的Servlet則是另外一種有趣的存在,它是一種獨立于平臺和協(xié)議的服務(wù)器端的Java應(yīng)用程序,可以生成動態(tài)的Web頁面。
Tomcat
在開發(fā)Java Web應(yīng)用的過程中,我們在開始環(huán)境使用Jetty來運行我們的服務(wù),而在生產(chǎn)環(huán)境使用Tomcat來運行。他們都是Servlet容器,可以在其上面運行著同一個Servlet應(yīng)用。Servlet是指由Java編寫的服務(wù)器端程序,它們是為響應(yīng)Web應(yīng)用程序上下文中的HTTP請求而設(shè)計的。它是應(yīng)用服務(wù)器中位于組件和平臺之間的接口集合。
Tomcat服務(wù)器是一個免費的開放源代碼的Web應(yīng)用服務(wù)器。它運行時占用的系統(tǒng)資源小,擴展性好,支持負載平衡與郵件服務(wù)等開發(fā)應(yīng)用系統(tǒng)常用的功能。除此,它還是一個Servlet和JSP容器,獨立的Servlet容器是Tomcat的默認模式。其架構(gòu)如下圖所示:
Servlet被部署在應(yīng)用服務(wù)器中,并由容器來控制其生命周期。在運行時由Web服務(wù)器軟件處理一般請求,并把Servlet調(diào)用傳遞給“容器”來處理。并且Tomcat也會負責(zé)對一些靜態(tài)資源的處理。
4、隔離依賴版本(虛擬環(huán)境)
對于Java這一類的編譯語言來說,不存在太多語言運行帶來的問題。而對于動態(tài)語言來說就存在這樣的問題,如Ruby、Python、Node.js等等,這一個問題主要集中于開發(fā)環(huán)境。當(dāng)然如果你在一個服務(wù)器上運行著幾個不同的應(yīng)用來說,也會存在這樣的問題。這一類的工具在Python里有VirtualEnv,在Ruby里有RVM、Rbenv,在Node.js里有NVM。
下圖是使用VirtualEnv時的不同幾個應(yīng)用的架構(gòu)圖:
如下所示,在不同的虛擬環(huán)境里,我們可以使用不同的依賴庫。在這上面構(gòu)建不同的應(yīng)用,也可以使用不同的Python版本來構(gòu)建系統(tǒng)。通常來說,這一類的工具主要用于本地的開發(fā)環(huán)境。
5、隔離運行環(huán)境(語言虛擬機)
最后一個要介紹的可能就是更加抽象的,但是也是更加實用的一個,JVM就是這方面的一個代表。在我們的編程生涯里,我們很容易就會遇到跨平臺問題——即我們在我們的開發(fā)機器上開發(fā)的軟件,在我們的產(chǎn)品環(huán)境的機器上就沒有辦法運行。特別是當(dāng)我們使用Mac OS或者Windows機器上開發(fā)了我們的應(yīng)用,然后我們需要在Linux系統(tǒng)上運行,就會遇到各種問題。并且當(dāng)我們使用了一個需要重新編譯的庫時,這種問題就更加麻煩。
如下圖所示的是JVM的架構(gòu)示意圖
JVM是一種用于計算設(shè)備的規(guī)范,它是一個虛構(gòu)出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現(xiàn)的。它可以實現(xiàn)“編寫一次,到處運行”。
換句話來說,它在底層實現(xiàn)了環(huán)境隔離,它屏蔽了與具體操作系統(tǒng)平臺相關(guān)的信息,使得Java程序只需生成在Java虛擬機上運行的目標代碼(字節(jié)碼),就可以在多種平臺上不加修改地運行。
基于此,只要其他編程語言的編譯器能生成正確Java bytecode文件,這個語言也能實現(xiàn)在JVM上運行。如下圖所示的是基于JVM的Jython語言的架構(gòu)圖:
其底層是基于JVM,而編寫時則是用Python語言,并且他可以使用Java的模塊來編程。
常見擁有同樣架構(gòu)的工具,還有MySQL,如下圖是所示的是MySQL的架構(gòu)圖:
MySQL在最頂層提供了一個名為SQL的查詢語言,這個查詢語言只能用于查詢數(shù)據(jù)庫,然而它卻是一種更高級的用法 。它不像通用目的語言那樣目標范圍涵蓋一切軟件問題,而是專門針對某一特定問題的計算機語言,即領(lǐng)域特定語言。
6、隔離語言(DSL)
這是一門特別有意思也特別值得期待的技術(shù),但是實現(xiàn)它并不是一件容易的事。
作為討論隔離環(huán)境的一部分,我們只看外部DSL。內(nèi)部DSL與外部DSL大的區(qū)別在于:外部DSL近似于創(chuàng)建了一種新的語法和語義的全新語言。如下圖所示是兩中DSL的一種對比:
在這樣的外部DSL里,我們有自己的語法、自己的解析器、類型檢測器等等。最簡單且最常用的DSL就是Markdown,如下圖所示:
如果我們可以將我們的業(yè)務(wù)邏輯寫成DSL,那么我們就不需要擔(dān)心底層語言的變動過多地影響原有的業(yè)務(wù)邏輯。換句話說,這相當(dāng)于創(chuàng)建了我們自己的語言隔離環(huán)境,我們不需要思考用何種語言來實用我們的業(yè)務(wù)。
網(wǎng)站題目:六種隔離技術(shù)你知道幾種呢?
文章起源:http://www.rwnh.cn/news/99425.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計、微信小程序、營銷型網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、App開發(fā)、面包屑導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容