技術領域是不斷變化的,因此,任何應用程式都可能在很短時間內面臨過時甚至淘汰,更新換代的速度之快給人的感覺越來越強烈,我們如何使傳統應用程式保持活力不落伍?工程師想的可能是從頭開始重建傳統應用程式,這與公司的業務目標和產品時間表通常是相悖的。如果現階段正在執行的應用程式是正常工作的,這時候你很難找到正當而充分的理由讓技術人員花六個月重寫應用程式。**債似乎注定意味著失敗。
眾所周知,產品開發向來都不是非黑即白那麼簡單,必須要權衡各方妥協折衷進行,雖然完全重寫的可行性不大,但應用程式現代化的長遠利益仍然值得重視。雖然許多組織尚未能構建全新的雲本地應用程式,但通過使用一些技術比如docker等容器技術,仍然能夠實現傳統應用程式的現代化。
這些現代化技術最終可以歸納為三種類別:擴充套件,重構和重建。在開始介紹它們之前,讓我們先來談談關於dockerfile的一些基礎知識。
對於初學者來說,docker是乙個容器化平台,它包含了基本上可以安裝在伺服器上的所有東西,即「在乙個完整的檔案系統中包含乙個軟體執行所需的一切:**,執行時,系統工具,系統庫」, 而且沒有虛擬化平台的開銷。
雖然容器的優點和缺點不在本文的討論範圍之內,但還是不得不提,docker的最大優點之一即只需幾行**就能夠快速輕鬆地啟動輕量級、可重複的伺服器環境。這種配置是通過乙個名為dockerfile的檔案完成的,dockerfile本質上是docker用來構建容器映象的藍圖。在這裡,dockerfile啟動了乙個簡單的基於python的web伺服器以供參考:
# use the python:2.7 base image
from python:2.7
# expose port 80 internally to docker process
expose 80
# set /code to the working directory for the following commands
workdir /code
# copy all files in current directory to the /code directory
add . /code
# create the index.html file in the /code directory
run touch index.html
# start the python web server
cmd python index.py
這個例子比較簡單,但已經很能說明關於dockerfile一些基礎知識,涵蓋擴充套件預先存在的映象、暴露埠以及執行命令和服務。只要基礎源**架構設計合理,此時只需幾個指令就可以啟動非常強大的微服務。
從根本上說,傳統應用程式容器化並不困難,困難在於並不是每個應用程式都是建構在容器化的基礎上。docker有乙個臨時檔案系統,這意味著容器內的儲存並不持久。如果不採取一些特定措施,儲存在docker容器中的任何檔案都可能丟失。此外,並行化是應用程式容器化的面臨另乙個難題,因為docker的乙個最大優點就在於它能快速適應日益增長的流量需求,這些應用程式需要能夠與多個例項並行執行。
綜上所述,為使傳統應用程式容器化,有以下幾種路徑:擴充套件、重構或者重建。哪種方法最適合,則完全取決於組織的需求和資源。
一般來說,擴充套件非容器化應用程式的已有功能在這幾種辦法中最為簡便,但如果處理不好,所做的更改可能會導致技術債顯著增加。利用容器技術擴充套件傳統應用程式的最好辦法是通過微服務和api。雖然傳統應用程式本身並沒有被容器化,為使產品實現現代化,可將新特性從基於docker的微服務中隔離,同時開發遺留**,易於將來重構或重建。
從高層面來說,對於那些在不久的將來很可能變得落後或必須經歷重建的應用程式而言,擴充套件是很好的選擇——不過**庫越老,為適應docker平台,應用程式的某些部分就越需要徹底重構。
但有時,通過微服務或api擴充套件應用程式是不實際甚至不可行的。無論是欠缺要新增的新功能,還是通過擴充套件新增新功能很困難,重構舊**庫的某些部分都可能是必要的。將當前應用程式的各個現有功能從容器化的微服務中隔離出來,就能輕鬆完成重構了。例如,將整個社交網路重構到docker化的應用程式可能是不切實際的,但通過退出執行使用者搜尋引擎,就能夠將各個元件作為單獨的docker容器隔離。
重構傳統應用程式另一途徑是用於寫入日誌、使用者檔案等內容的儲存機制。在docker中執行應用程式的最大障礙之一是臨時檔案系統。這種情況可以通過幾種方式進行處理,最常見的是通過使用基於雲的儲存方法,如amazons3或google雲儲存。通過重構檔案儲存方法以利用這些平台,應用程式可以很容易地在docker容器中執行而不丟失任何資料。
當傳統應用程式無法支援多個執行的例項時,不從頭重建的話,可能無法新增docker支援。傳統應用程式服務週期可以很長,但如果應用程式的架構和設計決策在初始階段就不夠合理的話,則可能影響將來對應用程式的有效重構。意識到即將發生的阻礙對於識別生產率風險至關重要。
大體來說,利用容器技術實現傳統應用程式的現代化並沒有硬性規則。至於哪種才是最佳決策則要視產品需求和業務需求而定。但是,要想確保應用程式穩定執行而不損失生產力,充分了解哪些決策會如何影響組織長期執行,是至關重要的。
翻譯:劉力,rancher labs大中華區架構師。
9月27日,北京海航萬豪酒店,容器技術大會container day 2017即將舉行。
cloudstack之父、海航科技技術總監、華為paas部門部長、恆豐銀行科技部總經理、阿里雲paas工程總監、民生保險cio······均已加入豪華講師**!
11家已容器落地企業,15位真·雲計算大咖,13場純·技術演講,結合實戰場景,聚焦落地經驗。免費參會+超高規格,詳細議程及註冊鏈結請戳
Silverlight應用程式擴充套件服務
使用應用程式擴充套件服務可以擴充套件 silverlight 應用程式模型。通常使用擴充套件服務來封裝特定功能域中由多個應用程式使用的功能。例如,可以使用擴充套件服務來實現專用 處理或自定義資料訪問層。本主題包含以下各節 服務以您指定的順序進行註冊。這使您能夠建立對之前註冊的服務具有依賴項的服務。必...
使用lua擴充套件應用程式
全域性變數的操作 void lua getglobal lua state l const char name 此函式從lua中取出乙個名為name的全域性變數並將其壓入棧中。如當lua檔案內容為 width 200 height 300 時,以下 int tmain int argc,tchar ...
ios應用程式和應用程式委託
其實說白了,就是乙個類將自己不願意實現的方法以協議的方式定義,同時在這個類中包含有乙個型別為id 泛型類 的例項變數,如果另乙個類實現了這個協議,那麼另外的這個類就可以作為第乙個類的委託物件,前乙個類將自己不願意實現的類委託給後乙個類。因為第乙個類擁有第二個類的引用,所有第乙個類的例項可以直接呼叫第...