0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

簡(jiǎn)述后端應(yīng)用程序的工作原理

jf_78858299 ? 來源:IT大咖說 ? 作者:IT大咖說 ? 2023-05-05 16:45 ? 次閱讀

后端應(yīng)用程序的工作原理

成功運(yùn)行一個(gè)簡(jiǎn)單的后端應(yīng)用程序后,接下來介紹后端應(yīng)用程序的工作原理。

一個(gè)Java后端應(yīng)用程序要想運(yùn)行起來需要兩步,第一步是搭建Web應(yīng)用服務(wù)器,為后端應(yīng)用程序提供運(yùn)行環(huán)境,第二步是把后端應(yīng)用程序放到Web應(yīng)用服務(wù)器上。

相應(yīng)地,后端應(yīng)用軟件的工作原理我們也分為兩部分來介紹。一部分是Web應(yīng)用服務(wù)器運(yùn)行后端應(yīng)用程序,介紹Web應(yīng)用服務(wù)器與后端應(yīng)用程序的關(guān)系;另一部分是后端應(yīng)用程序處理接口請(qǐng)求,介紹后端應(yīng)用程序與接口請(qǐng)求端(如網(wǎng)頁(yè)、App等)的關(guān)系。在介紹這兩部分內(nèi)容之前,我們先介紹一下Java程序的運(yùn)行原理。

注意:本小節(jié)默認(rèn)以Tomcat作為Web應(yīng)用服務(wù)器軟件,以Java作為編程語(yǔ)言,以Spring Boot作為基礎(chǔ)框架。在介紹原理時(shí)會(huì)省略很多內(nèi)部細(xì)節(jié),我們只需要大體了解即可。

◆1.Java程序運(yùn)行原理

編譯型語(yǔ)言通過專門的編譯器,一次性地將源代碼編譯成可執(zhí)行文件(機(jī)器碼),可執(zhí)行文件可直接運(yùn)行在特定的平臺(tái)上。由于可執(zhí)行文件(機(jī)器碼)是根據(jù)特定平臺(tái)編譯而成的,所以運(yùn)行效率較高,但是不能跨平臺(tái)使用。比較流行的編譯型語(yǔ)言有C和C++等。

解析型語(yǔ)言不需要編譯,但是在每次運(yùn)行的時(shí)候都需要解析器把源碼翻譯成機(jī)器碼,即每個(gè)運(yùn)行程序的機(jī)器都需要安裝一個(gè)解析器,解析器會(huì)根據(jù)自身平臺(tái)把源碼翻譯成對(duì)應(yīng)的機(jī)器碼。解析型語(yǔ)言具有跨平臺(tái)性,但是運(yùn)行效率不高(每次運(yùn)行都需要翻譯成機(jī)器碼)。比較流行的解析型語(yǔ)言有Python、Ruby和JavaScript等。

編譯型語(yǔ)言和解析型語(yǔ)言的對(duì)比如圖4.29所示。

圖4.29 編譯型語(yǔ)言與解析型語(yǔ)言

而Java比較特別一些,Java既是編譯型語(yǔ)言,又是解析型語(yǔ)言,因?yàn)镴ava既需要編譯器又需要解析器。Java具備跨平臺(tái)特性的同時(shí),也比傳統(tǒng)的解析型語(yǔ)言運(yùn)行效率要高。Java編寫的源碼經(jīng)過編譯器編譯之后,轉(zhuǎn)換成.class文件(字節(jié)碼,一種Java獨(dú)有的源碼與機(jī)器碼之間的格式)。這些.class文件中的字節(jié)碼在運(yùn)行時(shí)需要解析器把字節(jié)碼翻譯成機(jī)器碼才能運(yùn)行。Java的編譯運(yùn)行過程如圖4.30所示。

注意:一般情況下,Java源碼編譯輸出的是.jar文件,而.class文件是.jar文件的主要部分。這里為了講解方便,省去了對(duì).jar文件的描述。

圖4.30 Java編譯運(yùn)行過程

Java的編譯器和解析器就是在4.1.2小節(jié)搭建Web應(yīng)用服務(wù)器中提到的JDK,想要編譯或者運(yùn)行Java程序都需要安裝JDK。JDK的內(nèi)部結(jié)構(gòu)如圖4.31所示,它包含一些開發(fā)工具和JRE(Java Runtime Environment,運(yùn)行環(huán)境),其中開發(fā)工具里有編譯器,而JRE是運(yùn)行Java程序的環(huán)境。JRE包含JVM(JavaVirtual Machine,Java虛擬機(jī))和一些基礎(chǔ)類庫(kù),其中JVM包含解析器,負(fù)責(zé)翻譯字節(jié)碼等工作,而基礎(chǔ)庫(kù)類是Java調(diào)用操作系統(tǒng)功能的橋梁。

注意:如果只需要運(yùn)行Java程序,那么可以單獨(dú)安裝JRE。JDK 9版本發(fā)布以后,不再提供單獨(dú)的JRE安裝包。由于引入了新技術(shù),JDK 9及后續(xù)版本的內(nèi)部也沒有了JRE(可以手動(dòng)生成),而JVM是仍然存在的。這是因?yàn)镴RE在運(yùn)行Java程序時(shí)會(huì)加載所有的基礎(chǔ)類庫(kù),這樣比較損耗資源,而JDK 9及后續(xù)版本在運(yùn)行程序時(shí)是按需要加載基礎(chǔ)類庫(kù)的。

圖4.31 JDK內(nèi)部結(jié)構(gòu)

2.Web應(yīng)用服務(wù)器運(yùn)行后端應(yīng)用程序

本小節(jié)以Tomcat作為Web應(yīng)用服務(wù)器軟件進(jìn)行說明。Tomcat本身是一個(gè)Java程序,啟動(dòng)Tomcat服務(wù)相當(dāng)于啟動(dòng)一個(gè)Java程序。那么,Tomcat是怎么運(yùn)行后端應(yīng)用程序的?一個(gè)Java程序怎么運(yùn)行另外一個(gè)Java程序呢?

首先,在Tomcat中運(yùn)行的后端應(yīng)用程序是.war文件而不是.jar文件。.war文件與.jar文件不同,.war文件是Web模塊,其內(nèi)部除了編譯好的.class文件、依賴包和配置文件以外,還可以包含網(wǎng)頁(yè)資源(HTML、CSS文件等)和JSP動(dòng)態(tài)網(wǎng)頁(yè)等。.war文件一般需要依賴Tomcat等Web應(yīng)用服務(wù)器軟件才能運(yùn)行。

以4.1.3小節(jié)構(gòu)造一個(gè)簡(jiǎn)單的后端應(yīng)用程序中的demo.war為例,Tomcat運(yùn)行demo.war其實(shí)不是一個(gè)Java程序運(yùn)行另外一個(gè)Java程序的關(guān)系,而是一個(gè)Java程序使用編譯好的.class文件的關(guān)系。更具體地說,當(dāng)demo.war放到Tomcat的webapps文件夾中后,Tomcat會(huì)自動(dòng)把demo.war解壓成demo目錄。解壓完成后,Tomcat會(huì)對(duì)demo進(jìn)行解析并加載相關(guān)的.class文件。當(dāng)接收到請(qǐng)求時(shí),Tomcat會(huì)調(diào)用對(duì)應(yīng)的接口函數(shù)(TestController.java文件中的方法,見代碼4.11),經(jīng)由這些代碼處理后再將結(jié)果返回。Tomcat運(yùn)行后端應(yīng)用程序的工作原理如圖4.32所示。

說明:Tomcat加載并引用.class文件利用了Java的反射機(jī)制。一般情況下,Java程序引用類文件只能在編寫代碼時(shí)通過import引用其他類文件,而Java反射機(jī)制是允許在運(yùn)行狀態(tài)中通過給定類的名字加載指定類文件的。

Tomcat是通過圖4.21中ServletInitializer這個(gè)固定類名加載相關(guān)文件的。

圖4.32 Tomcat運(yùn)行后端應(yīng)用程序的工作原理

最后值得一提的是,Tomcat運(yùn)行后端應(yīng)用程序的工作原理其實(shí)是非常復(fù)雜的,特別是對(duì)相關(guān)文件加載的機(jī)制,本小節(jié)只對(duì)其做了最簡(jiǎn)單的陳述,有興趣的讀者可以通過官方文檔和開源代碼進(jìn)行更深入的研究。

◆3.后端應(yīng)用程序處理接口請(qǐng)求

發(fā)送一個(gè)請(qǐng)求至少需要明確4個(gè)部分:請(qǐng)求的URL、請(qǐng)求方式、請(qǐng)求數(shù)據(jù)的格式和請(qǐng)求數(shù)據(jù)。以4.1.3小節(jié)構(gòu)造一個(gè)簡(jiǎn)單的后端應(yīng)用程序中的接口一為例,以Postman為測(cè)試工具,發(fā)送請(qǐng)求的設(shè)置如圖4.33所示。

圖4.33 接口一請(qǐng)求的設(shè)置

注意:當(dāng)請(qǐng)求方式為GET時(shí),則請(qǐng)求數(shù)據(jù)一般只能寫在URL里,如4.1.3小節(jié)構(gòu)造一個(gè)簡(jiǎn)單的后端應(yīng)用程序中的接口二。

由圖4.33中請(qǐng)求的URL可知,請(qǐng)求是基于HTTP發(fā)送的。HTTP的通信過程如圖4.34所示,其中,不是每次請(qǐng)求都會(huì)做一次連接的建立與斷開,存在多次請(qǐng)求會(huì)共用一個(gè)連接通道的情況,這與HTTP版本和相關(guān)設(shè)置有關(guān)。

注意:接口請(qǐng)求一般是使用HTTP或HTTPS。HTTP是TCP/IP的應(yīng)用層協(xié)議,也就是說,HTTP其實(shí)只是在TCP/IP之上做了規(guī)則限定和封裝,其底層技術(shù)還是TCP/IP的相關(guān)技術(shù)。而HTTPS只是在HTTP的基礎(chǔ)上做了通信加密,暫且不對(duì)其進(jìn)行介紹。

圖4.34 HTTP通信過程

在圖4.33所示的請(qǐng)求例子中,客戶端會(huì)以URL的IP地址和端口(127.0.0.1:8080)與Web應(yīng)用服務(wù)器建立連接。建立連接之后,客戶端會(huì)把剩下的信息(URL剩下的部分、請(qǐng)求方式、請(qǐng)求數(shù)據(jù)的格式、請(qǐng)求數(shù)據(jù))按照規(guī)則放到報(bào)文里,再把報(bào)文發(fā)送到Web應(yīng)用服務(wù)器上。發(fā)送的報(bào)文如代碼4.14所示。其中,報(bào)文由三部分組成,分別是請(qǐng)求行、報(bào)文頭信息和報(bào)文體。

·請(qǐng)求行:是報(bào)文的第一行,其由三部分組成,分別是請(qǐng)求方法、請(qǐng)求URL剩余的部分(除協(xié)議、IP地址、端口外)和HTTP版本。

·報(bào)文頭信息:其范圍是報(bào)文的第二行到空行。報(bào)文頭可以設(shè)置多個(gè)屬性,其作用是記錄相關(guān)的請(qǐng)求信息。其中,Conten-Type屬性對(duì)應(yīng)的是請(qǐng)求數(shù)據(jù)的格式。

·報(bào)文體:其范圍是空行到最后,對(duì)應(yīng)的是請(qǐng)求數(shù)據(jù)。需要注意的是,當(dāng)請(qǐng)求方式為GET時(shí),一般不使用報(bào)文體。因此4.1.3小節(jié)中的接口二的請(qǐng)求參數(shù)只能寫在URL中。

代碼4.14接口一的請(qǐng)求報(bào)文

POST /demo/test/test HTTP/1.1

Host: 127.0.0.1:8080

Content-Type: text/plain

{

"language":"chinese",

"text":"你好,世界"

}

當(dāng)Web應(yīng)用服務(wù)器接收到請(qǐng)求的報(bào)文后,會(huì)對(duì)報(bào)文進(jìn)行解析并轉(zhuǎn)換成對(duì)應(yīng)的Java對(duì)象。Web應(yīng)用服務(wù)器會(huì)根據(jù)報(bào)文的請(qǐng)求行(POST/demo/test/test)找到對(duì)應(yīng)的后端應(yīng)用程序并調(diào)用相應(yīng)的處理函數(shù)。

其中,請(qǐng)求行(POST/demo/test/test)會(huì)被分成兩段(/demo和POST/test/test)處理,Web應(yīng)用服務(wù)器會(huì)根據(jù)第一段(/demo)內(nèi)容找到對(duì)應(yīng)的后端應(yīng)用程序,demo對(duì)應(yīng)的是demo.war文件名。Web應(yīng)用服務(wù)器會(huì)根據(jù)第二段(POST/test/test)內(nèi)容調(diào)用后端應(yīng)用程序?qū)?yīng)的處理函數(shù),后端應(yīng)用程序?qū)?yīng)的標(biāo)記如代碼4.15所示,其中,@RequestMapping("/test")標(biāo)記了Controller的路徑,@RequestMapping(value="/test",method=RequestMethod.POST)標(biāo)記了對(duì)應(yīng)方法的路徑和請(qǐng)求方式,函數(shù)create()的參數(shù)String requestParam會(huì)被自動(dòng)注入請(qǐng)求的數(shù)據(jù)(報(bào)文體)中。

說明:Java中以@開頭的是Java注解,也稱為Java標(biāo)注,其相當(dāng)于一個(gè)標(biāo)簽。@Request-Mapping、@Controller是Java Servlet標(biāo)準(zhǔn)中定義的注解。

代碼4.15接口一的代碼

@Controller

@RequestMapping("/test")

@RequestMapping(value="/test",method = RequestMethod.POST)

public JSONObject create(@RequestBody String requestParam) {

}

當(dāng)代碼4.15的處理函數(shù)被執(zhí)行完畢之后,會(huì)把結(jié)果返回給Web應(yīng)用服務(wù)器,Web應(yīng)用服務(wù)器會(huì)把返回的Java對(duì)象轉(zhuǎn)換成HTTP報(bào)文,再把報(bào)文發(fā)送給客戶端。返回的報(bào)文如代碼4.16所示。其中,報(bào)文由三部分組成,分別是狀態(tài)行、報(bào)文頭信息和報(bào)文體。

圖4.35 接口一返回的結(jié)果

·狀態(tài)行:是報(bào)文的第一行,其由三部分組成,分別是HTTP版本、狀態(tài)碼和狀態(tài)碼描述。狀態(tài)碼及其信息一般是由Web應(yīng)用服務(wù)器自動(dòng)填充的,如狀態(tài)碼為200,即為成功,狀態(tài)碼為404,即為無法尋找對(duì)應(yīng)資源等。當(dāng)然,后端應(yīng)用程序也可以對(duì)其進(jìn)行修改。

·報(bào)文頭信息:其范圍是報(bào)文的第二行到空行。報(bào)文頭可以設(shè)置多個(gè)屬性,作用是記錄相關(guān)的請(qǐng)求信息。其中,Conten-Type屬性對(duì)應(yīng)的是請(qǐng)求數(shù)據(jù)的格式。后端應(yīng)用程序也可以添加一些自定義的屬性。

·報(bào)文體:其范圍是空行到最后,對(duì)應(yīng)的是后端應(yīng)用程序的處理函數(shù)返回的結(jié)果。

代碼4.16接口一返回的報(bào)文

HTTP/1.1 200 OK

Date: Tue, 31 Mar 2020 10:59:51 GMT

Content-Type: application/json

{"message":"你好,世界"}

以上介紹了后端應(yīng)用程序的工作原理,當(dāng)然這只是一些表面的認(rèn)識(shí),還有很多內(nèi)容沒有鋪開陳述。這是因?yàn)樵趯?shí)際項(xiàng)目開發(fā)過程中,無論是HTTP請(qǐng)求還是Web應(yīng)用服務(wù)器軟件,都是現(xiàn)成的工具,我們多是去使用它們而不是去改造它們,因此對(duì)原理的了解不需要完全透徹,具體的細(xì)節(jié)可以等問題出現(xiàn)時(shí)再去了解。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Web
    Web
    +關(guān)注

    關(guān)注

    2

    文章

    1266

    瀏覽量

    69570
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    9255

    瀏覽量

    85754
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2973

    瀏覽量

    104908
  • 后端
    +關(guān)注

    關(guān)注

    0

    文章

    31

    瀏覽量

    2283
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    BootLoader程序工作原理是什么?怎么使用這個(gè)程序?

    BootLoader程序工作原理是什么?怎么使用這個(gè)程序?
    發(fā)表于 11-09 06:16

    什么是晶閘管?簡(jiǎn)述晶閘管的工作原理

    保持導(dǎo)通,即晶閘管導(dǎo)通后,門極失去作用。門極只起觸發(fā)作用?! ?. 晶閘管在導(dǎo)通情況下,當(dāng)主回路電壓(或電流)減小到接近于零時(shí),晶閘管關(guān)斷。晶閘管的工作原理:  晶閘管在工作過程中,它的陽(yáng)極(A)和陰極
    發(fā)表于 02-22 15:40

    磁盤碎片整理的工作原理是什么?

    磁盤碎片整理的工作原理是什么? “磁盤碎片整理”這個(gè)術(shù)語(yǔ)通常用于指代Microsoft Windows中稱為磁盤碎片整理程序應(yīng)用程序。它的設(shè)計(jì)目的是解決一個(gè)由于硬盤存儲(chǔ)
    發(fā)表于 07-30 08:17 ?4203次閱讀

    蓄電池工作原理簡(jiǎn)述

    蓄電池工作原理簡(jiǎn)述   鉛酸蓄電池充、放電化學(xué)反應(yīng)的原理方程式如下: 1.放電:蓄電池對(duì)
    發(fā)表于 11-16 14:17 ?1.8w次閱讀

    Windows XP SP2防火墻的工作原理

    Windows XP SP2防火墻的工作原理 ★Windows XP SP2防火墻的工作原理  對(duì)于只使用瀏覽、電子郵件等系統(tǒng)自帶的網(wǎng)絡(luò)應(yīng)用程序,Windows防火墻根本
    發(fā)表于 01-11 11:41 ?1601次閱讀

    電腦芯片的工作原理簡(jiǎn)述

    本文為您講述電腦芯片的工作原理,包括電腦芯片的基本構(gòu)成與工作邏輯,基礎(chǔ)參數(shù)。希望能提供大家參考:
    發(fā)表于 08-09 16:39 ?2.7w次閱讀

    基于區(qū)塊鏈的應(yīng)用程序“DApp”介紹

    DApps是分散式應(yīng)用程序的縮寫。這些應(yīng)用程序實(shí)際上不應(yīng)該對(duì)最終用戶進(jìn)行區(qū)分。關(guān)于DApps的重要之處在于后端是如何處理數(shù)據(jù)的。
    發(fā)表于 09-05 14:37 ?3521次閱讀

    USB接口工作原理_USB接口優(yōu)點(diǎn)

    簡(jiǎn)述USB接口工作原理”由電蜂優(yōu)選為您整理,采購(gòu)連接器,上電蜂優(yōu)選。
    發(fā)表于 06-10 10:52 ?8798次閱讀

    存儲(chǔ)程序工作原理是什么

    要想搞清楚存儲(chǔ)程序工作原理,最好先知道它是存儲(chǔ)在了什么地方,或者說,應(yīng)當(dāng)先搞清楚存儲(chǔ)工作的物質(zhì)基礎(chǔ)是什么。
    發(fā)表于 06-13 15:23 ?7357次閱讀

    應(yīng)用程序屏蔽和應(yīng)用程序內(nèi)保護(hù)哪個(gè)更安全?

    眾所周知,攻擊者往往會(huì)使用用戶移動(dòng)設(shè)備上運(yùn)行的應(yīng)用程序來攻擊后端的系統(tǒng),比如攻擊者利用移動(dòng)操作系統(tǒng)和你的應(yīng)用程序中的漏洞來監(jiān)視你,獲取私人數(shù)據(jù)甚至竊取資金。為了應(yīng)對(duì)這種情況,許多移動(dòng)應(yīng)用程序
    的頭像 發(fā)表于 08-26 16:02 ?4396次閱讀

    不同應(yīng)用程序的存儲(chǔ)IO類型解析

    存儲(chǔ)系統(tǒng)作為數(shù)據(jù)的載體,為前端的服務(wù)器和應(yīng)用程序提供讀寫服務(wù)。存儲(chǔ)陣列某種意義上來說,是對(duì)應(yīng)用服務(wù)器提供數(shù)據(jù)服務(wù)的后端服務(wù)器。應(yīng)用服務(wù)器對(duì)存儲(chǔ)系統(tǒng)發(fā)送數(shù)據(jù)的讀和寫的請(qǐng)求。然而,不同的應(yīng)用程序對(duì)存儲(chǔ)
    的頭像 發(fā)表于 11-30 15:21 ?2275次閱讀
    不同<b class='flag-5'>應(yīng)用程序</b>的存儲(chǔ)IO類型解析

    MMU的工作原理梳理

    本文從內(nèi)存管理的發(fā)展歷程角度層層遞進(jìn),介紹 MMU 的誕生背景,工作機(jī)制。而忽略了具體處理器的具體實(shí)現(xiàn)細(xì)節(jié),將 MMU 的工作原理從概念上比較清晰的梳理了一遍。 MMU 誕生之前:在傳統(tǒng)的批處理
    的頭像 發(fā)表于 12-17 16:13 ?1.3w次閱讀
    MMU的<b class='flag-5'>工作原理</b>梳理

    前端與后端編程有什么區(qū)別

    什么是web開發(fā)?Web開發(fā)是創(chuàng)建網(wǎng)站或Web應(yīng)用程序的過程。我們可以將其分為兩個(gè)主要層:前端開發(fā)和后端開發(fā)。 每個(gè)網(wǎng)站都有后端和前端。
    的頭像 發(fā)表于 05-05 18:19 ?1580次閱讀

    springboot前后端交互流程

    Spring Boot 是一個(gè)用于構(gòu)建 Java 企業(yè)級(jí)應(yīng)用程序的開源框架,它提供了一種簡(jiǎn)化的開發(fā)方式,使得開發(fā)人員可以更加便捷地創(chuàng)建獨(dú)立的、可執(zhí)行的 Spring 應(yīng)用程序。在使用 Spring
    的頭像 發(fā)表于 11-22 16:00 ?2196次閱讀

    氣壓制動(dòng)系統(tǒng)工作原理簡(jiǎn)述

    氣壓制動(dòng)系統(tǒng)的工作原理可以簡(jiǎn)述如下: 一、系統(tǒng)概述 氣壓制動(dòng)系統(tǒng)是一種通過壓縮空氣來實(shí)現(xiàn)制動(dòng)的技術(shù),廣泛應(yīng)用于汽車行業(yè)中,特別是大型商用車和重型車輛。該系統(tǒng)利用發(fā)動(dòng)機(jī)驅(qū)動(dòng)的空氣壓縮機(jī)產(chǎn)生壓縮空氣,并
    的頭像 發(fā)表于 09-18 15:44 ?838次閱讀