<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          分布式系統(tǒng)通信概要

          共 2875字,需瀏覽 6分鐘

           ·

          2020-08-15 16:51

          分布式系統(tǒng)

          分布式系統(tǒng)主要可以分成 分布式通信,分布式調(diào)度,分布式治理 這三個板塊,今天主要是帶大家系統(tǒng)的了解分布式通信這塊知識。

          分布式其實很好理解:一個人做的事情讓多個人來做,每個人負(fù)責(zé)的功能都不一樣。既然一件事情分給了兩個人來完成,那這兩個人就少了溝通(分布式通信),少不了協(xié)作(分布式調(diào)度),最后還需要一個機(jī)制把這些東西管理起來(分布式治理),這樣基本就把分布式的概念理解清楚了。

          分布式的初衷

          為什么會有分布式系統(tǒng)的出現(xiàn)?其目的是為了解決單體系統(tǒng)解決不了的問題。分布式系統(tǒng)的最小單元也是一個個的單體服務(wù),通過分工和協(xié)作把所有的微服務(wù)運轉(zhuǎn)起來以達(dá)到更強(qiáng)大的計算能力。

          分布式通信

          分布式基礎(chǔ)總體來說可以分為數(shù)據(jù)通信和數(shù)據(jù)傳輸

          數(shù)據(jù)通信

          分布式架構(gòu)中,有一個環(huán)節(jié)很重要,那就是分布式系統(tǒng)中的計算機(jī)節(jié)點彼此之間的通信,關(guān)于通信,大家或多或少都知道一些東西,但是可能都很零散,今天我就帶大家一起梳理這塊的知識點
          說到分布式通信,我還是習(xí)慣從http請求說起,通過http請求把通信的知識串起來

          1:DNS解析(Domain Name System)

          簡單點理解就是把輸入在瀏覽器上面的域名解析成IP,因為域名比IP好記,所以會有從域名解析出IP的DNS服務(wù)

          2:CDN(Content Delivery NetWork)

          CDN其實是一種網(wǎng)絡(luò)緩存技術(shù),能夠把一些相對穩(wěn)定的資源放在距離最終用戶較近的地方,一方面可以減輕廣域網(wǎng)的壓力,另一方面可以提升用戶的速度。我們一般會把一些靜態(tài)文件(圖片,腳本,靜態(tài)文件)放到CDN中。

          3:HTTP通信協(xié)議(通信的橋梁)

          域名被成功解析后,客戶端和服務(wù)端是怎樣建立通信的呢,相信你肯定聽過tcp/udp這兩種通信協(xié)議,以及建立的握手過程。而http協(xié)議是建立在tcp/ip協(xié)議之上的一個應(yīng)用層協(xié)議,應(yīng)用層協(xié)議還有(FTP,DNS,SMTP,Telnet)。OSI的七層模型,tcp/ip的四層模型,以及三次握手協(xié)議,四次揮手協(xié)議等等這里就不具體的展開討論。

          4:Socket(連接的橋梁)

          tcp通道建立之后就可以基于這個通道發(fā)消息了,TCP/UDP都是基于Socket概念上擴(kuò)展的傳輸協(xié)議,簡單的說就是我們的數(shù)據(jù)都是通過TCP/UDP傳輸?shù)?。那么這跟Socket有什么關(guān)系呢?Socket是一種抽象層,應(yīng)用程序通過它來發(fā)送和接收數(shù)據(jù),就像應(yīng)用程序打開一個文件句柄,把數(shù)據(jù)讀寫到磁盤上一樣。Socket對于大多數(shù)人說都接觸的很少,用大白話理解下:使用Socket可以把應(yīng)用程序添加到網(wǎng)絡(luò)中,并與處于同一個網(wǎng)絡(luò)中的其他應(yīng)用程序進(jìn)行通信,Socket把兩個不同服務(wù)器上的應(yīng)用連接起來了。當(dāng)然,今天講的Socket只是一個概念,還有Socket的客戶端,服務(wù)端,IO阻塞和非阻塞,多路復(fù)用技術(shù)等等相關(guān)的技術(shù)點以后會在具體的章節(jié)展開。

          數(shù)據(jù)傳輸

          Java里面對象如何傳輸?答案是通過序列化,在實體后面實現(xiàn)SeriSerializable接口這個對象就被序列化了,意味著這個對象就能在網(wǎng)絡(luò)中傳輸了。Java平臺允許我們在內(nèi)存中創(chuàng)建可復(fù)用的Java對象,但一般情況下,只有當(dāng)JVM處于運行時,這些對象才可能存在,就是說這些對象的生命周期不會比JVM的生命周期更長。但在現(xiàn)實應(yīng)用中,就可能要求在 JVM 停止運行之后能夠保存(持久化)指定的對象,并在將來重新讀取被保存的對象。Java 對象序列化就能夠幫助我們實現(xiàn)該功能。

          1:序列化

          序列化是把對象的狀態(tài)信息轉(zhuǎn)化為可存儲或傳輸?shù)男问竭^程,也就是把對象轉(zhuǎn)化為字節(jié)序列的過程稱為對象的序列化

          2:反序列化

          反序列化是序列化的逆向過程,把字節(jié)數(shù)組反序列化為對象,把字節(jié)序列恢復(fù)為對象的過程成為對象的反序列化

          3:序列化進(jìn)階知識

          一. ?serialVersionUID 的作用 :字面意思上是序列化的版本號,凡是實現(xiàn) Serializable 接口的類都有一個表示序列化版本標(biāo)識符的靜態(tài)變量

          演示步驟
          1. 先將 user 對象序列化到文件中
          2. 然后修改 user 對象,然后修改 user 對象,增加 serialVersionUID 字段
          3. 然后通過反序列化來把對象提取出來
          4. 演示預(yù)期結(jié)果:提示無法反序列化
          結(jié)論

          Java 的序列化機(jī)制是通過判斷類的 serialVersionUID 來驗證版本一致性的。在進(jìn)行反序列化時,JVM 會把傳來的字節(jié)流中的 serialVersionUID 與本地相應(yīng)實體類的 serialVersionUID 進(jìn)行比較,如果相同就認(rèn)為是一致的,可以進(jìn)行反序列化,否則就會出現(xiàn)序列化版本不一致的 異常,即是 InvalidCastException。

          二. ?Transient 關(guān)鍵字
          Transient 關(guān)鍵字的作用是控制變量的序列化,在變量聲明前加上該關(guān)鍵字,可以阻止該變 量被序列化到文件中,在被反序列化后,transient 變量的值被設(shè)為初始值,如 int 型的是 0,對象型的是 null

          三. Java 序列化的注意事項

          1. Java 序列化只是針對對象的狀態(tài)進(jìn)行保存,至于對象中的方法,序列化不關(guān)心
          2. 當(dāng)一個父類實現(xiàn)了序列化,那么子類會自動實現(xiàn)序列化,不需要顯示實現(xiàn)序列化接口
          3. 當(dāng)一個對象的實例變量引用了其他對象,序列化這個對象的時候會自動把引用的對象也進(jìn)行序列化(實現(xiàn)深度克隆)
          4. 當(dāng)某個字段被申明為 transient 后,默認(rèn)的序列化機(jī)制會忽略這個字段
          5. 被申明為 transient 的字段,如果需要序列化,可以添加兩個私有方法:writeObject 和readObject
          4:分布式架構(gòu)下常見序列化技術(shù)

          由于 Java 本身提供的序列化機(jī)制存在兩個問題

          1. 序列化后的數(shù)據(jù)比較大,傳輸效率低
          2. 其他語言無法識別和對接

          由于存在這兩個問題,一定會有其他的序列化方式來解決這兩個問題,下面簡單介紹一下各種序列化方式

          1. XML 序列化框架
          2. JSON 序列化框架
          3. Hessian 序列化框架
          4. Avro 序列化框架
          5. kyro 序列化框架
          6. Protobuf 序列化框架

          具體的序列化框架就不再展開講解,下面講下序列化框架的選型

          5:序列化框架的選型

          選型建議

          1. 對性能要求不高的場景,可以采用基于 XML 的 SOAP 協(xié)議
          2. 對性能和間接性有比較高要求的場景,那么 Hessian、Protobuf、Thrift、Avro 都可以。
          3. 基于前后端分離,或者獨立的對外的 api 服務(wù),選用 JSON 是比較好的,對于調(diào)試、可讀性都很不錯
          4. Avro 設(shè)計理念偏于動態(tài)類型語言,那么這類的場景使用 Avro 是可以的

          結(jié)尾

          對于整個分布式系統(tǒng)的通信模塊全局性的知識就都講完了,不知道你對于分布式系統(tǒng)的通信方面有沒有一個比較全面的認(rèn)識了呢?希望今天的文章能對你有幫助,下一篇文章會給大家?guī)矸植际椒矫娴闹R,喜歡的話可以關(guān)注公眾號。




          瀏覽 46
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩欧美国产免费 | 蜜桃视频在线观看一区 | 中文字幕一区精品 | 学生妹一级大片 | 成人在线中文免费视频 |