1. 程式人生 > >java web server

java web server

第一節 http協議
一、回顧
在這裡插入圖片描述

1、OSI體系結構分為7層:物理層、鏈路層、網路層、傳輸層、會話層、表示層、應用層。

2、TCP/IP的體系結構分為4層:網路介面層(物理層、鏈路層)、網際層(網路層IP)、傳輸層(UDP/TCP)、應用層(會話層、表示層、應用層)

3、原理體系結構:物理層、鏈路層、網路層、傳輸層、應用層(會話層+表示層+應用層)

OSI七層協議體系結構:優點:概念清楚,理論完整,缺點但是複雜而不實用

TCP/IP協議族四層,缺點:太簡單,但被廣泛使用,

結合上面兩個的優缺點,就有了5層協議的原理體系結構,即簡潔又能把概念描述清楚。

二、應用層

1、概念

位於計算機網路體系結構的最上層,前面四層做的所有事情就是為了他服務,他也是設計和建立計算機網路的最終目的,通俗的講,就是我們開發的應用軟體,就處於這一層,比如,QQ,瀏覽器訪問網頁,等等你看得到的應用軟體都是在這一層,但是這些軟體在執行的過程中,也需要依靠一些特定的協議才能完成相應的功能,比如瀏覽器通過網址訪問網頁,其中是如何做到的,這就是我們所要學習的東西。

2、應用層中的應用軟體分兩種。客戶/伺服器和P2P體系結構

客戶/伺服器(client/server)

這種型別,就是我們很熟悉的客戶端,伺服器模型,客戶端請求伺服器,伺服器響應客戶端這樣的一種方式進行“交流”

P2P

也稱為對等體系結構。P2P相當於每個人的電腦度可以當伺服器,也可以當客戶端,不單單限制於只能客戶端訪問伺服器,你自己的計算機可以去訪問別人的計算機上的內容,別的同樣可以訪問你計算機上的內容,這樣達到一種共享的狀態。

三、應用層協議的舉例。

1、DNS協議

Domain Name System 域名系統。也可以叫做域名解析協議。在我們在瀏覽器訪問網頁的時候,通常度是用我們所熟悉的一連串有意義的英文字元標識,比如www.baidu.com、www.sohu.com等。 但是我們學了前面的知識,計算機並不是通過這些字串去找到對應的計算機,而是通過32位的二進位制,也就是我們的IP地址來找。所以就有了DNS協議。他的作用就是將域名解析成對應的IP地址。因為讓我們人去記那些IP地址,很難記得住,所以就想辦法讓IP地址轉變為了現在的域名,在進行訪問的時候,只需要將域名解析為對應的IP地址就行了,這個域名也很有講究,其中分為好多層域名,是獨一無二的。這裡不細講這個,只要我們知道,域名通過DNS能找到對應的IP地址就行了

DNS協議是如何工作的呢?

1、通過域名訪問網頁

2、計算機會先將域名傳送到一個解析域名的伺服器上

2.1 在其伺服器上有很多伺服器,能解析各種各樣的域名,比如有專門解析.org的,解析.com的,解析.net的。等等,最主要的有一個根域名伺服器,

2.2 域名解析(在伺服器上查詢IP地址)的過程有兩種演算法,迭代查詢,遞迴查詢。一般是兩種查詢的結合

2.3 本機計算機找到其中一臺解析域名的伺服器(可能是.com),如果沒有找到對應的IP地址,那麼就會去找根域名伺服器,根域名伺服器知道所有的子伺服器,所以他肯定知道該域名所對應的IP地址在那個子伺服器中,所以告訴第一次查詢的伺服器要他去另一臺伺服器上找,找到了,就將其返回給計算機,以後在有另一臺計算機也通過這個域名訪問,那麼第一臺伺服器會有原來的域名IP地址的快取,就不用去找根伺服器了。

3、找到了,就能找到我們要訪問的伺服器了。
        在這裡插入圖片描述

2、http協議

統一資源定位符URL。

URL:統一資源定位符,通過下面格式,可以看出,就是用來定位我們所需要資源在伺服器上的位置。

格式:<協議>://<主機>:<埠>/<路徑>

協議:http

主機:域名/IP地址,原理度一樣,到頭來還是會轉換為IP地址,通過這個才能找到目標伺服器

埠: 在傳輸層需要使用的,訪問目的主機的哪個埠號。

路徑:精準的定位我們所需要的資源位置、

平常會省略協議和埠號,因為這些度是預設的,在訪問主頁時,路徑也會省略。比如www.baidu.com這個預設進入百度的主頁 完整寫法 http://www.baidu.com:80/index.htm

超文字傳送協議HTTP。

作用:怎樣向伺服器請求文件、伺服器怎麼把文件傳送給瀏覽器,通俗點講,就是我們想伺服器訪問網頁資源時,伺服器如何把網頁上的東西傳給我們。

客戶端向伺服器:請求報文    伺服器向客戶端:響應報文

什麼意思呢?在通過URL訪問你伺服器時,就會發送一個請求報文,告訴伺服器需要哪些東西,伺服器知道後,返回一個響應報文給客戶端,其中就會帶有一些網頁資訊。就是通過這個來達到傳送網頁資源的目的,現在來具體看看,請求報文和響應報文的格式。

格式度一樣,內容不一樣,格式都市

請求行            響應行

請求頭部           響應體

請求資料           響應資料

請求報文格式
在這裡插入圖片描述

響應報文格式
              
在這裡插入圖片描述

通過訪問www.solu.com來看看我們傳送的請求報文和響應報文是什麼樣的

請求報文:

在這裡插入圖片描述

1、GET /http://www.sohu.com HTTP/1.1 請求行,只不過這裡被分開了,請求的方式 URL 版本

2、Host:主機名 www.solu.com

3、User-Agent:使用什麼代理伺服器,這裡就是FireFox,也就是火狐

4、Accept:能接收的資料型別有哪些

5、Accept-Language:表示使用者希望優先想得到的版本,一次排列下去,先是中文,再是英文

6、Accept-Encoding:通知服務端可以傳送的資料壓縮格式

7、Cookie:瀏覽器端的一個技術,在伺服器上記錄使用者資訊,但是也會在瀏覽器中儲存一份。

8、Connection:連線的方式,有兩種,非持續連線和持續連線,非持續連線,一次請求/響應就對應一個TCP連線,接到了響應該連線就關閉,然後在傳送請求就在建立TCP連線,持續連線就相反,這裡使用的是持續連線

9、Upgrade-Insecure-Requests:該指令用於讓瀏覽器自動升級請求從http到https,用於大量包含http資源的http網頁直接升級到https而不會報錯.簡潔的來講,就相當於在http和https之間起的一個過渡作用,這個可以放一放,不懂沒關係。

以上2到9就是請求頭部,由於一般請求報文度不會有請求資料的,所以在9後面就沒有內容了,一般如果想要傳送資料過去度會通過在域名後面加?然後將資料創送過去

響應報文
在這裡插入圖片描述

這其中就來簡單看看響應行中的狀態碼把,響應體中內容太多,一下子講解不清楚

狀態碼由三位數字組成,可以分為5大類共33種

1xx:表示通知資訊的,比如請求收到了或正在進行處理

2xx:表示成功,也就是伺服器接收到了你的請求,併成功處理了,一般最喜歡看到的就是200了

200:這次請求成功了。

3xx:表示重定向,伺服器告訴瀏覽器要完成請求你必須採取進一步的行動,也就是去訪問另一個網頁,

4xx:表示客戶的差錯,比如請求中有錯誤的語法或不能完成

404錯誤:就是找不到資源,就是你的URL寫的有錯誤,使定位不到正確的資源

5xx:伺服器的差錯,如伺服器失效,或者內部出現異常不能完成你的請求

500錯誤:就是伺服器寫的程式碼中有問題。

還有很多中狀態碼,有興趣的可以百度查一查。

第二節 web server
Web Server中文名稱叫網頁伺服器或web伺服器。WEB伺服器也稱為WWW(WORLD WIDE WEB)伺服器,主要功能是提供網上資訊瀏覽服務。

Web伺服器可以解析(handles)HTTP協議。當Web伺服器接收到一個HTTP請求(request),會返回一個HTTP響應(response),例如送回一個HTML頁面。為了處理一個請求(request),Web伺服器可以響應(response)一個靜態頁面或圖片,進行頁面跳轉(redirect),或者把動態響應(dynamic response)的產生委託(delegate)給一些其它的程式例如CGI指令碼,JSP(JavaServer Pages)指令碼,servlets,ASP(Active Server Pages)指令碼,伺服器端(server-side)JavaScript,或者一些其它的伺服器端(server-side)技術。無論它們的目的如何,這些伺服器端(server-side)的程式通常產生一個HTML的響應(response)來讓瀏覽器可以瀏覽。

2.1 servlet
Servlet(Server Applet)是Java Servlet的簡稱,稱為小服務程式或服務聯結器,用Java編寫的伺服器端程式,主要功能在於互動式地瀏覽和修改資料,生成動態Web內容。
狹義的Servlet是指Java語言實現的一個介面,廣義的Servlet是指任何實現了這個Servlet介面的類,一般情況下,人們將Servlet理解為後者。Servlet運行於支援Java的應用伺服器中。從原理上講,Servlet可以響應任何型別的請求,但絕大多數情況下Servlet只用來擴充套件基於HTTP協議的Web伺服器。
 Servlet是sun公司提供的一門用於開發動態web資源的技術。
  Sun公司在其API中提供了一個servlet介面,使用者若想用發一個動態web資源(即開發一個Java程式向瀏覽器輸出資料),需要完成以下2個步驟:
  1、編寫一個Java類,實現servlet介面。
  2、把開發好的Java類部署到web伺服器中。
  按照一種約定俗成的稱呼習慣,通常我們也把實現了servlet介面的java程式,稱之為Servlet
Servlet 架構
下圖顯示了 Servlet 在 Web 應用程式中的位置。

Servlet 架構
在這裡插入圖片描述

Servlet 的主要功能在於互動式地瀏覽和修改資料,生成動態 Web 內容。這個過程為:
客戶端傳送請求至伺服器端;
伺服器將請求資訊傳送至 Servlet;
Servlet 生成響應內容並將其傳給伺服器。響應內容動態生成,通常取決於客戶端的請求;
伺服器將響應返回給客戶端。
servelet接收http請求,對請求轉換後呼叫具體的業務應用介面處理,這個業務介面不是由servelet實現,而是使用者自己實現,如restful架構中的REST介面(@GET、@POST等)。

2.2 Tomcat和Jetty
許多Web伺服器軟體都不能直接支援Servlet。為了支援Servlet,通常要單獨開發程式,這種程式一般稱為伺服器小程式容器(Servlet Container),有時也叫做伺服器小程式引擎(Servlet Engine)。它是Web伺服器或應用程式伺服器的一部分,它在Servlet的生命週期內包容和管理Servlet,是一個實時執行的外殼程式。執行時由Web伺服器軟體處理一般請求,並把Servlet呼叫傳遞給“容器”來處理。
Tomcat 是Web應用伺服器,是一個Servlet/JSP容器. Tomcat 作為Servlet容器,負責處理客戶請求,把請求傳送給Servlet,並將Servlet的響應傳送回給客戶.
Jetty是類似於Tomcat的webserver/servlet容器,與Tomcat的重要區別如下:
相對Tomcat而言,Jetty更輕量;
jetty更靈活,體現在其可插拔性和可擴充套件性,更易於開發者對Jetty本身進行二次開發,定製一個適合自身需求的Web Server。相比之下,重量級的Tomcat原本便支援過多特性,要對其瘦身的成本遠大於豐富Jetty的成本;
當支援大規模企業級應用時,Jetty也許便需要擴充套件,在這場景下Tomcat便是更優的。

Tomcat和Jetty只是一個平臺,web服務的,是為servlet和jsp的執行提供一個執行環境,也幫助實現了servlet。

第三節 微服務架構
將一個服務拆分為多個子模組,一個模組對應一個微服務,即一個web server伺服器。
目前構建微服務的技術比較多,如Dropwizard、spring boot2等
Dropwizard:
一個簡潔的RESTful Web框架,所有服務通過REST介面方式提供,Dropwizard跨越了開發庫與框架的界限,旨在為Web應用所需的功能提供高效能、可靠的實現。Dropwizard將這些功能抽象為可重用的開發庫,因此應用程式可以保持精簡與專注,從而大大減少產品面世的時間以及維護負擔。它集成了:
Jetty HTTP庫;
REST庫;–Jersey RESTful 框架是開源的RESTful框架, 實現了JAX-RS (JSR 311 & JSR 339) 規範。它擴充套件了JAX-RS 參考實現, 提供了更多的特性和工具, 可以進一步地簡化 RESTful service 和 client 開發。如:提供註解 @GET、 @POST、 @PUT 、@Path、 @QueryParam等
Jackson JSON庫;–Java Json解析器。Jackson可以輕鬆的將Java物件轉換成json物件和xml文件,同樣也可以將json、xml轉換成Java物件。
Metrics度量庫;
Guava;
Logback 和 slf4j ;–日誌管理工具
Hibernate Validator;
Apache HttpClient 和 Jersey ;
JDBI;–為Java關係資料庫提供了最直接的方式互動。
Liquibase;
Freemarker 和 Mustache;
Joda Time。–完整強大的時間日期處理開發庫。
dropwizard構造的一個web server對應一個微服務,各個微服務對外以一個服務的方式提示(即對外只暴露一個地址,基於閘道器實現)

spring相關不在做詳細介紹