天天看點

夜光帶你走進Java架構師必備知識點(4)進階程式員

夜光序言:

所有的憂傷都是過往,當時間慢慢沉澱,你會發現,自己的快樂比想象的多得多。

夜光帶你走進Java架構師必備知識點(4)進階程式員

正文:

9.NIO通信步驟:

1.建立serverSoketChannel,配置為非阻塞模式

2.綁定監聽,配置TCP參數,錄入backlog

3.建立一個獨立的IO線程,用于輪回多路複用器selector

4.建立selector,将之前建立的serverSoketChannel注冊到selector上并設定監聽辨別為selectionKey.ACCEPT

5.啟動IO線程,在循環體中執行selector.select()方法,輪詢就緒的通道

6.當輪詢到了處于就緒的通道時,需要判斷操作位,如果是ACCEPT狀态,說明是新的用戶端接入,則調用accept方法接受新的用戶端

7.設定新接入用戶端的一些參數,如:非阻塞、并将其通道繼續注冊到selector中,設定監聽辨別等

8.如果輪詢的通道操作方位是READ則進行讀取,構造Buffer對象等

9.更細節的還有資料沒發送完成繼續發送的問題

10.AIO概念:

AIO程式設計,在NIO基礎之上引入了異步通道的概念,并提供了異步檔案和異步套接字通道的實作,進而咋真正意義上實作了異步非阻塞,NIO隻是非阻塞并非異步,而AIO不需要通過多路複用器對注冊的通道進行輪詢操作即可實作異步讀寫,進而簡化了NIO程式設計模型,也可以成為NIO2.0,這種模式才真正的屬于異步非阻塞的模型。

11.AIO類:

AsynchronousServerSoketChannel、AsynchronousSoketChannel

12.Netty:

netty是基于java NIO的網絡應用架構,使用netty可以快速開發網絡應用,比如:伺服器用戶端協定,netty是異步的。

13.Netty實作通信的步驟:

1.建立兩個NIO線程組,一個用于網絡事件處理(接收用戶端的連接配接),一個進行網絡通信讀寫

2.建立一個serverBootstrap對象,配置Netty一系列參數,比如:接收傳輸資料的緩存大小等

3.建立一個實際處理資料的ChannelInittializer,進行初始化的準備工作,比如:設定接收傳出資料的字元集、格式、已經實際處理資料的接口

4.綁定端口,執行同步阻塞方法等待伺服器端啟動即可

14.TCP粘包、拆包問題:

TCP是一個流協定,就是沒有界限的遺傳資料,它會根據TCP緩沖區的實際情況進行包的劃分。

15.TCP粘包、拆包解決方案:

1.DelimiterBasedFrameDecoder類(自定義分隔符)

2.FixedLengthFrameDecoter(定長度)

16.TCP粘包、拆包解決方案,根據業界主流協定:

1.消息定長,比如:每個封包的固定大小固定為200位元組,如果不夠,空位補空格。

2.在包尾部增加特殊字元進行分割,比如:回車

3.将消息分為消息頭和消息體,在消息頭中包含表示消息總長度的字段,然後進行業務邏輯的處理。

17.netty編解碼技術:

編解碼技術就是java序列化技術,序列化的目的是

1.進行網絡傳輸,

2.對象持久化,雖然可以使用java進行序列化,netty網絡傳輸,但是java序列化硬傷太多,比如:java序列化無法跨語言,序列化後碼流太大,序列化性能太低。

18.主流的編解碼架構:

Jboss的Marshalling包、Google的protobuf、基于protobuf的kyro、messagePack架構

19.Jboss Marshalling

Jboss Marshalling是java對象序列化包,對JDK預設的序列化架構進行了優化,但又保持跟java.io.Serializable接口的相容,同時增加了可調的參數,和附加特性。

20.netty的UDP協定:

UDP是使用者資料報協定,是OSI參照模型中一種無連接配接的傳輸層協定,提供面向事務簡單不可靠資訊傳送服務。

21.netty的webSoket:

webSoket将網絡套接字引入到用戶端和服務端,實作聊天功能需要古老的soket技術,或者是DWR架構,反向ajax技術,再有可能是comet服務推技術,H5的WebSoket很輕松的可以進行聊天功能實作,Netty和H5的webSoket結合簡單。

WebSoket的特點:

1.單一TCP連接配接,雙方可通信

2.對代理、防火牆、路由器透明

3.無頭部資訊、cookie和身份驗證

4.無安全開銷

5.通過ping/pong保持鍊路激活

6.伺服器可主動傳遞消息給用戶端不需要用戶端輪詢

22.資料通信:

需要了解下真正項目應用中如何去考慮netty的使用,對于一些參數設定都是根據伺服器性能決定的,需要考慮的問題是兩台機器(甚至多台)使用netty怎麼進行通信,大體可以分為三種:

1.使用長連接配接通道不斷開的形式進行通信,也就是伺服器和用戶端的通道一直處于開啟狀态,如果伺服器性能足夠好,并且用戶端的數量也比較少的情況下推薦使用這種方式。

2.一次性批量送出資料,采取短連接配接方式,也就是把資料儲存在本地臨時緩沖區或者臨時清單裡,當達到臨界值時進行一次性送出,或者根據定時任務輪詢送出,這種情況的弊端是做不到實時性傳輸,在對實時性不高的情況下可以使用。

3.可以使用一種特殊的長連接配接,在指定某一時間内,伺服器與某台用戶端沒有任何通信,則斷開連接配接,下次連接配接則是用戶端向伺服器發送請求的時候,再次建立連接配接,這種模式需要考慮兩個因素:1.如何在逾時(即伺服器和用戶端沒有任何通信)後關閉通道?關閉通道後如何再次建立連接配接?

用戶端當機時無需考慮,下次用戶端重新開機之後就可以與伺服器建立連接配接但是伺服器當機時,用戶端如何與服務端進行連接配接?

23.Http協定:

Http(超文本傳輸協定)是建立在TCP 傳輸協定之上的應用層協定,目前隻針對于WEB開發,HTTP協定應用廣泛,是以掌握HTTP協定的開發非常重要。

24.Http特點:

簡單:用戶端請求伺服器時隻需要指定URL和攜帶必要的參數即可

靈活:HTTP協定允許傳輸任意類型的資料對象,傳輸内容由Http消息頭中的content-type加以标記

無狀态:Http是無協定狀态的,無狀态指的是協定對事務處理沒有記憶能力,這就意味着如果後續需要處理之前的消息,則它必須重新擷取,也從側面展現Http的設計是為了使網絡傳輸更加輕量級、靈活、負載較輕。

25:Http協定組成:

請求頭、請求行、請求正文(實體内容)

26.Http請求方式:

1.GET:擷取Request-URL鎖辨別的資源

2.POST:在Request-URL所辨別的資源附加新的送出資料

3.HEAD:請求擷取由Request-URL所辨別的資源的響應消息頭

4.PUT:請求伺服器存儲一個資源,并用Request-URL作為辨別

5.DELETE:請求伺服器删除Request-URL鎖辨別的資源

6.TRACE:請求伺服器回送收到的請求資訊,主要是測試和診斷使用(@trace)

7.CONNECT:保留将來使用

8.OPTIONS:請求查詢伺服器的性能忙活着查詢相關資源的選項和需求

27.Http響應的消息:

響應消息是由三部分組成的:狀态行、消息頭、響應正文

28.響應狀态種類:

1xx:提示消息,表示請求已經接收繼續處理

2xx:成功,表示請求已經接收成功

3xx:重定向,要完成的請求必須進行更進一步的操作

4xx:用戶端錯誤,可能是請求文法錯誤或者請求無法實作

5xx:服務端錯誤,伺服器未能處理請求(可能内部出現異常)

29.常見相應的狀态碼:

200:OK :成功

400:BadRequest: 錯誤的請求文法,不能被伺服器了解

401:Unautthorized :請求未經授權

403:Forbidden: 伺服器收到請求但請求被伺服器拒絕

404:not found: 請求資源不存在

405:methodNotallowed: 請求方式不被允許,如隻支援GET請求,但用戶端使用了POST請求

500:inernalServerError 伺服器發送不可預期的錯誤

503:ServerUnavailble 伺服器目前不能處理用戶端請求,一段時間後可能恢複正常

30. Netty Http檔案伺服器開發:

Netty的Http協定無論從性能上還是可靠性上都表現優異,非常适合WEB容器的場景下引用,相比于傳統的Tomcat、Jetty等容器,更加的輕量和小巧,靈活性和制定性也更好

繼續閱讀