『壹』 J2EE涓鐨勫瑰櫒閮藉寘鎷鍝浜沖java瀹瑰櫒閮芥湁鍝浜
J2EE涓瀹瑰櫒鍏呭綋涓闂翠歡鐨勮掕壊銆備富瑕佺殑瀹瑰櫒鍖呮嫭錛
銆怶EB瀹瑰櫒銆戱細緇欏勪簬鍏朵腑鐨勫簲鐢ㄧ▼搴忕粍浠訛紙JSP錛孲ERVLET錛夋彁渚涗竴涓鐜澧冿紝浣縅SP,SERVLET鐩存帴鏇村瑰櫒涓鐨勭幆澧冨彉閲忔帴鍙d氦浜掞紝涓嶅繀鍏蟲敞鍏跺畠緋葷粺闂棰樸備富瑕佹湁WEB鏈嶅姟鍣ㄦ潵瀹炵幇銆備緥濡傦細TOMCAT,WEBLOGIC,WEBSPHERE絳夈傝ュ瑰櫒鎻愪緵鐨勬帴鍙d弗鏍奸伒瀹圝2EE瑙勮寖涓鐨刉EBAPPLICATION鏍囧噯銆傛垜浠鎶婇伒瀹堜互涓婃爣鍑嗙殑WEB鏈嶅姟鍣ㄥ氨鍙鍋欽2EE涓鐨刉EB瀹瑰櫒銆
銆怑JB瀹瑰櫒銆戱細Enterprisejavabean瀹瑰櫒銆傛洿鍏鋒湁琛屼笟棰嗗煙鐗硅壊銆備粬鎻愪緵緇欒繍琛屽湪鍏朵腑鐨勭粍浠禘JB鍚勭嶇$悊鍔熻兘銆傚彧瑕佹弧瓚矹2EE瑙勮寖鐨凟JB鏀懼叆璇ュ瑰櫒錛岄┈涓婂氨浼氳瀹瑰櫒榪涜岄珮鏁堢巼鐨勭$悊銆傚苟涓斿彲浠ラ氳繃鐜版垚鐨勬帴鍙f潵鑾峰緱緋葷粺綰у埆鐨勬湇鍔°備緥濡傞偖浠舵湇鍔°佷簨鍔$$悊銆俉EB瀹瑰櫒鍜孍JB瀹瑰櫒鍦ㄥ師鐞嗕笂鏄澶т綋鐩稿悓鐨勶紝鏇村氱殑鍖哄埆鏄琚闅旂葷殑澶栫晫鐜澧冦俉EB瀹瑰櫒鏇村氱殑鏄璺熷熀浜嶩TTP鐨勮鋒眰鎵撲氦閬撱傝孍JB瀹瑰櫒涓嶆槸銆傚畠鏄鏇村氱殑璺熸暟鎹搴撱佸叾瀹冩湇鍔℃墦浜ら亾銆備絾浠栦滑閮芥槸鎶婁笌澶栫晫鐨勪氦浜掑疄鐜頒粠鑰屽噺杞誨簲鐢ㄧ▼搴忕殑璐熸媴銆備緥濡係ERVLET涓嶇敤鍏沖績HTTP鐨勭粏鑺傦紝鐩存帴寮曠敤鐜澧冨彉閲弒ession,request,response灝辮屻丒JB涓嶇敤鍏沖績鏁版嵁搴撹繛鎺ラ熷害銆佸悇縐嶄簨鍔℃帶鍒訛紝鐩存帴鐢卞瑰櫒鏉ュ畬鎴愩
瀹瑰櫒灝辨槸浣犵殑紼嬪簭榪愯屾椂闇瑕佺殑鐜澧
1錛孴omcat鏄瘲ervlet鐨勮繍琛岀幆澧冿紝鍗充竴涓猄ervlet瀹瑰櫒銆
2錛孲ervlet瀹瑰櫒鐨勪綔鐢ㄦ槸璐熻矗澶勭悊瀹㈡埛璇鋒眰錛屽綋瀹㈡埛璇鋒眰鏉ュ埌鏃訛紝Servlet瀹瑰櫒鑾峰彇璇鋒眰錛岀劧鍚庤皟鐢ㄦ煇涓猄ervlet錛屽苟鎶奡ervlet鐨勬墽琛岀粨鏋滆繑鍥炵粰瀹㈡埛銆
3錛孲ervlet瀹瑰櫒鐨勫伐浣滆繃紼嬫槸錛氬綋瀹㈡埛璇鋒眰鏌愪釜璧勬簮鏃訛紝Servlet瀹瑰櫒浣跨敤瀵硅薄鎶婂㈡埛鐨勮鋒眰淇℃伅灝佽呰搗鏉ワ紝鐒跺悗璋冪敤javaServletAPI涓瀹氫箟鐨凷ervlet鐨勪竴浜涚敓鍛藉懆鏈熸柟娉曪紝瀹屾垚Servlet鐨勬墽琛岋紝鎺ョ潃鎶奡ervlet鎵ц岀殑瑕佽繑鍥炵粰瀹㈡埛鐨勭粨鏋滃皝瑁呭埌瀵硅薄涓錛屾渶鍚嶴ervlet瀹瑰櫒鎶婂㈡埛鐨勮鋒眰鍙戦佺粰瀹㈡埛錛屽畬鎴愪負瀹㈡埛鐨勪竴嬈℃湇鍔¤繃紼嬨傛瘡涓涓猄ervlet鐨勭被閮芥墽琛宨nit錛堬級銆乻ervice錛堬級銆乨estory錛堬級涓変釜鍑芥暟鐨勮嚜鍔ㄨ皟鐢錛屽湪鍚鍔ㄦ椂璋冪敤涓嬈init錛堬級鍑芥暟鐢ㄤ互榪涜屽弬鏁扮殑鍒濆嬪寲錛屽湪鏈嶅姟鏈熼棿姣忓綋鎺ユ敹鍒板硅Servlet鐨勮鋒眰鏃墮兘浼氳皟鐢⊿ervice錛堬級鍑芥暟鎵ц岃Servlet鐨勬湇鍔℃搷浣滐紝褰撳瑰櫒閿姣佹椂璋冪敤涓嬈destory錛堬級鍑芥暟銆
4錛屽吀鍨嬬殑Servlet搴旂敤鏄鐩戝惉鍣ㄣ佽繃婊ゅ櫒鐨勫疄鐜般
『貳』 程序開發中常用的組件是什麼
組件就是自包含的、可編程的、可重用的、與語言無關的軟體單元,軟體組件可以很容易被用於組裝應用程序中。
Python 解釋器可以從多種源獲得輸入:作為標准輸入或程序參數傳入的腳本,以交互方式鍵入的語句,導入的模塊源文件等等。 這一章將給出在這些情況下所用的語法。
9.1. 完整的 Python 程序
雖然語言規范描述不必規定如兄轎啟何發起調用語言解釋器,但對完整的 Python 程序加以說明還是很有用的。 一個完整的 Python 程序會在最小初始化環境中被執行:所有內置和標准模塊均為可用,但均處於未初始化狀態,只有 sys (各種系統服務), builtins (內置函數、異常以及 None) 和 __main__ 除外。 最後一個模塊用於為完整程序的執行提供局部和全局命名空間。
適用於一個完整 Python 程序的語法即下節所描述的文件輸入。
解釋器也可以通過交互模式被發起調用;在此情況下,它並不讀取和執行一個完整程序,而是每次讀取和執行一條語句(可能為復合語句)。 此時的初始環境與一個完整程序的相同;每條語句會在 __main__ 的命名空間中被執行。
一個完整程序可通過三種形式被傳遞給解釋器:使用 -c 字元串 命令行選項,使用一個文件作為第一個命令行參數,或者使用標准輸入。 如果文件或標准輸入是一個 tty 設置,解釋器會進入交互模式;否則的話,它會將文件當作一個完整程序來執行。
Python 解釋器可以從多種源獲得輸入:作為標准輸入或程序參數傳入的腳本,以交互方式鍵入的語句,導入的模塊源文件等等。 這一章將給出在這些情況下所用的語法。
9.1. 完整的 Python 程序
雖然語言規范描述不必規定如何發起調用語言解釋器,但對完整的 Python 程序加以說明還是很有用的。 一個完整的 Python 程序會在最小初始化環境中被執行:所有內置和標准模塊均為可用,但均處於未初始化狀態,只有 sys (各種系統服務), builtins (內置函數、異常以及 None) 和帆衫 __main__ 除外。 最後一個模塊用於為完整程序的執行提供局部和全局命名空間。
適用於一個完整 Python 程序的語法即下節所描述的文件輸入。
解釋器也可以通過交互模式被發起調用;在此情況下,它並不讀取和執行一個完整程序,而是每次讀取和執行一條語句(可能為復合語句)。 此時的初始環境與一個完整程序的相同;每條語句會在 __main__ 的命名空間中被執行。
一個完整程序可通過三種形式被傳遞給解釋器:使用 -c 字元串 命令行選項,使用一個文件作為第一個命令行參數,或者使用標准輸入。 如果文件或標准輸入是一個 tty 設置,解釋器會進入交互模式;否則的話,它會將文件當作一個完整羨如程序來執行。
『叄』 百戰程序員:編程里有一個術語叫做容器,它是什麼意思
容器,我們常規的說就是一個器皿,比如,杯子,它可以裝水
程序中的容器也是一樣,指的就是程序中的器皿,它可以存放數據,
但是程序中的數據是多種多樣的,所以容器也就慧多種多樣。
但是也有很多萬能的容器,比如object,ArrayList,哈西表等等。
『肆』 微服務架構之「 容器技術 」
現在一聊到容器技術,大家就默認是指 Docker 了。但事實上,在 Docker 出現之前,PaaS社區早就有容器技術了,以 Cloud Foundry、OpenShift 為代表的就是當時的主流。
那為啥最終還是 Docker 火起來了呢?
因為傳統的PaaS技術雖然也可以一鍵將本地應用部署到雲上,並且也是採用隔離環境(容器)的形式去部署,但是其兼容性非常的不好。因為其主要原理就是將本地應用程序和啟停腳本一同打包,然後上傳到雲伺服器上,然後再在雲伺服器里通過腳本啟動這個應用程序。
這樣的做法,看起來很理想。但是在實際情況下,由於本地與雲端的環境差異,導致上傳到雲端的應用經常各種報錯、運行不起來,需要各種修改配置和參數來做兼容。甚至在項目迭代過程中不同的版本代碼都需要重新去做適配,非常耗費精力。
然而 Docker 卻通過一個小創新完美的解決了這個問題。在 Docker 的方案中,它不僅打包了本地應用程序,而且還將本地環境(操作系統的一部分)也打包了,組成一個叫做「 Docker鏡像 」的文件包。所以這個「 Docker鏡像 」就包含了應用運行所需的全部依賴,我們可以直接基於這個「 Docker鏡像 」在本地進行開發與測試,完成之後,再直接將這個「 Docker鏡像 」一鍵上傳到雲端運行即可。
Docker 實現了本地與雲端的環境完全一致,做到了真正的一次開發隨處運行。
一、容器到底是什麼?
容器到底是什麼呢?也許對於容器不太了解,但我們對虛擬機熟悉啊,那麼我們就先來看一下容器與虛擬機的對比區別:
上圖的左側是虛擬機的原理,右側是Docker容器的原理。
虛擬機是在宿主機上基於 Hypervisor 軟體虛擬出一套操作系統所需的硬體設備,再在這些虛擬硬體上安裝操作系統 Guest OS,然後不同的應用程序就可以運行在不同的 Guest OS 上,應用之間也就相互獨立、資源隔離了,但是由於需要 Hypervisor 來創建虛擬機,且每個虛擬機里需要完整的運行一套操作系統 Guest OS,因此這個方式會帶來很多額外資源的開銷。
而 Docker容器 中卻沒有 Hypervisor 這一層,雖然它需要在宿主機中運行 Docker Engine,但它的原理卻完全不同於 Hypervisor,它並沒有虛擬出硬體設備,更沒有獨立部署全套的操作系統 Guest OS。
Docker容器沒有那麼復雜的實現原理,它其實就是一個普通進程而已,只不過它是一種經過特殊處理過的普通進程。
我們啟動容器的時候(docker run …),Docker Engine 只不過是啟動了一個進程,這個進程就運行著我們容器里的應用。但 Docker Engine 對這個進程做了一些特殊處理,通過這些特殊處理之後,這個進程所看到的外部環境就不再是宿主機的那個環境了(它看不到宿主機中的其它進程了,以為自己是當前操作系統唯一一個進程),並且 Docker Engine 還對這個進程所使用得資源進行了限制,防止它對宿主機資源的無限使用。
那 Docker Engine 具體是做了哪些特殊處理才有這么神奇的效果呢?
二、容器是如何做到資源隔離和限制的?
Docker容器對這個進程的隔離主要採用2個技術點:
弄清楚了這兩個技術點對理解容器的原理非常重要,它們是容器技術的核心。
下面來詳細解釋一下:
三、容器的鏡像是什麼?
一個基礎的容器鏡像其實就是一個 rootfs,它包含操作系統的文件系統(文件和目錄),但並不包含操作系統的內核。
rootfs 是在容器里根目錄上掛載的一個全新的文件系統,此文件系統與宿主機的文件系統無關,是一個完全獨立的,用於給容器進行提供環境的文件系統。
對於一個Docker容器而言,需要基於 pivot_root 指令,將容器內的系統根目錄切換到rootfs上,這樣,有了這個 rootfs,容器就能夠為進程構建出一個完整的文件系統,且實現了與宿主機的環境隔離,也正是有了rootfs,才能實現基於容器的本地應用與雲端應用運行環境的一致。
另外,為了方便鏡像的復用,Docker 在鏡像中引入了層(Layer)的概念,可以將不同的鏡像一層一層的迭在一起。這樣,如果我們要做一個新的鏡像,就可以基於之前已經做好的某個鏡像的基礎上繼續做。
如上圖,這個例子中最底層是操作系統引導,往上一層就是基礎鏡像層(Linux的文件系統),再往上就是我們需要的各種應用鏡像,Docker 會把這些鏡像聯合掛載在一個掛載點上,這些鏡像層都是只讀的。只有最上面的容器層是可讀可寫的。
這種分層的方案其實是基於 聯合文件系統UnionFS(Union File System)的技術實現的。它可以將不同的目錄全部掛載在同一個目錄下。舉個例子,假如有文件夾 test1 和 test2 ,這兩個文件夾裡面的文件 有相同的,也有不同的。然後我們可以採用聯合掛載的方式,將這兩個文件夾掛載到 test3 上,那麼 test3 目錄里就有了 test1 和 test2 的所有文件(相同的文件有去重,不同的文件都保留)。
這個原理應用在Docker鏡像中,比如有2個同學,同學A已經做好了一個基於Linux的Java環境的鏡像,同學S想搭建一個Java Web環境,那麼他就不必再去做Java環境的鏡像了,可以直接基於同學A的鏡像在上面增加Tomcat後生成新鏡像即可。
以上,就是對微服務架構之「 容器技術 」的一些思考。
碼字不易啊,喜歡的話不妨轉發朋友,或點擊文章右下角的「在看」吧。