主頁 > 軟體設計 > 當我們瀏覽器訪問某個網站時,中間經歷了什么,如何到達對方的?

當我們瀏覽器訪問某個網站時,中間經歷了什么,如何到達對方的?

2021-10-16 08:36:52 軟體設計

前言

前一篇介紹了OSI參考模型/TCP/IP協議體系每層的作用以及分層的好處,但是對于一個應用資料訪問來說,在TCP/IP協議體系中,它不是獨立完成的,而是各層之間共同完成,直到從物理層介質變成位元流發送出去,這一篇就以一個平時常用的網站訪問來了解下整個的通信程序,(這個程序不嚴謹,只是讓初學者理解起來更加方便,省去了一些細節的程序,)

當我打開瀏覽器,訪問自己博客時,中間經歷了什么,它是如何到達對方服務器的呢?

這里只是講解重點部分,很多協議的細節或者網路環境都進行了簡化,這個其實就是后面我們要學的,但是對于初學者來說,先了解一個通信的大致程序,以及資料包在處理程序中,每一層發生了什么事情,這樣在后續的學習中就會一個很大的幫助,

(1)打開瀏覽器,輸入www.ccieh3c.com,這個時候應用程式瀏覽器會查找hosts檔案或者DNS快取,是否有這個域名對應的IP資訊,如果沒有則會發送給DNS進行請求,轉換成對應的IP,(這里假設ccieh3c.com的地址是1.1.1.1,瀏覽器知道,DNS協議在后續會講解)得到IP后,瀏覽器開始打包訪問的請求,使用HTTP或者HTTPS,不管使用哪種,里面請求的是ccieh3c.com的首頁,對應的協議會把這個請求給組織好進行封裝,然后通過socket介面交給下一層傳輸層去完成,

在這里插入圖片描述

(2)傳輸層有兩種協議,一種TCP(面向連接協議),一種UDP(無連接協議),而HTTP使用的是TCP協議,簡單理解面向連接就是TCP能夠保證資料能夠到達對方,如果對方沒收到,就會重新發送,直到對方收到為止,(這里暫時省去了TCP的細節)TCP會產生兩個埠號,一個是訪問者自己瀏覽器隨機生成的埠號(假設為21345),服務器WEB的埠號為標準埠號(80),這個埠號我們在后續會在提及,傳輸層封裝完畢,會交給下一層網路層,

圖片

(3)在TCP/IP中網路層使用的是IP協議,IP協議里面涉及兩個重要地址,一個是源IP地址,一個是目的IP地址,源地址表示訪問者,目的就是我們要去訪問的服務器地址1.1.1.1,大家可能好奇,平時我打開電腦就能上網了呀,并沒有去設定過什么IP地址,那是因為在網路里面有另外一個協議幫助電腦自動獲取地址,這個協議就是DHCP,

圖片

這個時候電腦作業系統知道了服務器的目標IP,就開始根據這個IP找服務器,并且作業系統會做一個判斷,這個目標IP地址是不是本地,還是其他的地方的,顯然在服務器IP 1.1.1.1與本地電腦IP 192.168.255.2不在一個地方,不在一個地方的話,那怎么去往對方呢?作業系統會進行一個操作,把這個資料丟給默認網關,192.168.255.254,讓網關來進行轉發,

圖片

(4)這個時候是不是就萬事大吉了,知道了服務器的IP地址,也知道去往對方交給網關處理就行了,但是要考慮這樣一個問題,這個資料是要繼續往下面封裝的,下一層是資料鏈路層,在資料鏈路層里面可能存在著多個設備,那訪問者怎么來確定你就是我要找的網關呢?

圖片

這個時候就要介紹另外一種地址了,物理地址(MAC地址),當設備出廠的時候,廠家會把這個地址燒錄進網卡介面里面,它的作用就是在鏈路層里面來進行通信,并且這個地址由于出廠就已經固定燒錄在網卡里面了,具有唯一性,所以能夠來定位確認到某一臺設備,明白了這個,訪問者只要在鏈路層里面找這個物理MAC地址,不就能夠確認網關是誰了嗎?又出現一個新的問題了,訪問者他不可能天生就知道網關的MAC地址是多少,那如何得知呢?訪問者這個時候會在本地鏈路里面大吼一聲,誰是192.168.255.254啊,告訴我!!網關聽到這個后,發現找的是自己,也大吼一聲,我就是!這是我的物理MAC地址!,這樣訪問者就知道了網關的MAC地址了,這個靠大吼一聲的協議就是ARP協議,而這種鏈路層網路叫做以太局域網,(這個也是我們學習的重點)鏈路層封裝完畢后,最終交給物理層(網卡)變成位元流1010101010,通過物理介質網線發送出去,

圖片

到這里,訪問者電腦總算是完成了整個的資料封裝流程,把這個瀏覽器的請求發送出去,交給網關了,

圖片

(5)網關收到以后,需要考慮一個問題,這個資料是給自己的呢?還是交給其他地方的?這個時候網關就需要做一個操作,就是把資料給解封裝,因為網關只有看到了對應的資訊,它才能夠判斷這個包到底是給自己的還是交給其他,

圖片

接下來的流程就不提物理層了,只要是正常規范的網卡跟線路它都能夠去處理這些位元流的內容,后續重點放在二層、三層上面(這個也是路由交換的重點,)網關通過解封裝后,得到以太網頭部,發現目標MAC是自己,繼續解封裝,得到IP頭部,發現目標IP地址是1.1.1.1,這個地址不是自己,那就是需要交給其他地方的,網關會執行一個操作,查找路由表,選擇去往1.1.1.1的最優路徑,這里從圖上面可以發現去往目的地可以通過B,也可以通過C到達,也非常像我們去往一個地方,比如去北京,都知道做飛機是最快的,但是可能從你源地方那沒有機場,你需要做班車或者地鐵到最近的機場才行,同樣的,網關查路由表發現去往目的IP 1.1.1.1,有B、C兩條路徑可以發送,它會通過路由演算法做出一個計算,選擇一條最優的路徑抵達到對方,然后發送出去,比如這里從B去往目的地最優,這個條目會體現在路由表里面,網關知道去往1.1.1.1,發送給B,這個時候就有2個疑問了,第一:鏈路層與網路層的頭部已經被解封裝去掉了,路由器需要重新封裝,第二:封裝的內容怎么填寫,

圖片

從訪問者電腦到網關,以太網的頭部源MAC地址是電腦的,目的MAC地址是網關的,那么到了網關這里,網關的網卡介面也有自己的MAC地址,B路由器的介面也有自己的MAC地址,這時候網關封裝鏈路層的以太網頭部在用之前的資訊就不行了,因為它表示的是電腦找網關這段鏈路中用的,而到了這里則變成了網關去往1.1.1.1,交給B處理,那是不是以太網頭部的源MAC變成了網關介面的MAC,而目的MAC變成了B的,這樣B在收到這個包以后,它會發現原來是找它的,它也跟網關一樣執行一樣的解封裝,查路由表,在封裝,最終到達D,(網關到B,B到D獲取的MAC同樣通過ARP協議)

圖片

在這個結構里面,D的身后就是WEB服務器了,D在收到這個資料以后,也跟之前網關、B的操作一樣,解封裝鏈路層,發現目的MAC是找自己,解封網路網路層后 ,發現IP是1.1.1.1,就在自己身后,通過ARP得到服務器的MAC,然后封裝好 ,交給服務器,

圖片

服務器收到以后,開始如下的解封裝,

圖片

(6)服務器收到請求后會進行回包,最終跟來的時候一樣,通過封裝,然后中間經過路由器轉發,最終也到達客戶端,解封裝,最終內容呈現在了瀏覽器的界面上,(是不是覺得不可思議,平時我們打開瀏覽器輸入一個域名回車,中間竟然發生了這么多的事情,)

從上面例子劃出重點

圖片

從上面的通信例子,跟我們生活中寄快遞是不是有點類似,在某平臺購買了一個商品,賣家作為發送方,將商品進行打包,通過快遞平臺選擇一家,讓其收件、列印單號(包含收件人資訊:地址+姓名+電話),快遞小哥會上門收件,回到快遞點,快遞公司會通過去往相近地區統一裝車發往下一個轉運中心,可能中間會經過一個或者多個轉運中心,期間也可能會經歷一次或者多次卸車、裝車的程序,以及去往的路徑也不一樣,可能某一段走的陸運、某一段走的是空運,到達了最近的轉運中心,開始卸車,將同一個區域的送往代理點,代理點的送貨員將對應快遞送到指定的地址(這個地址可能是某公司、某小區、某學校,這是沒辦法確定具體的收件人),最侄訓通過電話號碼聯系到最終的收件人進行收件,這樣完成了整個的運輸程序, 買家收到以后,就是一個拆件的程序,這里說下,快遞的舉例是沒法全部跟上面的通信程序全部對應上的,只是說很多流程比較相似,便于初學者理解,畢竟用生活的例子代入進來比枯燥的協議流程要容易理解些,通過一個網路通信的流程以及生活的例子,這里列出幾個重點資訊(也是我們后續要學的內容)

圖片

從上面的例子可以看出來,從客戶端的應用程式發送資料到服務器,是一層一層的往下封裝,最終發送出去,這個程序叫做封裝,服務器收到以后,要看到實際的資料,必須一層一層的解封裝,看到最終的資料,然后進行回復,

封裝的作用是為了把這個資料發送出去,應用層的應用程式負責產生資料,交給下層,這里有一個關鍵的點記住,應用程式是知道對方服務器的具體地址的,它會告訴下層,比如這里訪問的是域名ccieh3c.com,這個ccieh3c.com是用戶輸入告訴瀏覽器的,瀏覽器它必須知道域名對應的IP,所以會通過另外一個應用層協議DNS來獲取對應的IP,這個時候瀏覽器就知道了對應的IP,(DNS協議在后面會介紹到的)

傳輸層負責建立雙方的邏輯通信,并且能夠正確表示上層應用,因為在實際中,可能對方服務器運行了WEB、FTP、郵件等應用功能,那客戶端在封裝的時候要明確標識出來上層的應用是什么,這樣對方在讀取的時候才知道,哦,原來你是訪問我WEB應用,這個能夠標識上層應用的功能叫做埠號,從這里也可以發現,地址加埠號能夠確定最終去往的目的服務器是哪臺以及訪問這臺服務器的什么應用,

傳輸層完畢后,會繼續封裝給網路層,網路層必要知道2個重要功能,(1)通過上層給的地址資訊,生成IP頭部(IP頭里面有兩個最重要的資訊,源IP,目的IP,源IP表示客戶端自己,目的IP表示訪問的最終目標)(2)查找目標地址怎么走然后繼續封裝交給下一層鏈路層,

鏈路層目前主流使用的是以太網(局域網),以太網頭部有三個重要的資訊(1)必須包含源目MAC,否則無法進行封裝(2)源目MAC應該怎么填寫呢,從上面的流程來看,會發現一個特點,從客戶端最終抵達服務器,以太網頭部的變化從客戶端–網關,網關–B,B–D,D–服務器,每經過一個設備,源目MAC是會變化的,是不是可以理解成以太網的源目MAC只在本地鏈路內有效,(3)不管是客戶端–網關、B–D,它本身是不知道對端的MAC地址的,它依靠一個協議去獲取,那就是ARP協議,最終封裝完成,交給物理層轉換成位元流從網線發送出去到網關,

中間設備收到,比如B、D,它們是會進行解封裝的,查看以太網頭部,發現MAC是自己,繼續解封 裝,查看IP頭部,發現去往的目的IP不是自己,那就查路由表轉發,交給下一個傳遞設備,然后封裝以太網頭部的時候,源MAC更新為自己,目的MAC為下一個傳遞設備,這里的重點是什么呢?(1)能把資料在本地鏈路內準確的發送給下一個傳遞設備 (2)下一個傳遞設備收到以后,通過解封裝發現MAC是自己,又解封裝,查看IP,發現不是自己,通過路由表查詢下一個傳遞設備,重新封裝以太網頭部,打上新的MAC,這樣在傳遞程序中就不會出錯了,否則客戶端–網關,網關–B的時候,以太網頭部沒有更改MAC地址,它看目的MAC是網關,而不是自己,那說明不是找我的,直接就把這個給丟棄了,不做處理了,

最終服務器收到這個資料,它開始解封裝,查看以太網頭部,發現目的MAC地址是自己,繼續解封裝,查看IP頭部,發現目的IP還是自己,這個時候服務器可以斷定這個資料是給我的了,繼續開始解封裝,從傳輸層頭部(TCP)中得到上層的埠號,最終通過埠號知道客戶端訪問什么服務,交給對應的應用程式處理,完成互動,

整個通信程序就是一個不斷封裝、解封裝的程序,不通的終端讀取的層次不一樣,并且在強調下之前提到過的,應用程式它不關心這個資料最終如何抵達對方的,同樣網路層以及資料鏈路層,它也不關心你上層的應用是網頁瀏覽、QQ、微信、還是游戲,各層負責各自的事情,下層為上層提供對應的服務,

總結

到這里呢,這篇內容就接近尾聲了,這里先說下,最開始的案例有部分的流程是不對的,但是對于初學者來說,只能簡化按這樣的順序講解,否則就非常的復雜,不易于理解,后續在隨著深入,博主會繼續把這個流程在梳理一次,這樣印象就更加深刻了,從最開始的舉例,到中間的生活中的快遞舉例,在到后面的重要細節總結,一直在重復的講解資料在傳遞程序中發生的事情,因為這個流程很關鍵,也是我們學習的重點,所以不斷的重復加深印象,了解了整個通信程序,好處在于后續學習協議的時候會更加理解,并且排錯的時候知道如何下手,因為清楚的知道每一層的作用,大致能夠定位卡在哪個地方,比如網路層,目的IP在路由表中不存在,那自然資料就發不出去了,又或者以太網頭部封裝中,網關設備的MAC獲取錯誤,自然資料會轉發給錯誤的設備,希望大家可以多花時間去理解這個大致通信程序,做到心底有底,剩下的內容就是我們接下來要慢慢去學習的細節部分,完善整個路由交換的知識框架,這樣才好進行網路的規劃、對接、運用什么技術實作客戶的需求等,順便接下來留幾個疑問,這樣也是下面要開始涉及的內容了,

什么是IP地址,它的作用是什么呢?

電腦系統是怎么知道要把這個資料交給網關處理呢?以及什么情況下才需要交給網關處理?

DNS是做什么用的?

ARP協議它如何實作的?

服務器在解封裝的時候,它是在下一層的時候就知道上一層使用的是什么協議?還是必須解封裝后,抵達上一層,才能知道呢?

電腦的IP地址是哪里來的?

在網路傳輸中,IP與MAC哪個變化,哪個是不變化的?

像網關這樣有多個介面的設備,它在封裝MAC的時候以哪個口進行封裝呢?

(可以嘗試自己根據上面的舉例理解下,這樣提高學習興趣,后面會更有動力哇,但是切記不要鉆牛角尖,這樣很容易卡死在胡同里面,降低學習興趣,)

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/317869.html

標籤:其他

上一篇:實作一個網頁直播功能超級簡單(EasyRTMP.apk + nginx-http-flv + vue + flv.js) 不使用 Flash

下一篇:Nginx代理mysql埠

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more