指定应用程序网络连接_总结Java开发Web应用程序应该理解的几个知识点
前言
前面我們對Web應(yīng)用開發(fā)的底層技術(shù)做了一些串聯(lián),也就是從應(yīng)用程序的本質(zhì)出發(fā)來理解為什么我們的應(yīng)用程序架構(gòu)的演變。
特別是Spring框架的出現(xiàn),它在Web應(yīng)用開發(fā)中扮演的角色,特別是Servlet規(guī)范主導(dǎo)了整個Web應(yīng)用程序的演化全過程。
本文我們接著上面文章,繼續(xù)沿著Web應(yīng)用程序底層數(shù)據(jù)流的處理和演變來串一下開發(fā)現(xiàn)代Web應(yīng)用程序所需要的知識點和原理。
應(yīng)用程序設(shè)計的隔離與通信
從我們開發(fā)應(yīng)用程序的技術(shù)設(shè)計角度來說,由于計算機對于業(yè)務(wù)數(shù)據(jù)的呈現(xiàn)和業(yè)務(wù)邏輯的處理都是每次只能處理一部分的,這個過程中會后很多的處理頻次和中間的數(shù)據(jù)狀態(tài)需要保存如此以來,我們開發(fā)應(yīng)用程序最基礎(chǔ)的需求就是對不同數(shù)據(jù)的隔離存儲和相互使用的通信聯(lián)系的建立和控制。
也就是說我們應(yīng)用程序使用的對象實例是有區(qū)域限制的,也就是可見性限制。因為我們知道,我們編程的本質(zhì)就是對數(shù)據(jù)進行隔離和通信。
而在我們使用類似Java的高級語言開發(fā)應(yīng)用時,Java語言就為我們提供了很多規(guī)范的定義,讓我們能夠?qū)崿F(xiàn)對數(shù)據(jù)的封裝分離,同時還能在某個特定的范圍內(nèi)進行通信交換。
其本質(zhì)就是為數(shù)據(jù)的存儲空間添加一個標(biāo)記,使得引用和被引用的圈層之間相互隔離,同時又能通過某種地址表示獲取到該數(shù)據(jù)。
這些就是高級開發(fā)語言中各類關(guān)鍵字的作用。
Web應(yīng)用層級開發(fā)內(nèi)容
在Web應(yīng)用程序?qū)蛹?#xff0c;我們在開發(fā)一個應(yīng)用程序時,其實只是開發(fā)了該應(yīng)用程序的具體數(shù)據(jù)處理部分,而哪些網(wǎng)絡(luò)連接,數(shù)據(jù)解析以及跟操作系統(tǒng)交互部分都是web服務(wù)器應(yīng)用來完成的。
所以嚴格來說,我們開發(fā)的應(yīng)用程序只是涉及到業(yè)務(wù)的數(shù)據(jù)表達和邏輯的實現(xiàn)上,而沒有去關(guān)注更為基礎(chǔ)的網(wǎng)絡(luò)連接,數(shù)據(jù)接收和發(fā)送以及中間調(diào)用的系統(tǒng)資源等。
可以說Web應(yīng)用程序只是整個應(yīng)用的一部分,或者說我們開發(fā)人員之編寫了一個內(nèi)容部分而外殼是有web服務(wù)器來負責(zé)提供的。這就要求我們在開發(fā)這類應(yīng)用程序時,需要考慮web服務(wù)器為我們提供的環(huán)境接口以及web服務(wù)器對于能夠在它上面運行的應(yīng)用程序的規(guī)范和要求。
這也是Servlet規(guī)范中的主要內(nèi)容,最初我們會將這種規(guī)范形象化為JSP,后來到JSF再到JSFX等。
當(dāng)然這是對于處理內(nèi)容表現(xiàn)上一些規(guī)范,如果我們不需要展現(xiàn),那么可以直接使用二進制數(shù)據(jù)流,也可以使用定義的任何數(shù)據(jù)類型。
這取決于具體的應(yīng)用環(huán)境和遵循的協(xié)議。
我們這里只說常用的基于HTTP的服務(wù)和處理。HTTP協(xié)議規(guī)定了每次傳輸?shù)臄?shù)據(jù)結(jié)構(gòu),以及在控制傳輸過程中常用的命令和回復(fù)代碼以及內(nèi)容表現(xiàn)形式,而它會抽象為我們編程的具體函數(shù)和方法,將其植入到Servlet規(guī)范的service()業(yè)務(wù)處理的入口方法里,這些可以具體看Servlet規(guī)范對于HttpServletXXX等的說明。
有了Servlet規(guī)范實現(xiàn)的Web服務(wù)器,我們就可以將具體的Web應(yīng)用部署到該服務(wù)器上運行了。
為了讓W(xué)eb服務(wù)器知道它要管理和運行的應(yīng)用程序,我們必須通過一個指定格式的文件web.xml來告訴它,該文件被稱為應(yīng)用程序在web服務(wù)器上的部署描述文件。
我們只需要將編寫的應(yīng)用程序內(nèi)容按照該文件描述的格式去進行描述,Web服務(wù)器就能夠識別它們,并將我們編寫的內(nèi)容跟服務(wù)器本身無縫連接成一個完整的web應(yīng)用。
Web應(yīng)用部署規(guī)范實現(xiàn)
跟我們電器跟電源之間的連接都需要有符合標(biāo)準(zhǔn)的電源插槽和插頭一樣,我們編寫的應(yīng)用程序跟Web服務(wù)器應(yīng)用的連接也是標(biāo)準(zhǔn)的,在Spring MVC這個框架里,我們可以通過xml,annotation以及編程等方式來描述這些接口。
這里的注解(annotation)是高級語言編譯器的一個新功能,它能夠獨立的讀取和編譯這些注解的內(nèi)容,以便在具體編碼過程中一些非業(yè)務(wù)邏輯的內(nèi)容無法表現(xiàn)在程序的邏輯代碼中,而以標(biāo)注的形式提供。在Spring MVC 2.5以后的版本里,這被稱為注解編程方式。
我們可以使用這種方式將一些對組件的說明和定義分布到整個應(yīng)用程序的代碼中,而不需要集中的按照XML格式寫到一個列表里。
Spring MVC框架組件
關(guān)于Spring MVC框架,其實就是對于一個應(yīng)用程序的編寫來說,我們需要涉及到跟容器的交互,接收數(shù)據(jù),業(yè)務(wù)邏輯處理實現(xiàn),將數(shù)據(jù)以某種數(shù)據(jù)格式發(fā)送展現(xiàn)給請求者等。
根據(jù)工程學(xué)的知識,要想能夠便于管理,我們不能將這些功能性內(nèi)容實現(xiàn)和非功能性內(nèi)容實現(xiàn)混合在一起,同時為了便于管理有人就提出了一個實現(xiàn)模型,就是模型-視圖-控制器,有控制器C負責(zé)非功能性流程控制,而模型M來處理數(shù)據(jù)實現(xiàn),視圖V來提供處理結(jié)果的展現(xiàn),這就是著名的MVC模型。
它的使用無法就是為我們的應(yīng)用程序編寫在不同作用組件管理上做一下分類,將類似功能的組件內(nèi)容定義到同一分類里,便于管理,同時能夠很好的進行分類管理,不至于太混亂。
其實這些所有的MVC組件都是一樣的東西,只是功能不同而已。為了劃分這些分類我們需要為它們定義標(biāo)識符,也就是做個標(biāo)記。
最開始的思路是按照工程目錄的文件夾路徑來分類管理,后來引入了描述文件,比如xml或者YAML格式等,現(xiàn)在流行的是注解模式,跟所有的注解定義一樣只是定義了一個標(biāo)記。
所以我們可以為MVC三類組件分別定義不同的標(biāo)記,只為了便于管理。
說起Spring容器和Spring MVC模式的關(guān)系,簡單說MVC是對應(yīng)用程序組件的功能性分類標(biāo)識,在Spring容器看來他們都是多了個標(biāo)簽符合的容器管理組件而已。
一樣遵循相關(guān)的受Spring容器管理組件的規(guī)范。
Servlet規(guī)范在Spring MVC框架中的實現(xiàn)
從Web服務(wù)器級別來看Spring容器,其實就是一個特定的Servlet實現(xiàn)。
最初的時候,我們直接通過編寫一個個Servlet組件來為應(yīng)用程序提供數(shù)據(jù)處理服務(wù),現(xiàn)在我們將Spring容器定義成一個特定的Servlet,并且結(jié)合統(tǒng)一資源定位符和Servlet組件要處理的目標(biāo)資源路徑
一起來定位最終的請求處理組件。我們從Web應(yīng)用程序的部署描述文件Web.xml的Servlet描述可以看到,我們可以定義多個Servlet組件來處理不同的路徑上的請求。
這是Web服務(wù)器級別的Servlet組件,現(xiàn)在由于Spring容器和Spring MVC框架的引入,我們不再直接基于Web服務(wù)器來編寫一個個Servlet組件提供服務(wù)了,而是通過預(yù)定義一個服務(wù)器路徑,然后在該路徑下提供多個后續(xù)不同資源定位符的邏輯處理組件。
從而使得我們可以將特定目錄內(nèi)容交給一個復(fù)雜應(yīng)用程序來處理。這個復(fù)雜應(yīng)用就是基于Spring容器管理的多個組件實現(xiàn)。
DispatcherServlet組件
要做到這一點,我們首先要在Web應(yīng)用程序的部署描述中定義這個入口Servlet,而這個Servlet一般由Spring框架提供的特殊實現(xiàn),DispatcherServlet組件。
它的任務(wù)就是作為一個Servlet組件部署到Web服務(wù)器中,在服務(wù)器啟動時將它跟Web服務(wù)器連接起來,從而能夠成為為其映射的路徑請求提供處理。
如果按照傳統(tǒng)的Servlet組件處理具體應(yīng)用方式,這里只有一個Servlet組件實現(xiàn)顯然是無法提供多種請求處理服務(wù)的。所以,我們在這里引入了一種前端控制模式實現(xiàn)。
即在該DispatcherServlet的實現(xiàn)邏輯中增加了統(tǒng)一資源定位列表和對應(yīng)請求處理器Handler定義列表,對每個訪問該路徑的請求截取其所訪問的資源定位符進行比較和路由處理。
從而將該請求數(shù)據(jù)發(fā)送給綁定了該資源定位URL部分的處理器組件上,從而將請求路由給它處理。這就是一個路由器的實現(xiàn),當(dāng)然它還包括很多過濾和數(shù)據(jù)轉(zhuǎn)換處理,以及對于資源定位部分的匹配規(guī)則和算法實現(xiàn)等。
Spring容器管理組件
總體上使用Spring容器和Spring MVC來實現(xiàn)一個Web應(yīng)用程序來說,需要將我們應(yīng)用程序的所有組件都定義和聲明為遵循Spring容器組件管理規(guī)范的類定義,然后在Web服務(wù)器需要讀取的每個Web應(yīng)用程序的部署描述文件web.xml中提供的定義聲明,這個Servlet應(yīng)該是DispatcherServlet,并將其綁定在我們的應(yīng)用程序的根路徑上。
使用過Spring MVC框架的人都知道Spring還提供一個符合Servlet規(guī)范的ContextLoaderListener實現(xiàn),它用來在服務(wù)器啟動過程中加載資源內(nèi)容。
我們會將Spring容器的內(nèi)容通過這個監(jiān)聽器接口來導(dǎo)入到Web服務(wù)器中使之成為該Web應(yīng)用程序的可用資源。
而在DispatcherServlet被調(diào)用后,它會將Spring容器的配置信息讀入并初始化以提供各類實例依賴項。也就是說在Web服務(wù)一啟動這些資源內(nèi)容就會被放入到某個應(yīng)用程序上下文中,然后DispatcherServlet會用這些資源來初始化Spring容器定義組件實例,完成Spring MVC框架的實現(xiàn)。
當(dāng)然現(xiàn)代應(yīng)用程序開發(fā)的內(nèi)容相當(dāng)復(fù)雜,需要使用到很多外部系統(tǒng)資源或者第三方軟件資源,比如數(shù)據(jù)庫連接,Java的目錄和接口資源等。
我們過去傳統(tǒng)開發(fā)會將它根據(jù)Servlet規(guī)范實現(xiàn)成有狀態(tài),無狀態(tài),會話等組件,現(xiàn)在有了Spring容器,我們完全可以將它們按照Spring容器能夠管理組件的規(guī)范來封裝和定義。
從而讓這些資源能夠作為Spring 容器管理的組件使用,并受到Spring容器的全生命周期管理。
而Spring MVC整體會嵌入到一個Servlet實現(xiàn)中,從而在一個特定的目錄下對其所有請求進行分類處理。也就是我們前面所說的通過路由器的實現(xiàn),將不同的網(wǎng)絡(luò)請求根據(jù)資源定位符來映射到具體的處理組件控制器部分。
由它負責(zé)協(xié)調(diào)數(shù)據(jù)處理,結(jié)果展示模板解析,以及相關(guān)的數(shù)據(jù)持久化處理等。總之MVC框架之上一個功能意義上的分類,在技術(shù)上只是對眾多不同的應(yīng)用程序?qū)S媒M件進行標(biāo)簽化分類而已。
Web應(yīng)用開發(fā)與微服務(wù)
使得這些功能類似的組件受到統(tǒng)一的管理,我們開發(fā)人員在工程目錄組織和編譯器處理時方便,其實它們本質(zhì)上都是裝在容器化的依賴注入的組件。
隨著應(yīng)用程序架構(gòu)的不斷演變,現(xiàn)在由于云計算和分布式存儲技術(shù)的發(fā)展,微服務(wù)架構(gòu)成為了主流,它能很好的克服過去我們開發(fā)的傳統(tǒng)的巨型化應(yīng)用的很多弊端,比如可靠性,可維護性,容錯性等方面的缺陷。
就是將原來的應(yīng)用程序從功能進行分類封裝,同時在架構(gòu)上做垂直化分解,特別是虛擬機容器化技術(shù)的發(fā)展,為在同一臺主機上運行多個容器提供了可能,也就是說同樣的服務(wù)組件可以在同一臺機器上獨立運行多個而由于容器化的隔離相互不會產(chǎn)生干擾。
如此依賴過去傳統(tǒng)開發(fā)的應(yīng)用程序構(gòu)成組件是運行在同一個Web服務(wù)器上,各個功能之間的相互依賴和調(diào)用都是在同一個依賴管理容器中,比如同一個Spring 容器,所以它們是運行在同一個進程中的多個線程之間的調(diào)用和訪問。
而到了微服務(wù)時代,不同功能的組件可能會垂直化成一個獨立的應(yīng)用程序,功能單一的服務(wù)程序,它會以獨立進程的形式運行在主機上,如此以來我們在去組織這些獨立的進程構(gòu)建綜合型應(yīng)用服務(wù)時,其相互之間的依賴調(diào)用就成了跨進程之間的或者跨網(wǎng)絡(luò)之間的通信了。
這種通信需要依靠進程間調(diào)用IPC或者網(wǎng)絡(luò)對等機器之間的連接和訪問最常用的是基于HTTP的調(diào)用。
從傳統(tǒng)的Web應(yīng)用程序到現(xiàn)在流行的微服務(wù)架構(gòu)的變化其實就是一個從線程間調(diào)用到進程間或者跨網(wǎng)絡(luò)之間通信的實現(xiàn)轉(zhuǎn)變,這樣帶來的好處是我們的服務(wù)的彈性和可用性以及彈性大大增強。
而缺點在于開發(fā)的復(fù)雜程度極度的增大,因為它需要的技術(shù)支持更加細化和龐雜,比如網(wǎng)絡(luò)通信知識,容器化和管理編排知識,進程間調(diào)用的協(xié)議以及編解碼,跨網(wǎng)絡(luò)調(diào)用的穩(wěn)定性處理,安全以及數(shù)據(jù)分布式存儲等一些列的技術(shù)。
總結(jié)
雖然微服務(wù)涉及到的新技術(shù)很多,但是其底層的核心邏輯還是對于網(wǎng)絡(luò)數(shù)據(jù)流的處理,以及如何在對等點之間建立穩(wěn)定的連接,在服務(wù)器不穩(wěn)定時如何通過熔斷或者快速中斷機制來保證服務(wù)的穩(wěn)定提供等。
后面我將另找時間來逐步說一下微服務(wù)架構(gòu)底層實現(xiàn)的東西。
總結(jié)
以上是生活随笔為你收集整理的指定应用程序网络连接_总结Java开发Web应用程序应该理解的几个知识点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 朗科智能是做什么东西 智控和智能电源行业
- 下一篇: 董明珠回应高层元老辞职 任何人不能为企业