網(wǎng)絡(luò)請求現(xiàn)在充斥這我們生活中的各個地方,不論是在瀏覽器里面搜索你想要的信息,還是用手機(jī)跟朋友的聊微信,亦或者使用智能電視觀看電視節(jié)目,網(wǎng)絡(luò)請求無時無刻不在為你服務(wù),那么你知道一個網(wǎng)絡(luò)請求的完整鏈路嗎?當(dāng)從你在瀏覽器里面輸入一個地址,它會經(jīng)過那些環(huán)節(jié)才會到你看到的樣子?
比如,我們在瀏覽器里面輸:https://restapi.amap.com/v3/place/detail?id=B0FFFAB6J2&key=6797e532620992299480cb05dbca7cff
瀏覽器會顯示如下信息
{
"count": "1",
"infocode": "10000",
"pois": [
{
"parent": [],
"distance": [],
"pcode": "110000",
"importance": [],
"biz_ext": {
"cost": [],
"rating": []
},
"recommend": "0",
"type": "商務(wù)住宅;樓宇;商務(wù)寫字樓",
"photos": [
{
"title": "效果圖",
"url": "http://store.is.autonavi.com/showpic/a9836f620749c34742cf1ab67dc98f08"
},
{
"title": [],
"url": "http://store.is.autonavi.com/showpic/53b11166a310a21470acde3a"
},
{
"title": [],
"url": "http://store.is.autonavi.com/showpic/53b11166a310a21470acde31"
}
],
"discount_num": "0",
"gridcode": "5916739702",
"typecode": "120201",
"shopinfo": "0",
"poiweight": [],
"deep_info": {
"deepsrc": []
},
"citycode": "010",
"adname": "朝陽區(qū)",
"indoor_src": "高德地圖",
"children": [],
"tel": [],
"id": "B0FFFAB6J2",
"tag": [],
"event": [],
"entr_location": "116.474531,39.993159",
"indoor_map": "1",
"email": [],
"timestamp": "2020-08-21 11:35:30",
"website": [],
"address": "阜榮街10號",
"adcode": "110105",
"pname": "北京市",
"biz_type": [],
"cityname": "北京市",
"postcode": [],
"match": "0",
"business_area": "望京",
"indoor_data": {
"cmsid": "TY000191_B0FFFAB6J2",
"truefloor": [],
"cpid": "B0FFFAB6J2",
"floor": []
},
"childtype": [],
"rich_content": [],
"exit_location": [],
"name": "首開廣場",
"location": "116.473004,39.993306",
"shopid": [],
"navi_poiid": "J50F001020_342662",
"groupbuy_num": "0"
}
],
"status": "1",
"info": "OK"
}
這里我們以此為例分析下整個過程的發(fā)生,并延伸解讀相關(guān)的一些概念。
首先看下請求的整個大致鏈路

請求過程
- 用戶在瀏覽器中輸入想要訪問的地址
- 瀏覽器需要從緩存或者DNS中獲取要鏈接的IP地址,然后跟獲取到的IP建立連接,并發(fā)送請求
- 現(xiàn)在一般大公司都會有統(tǒng)一接入層,我廠就會由統(tǒng)計接入層來處理https證書,轉(zhuǎn)發(fā)流量等
- 轉(zhuǎn)發(fā)后的流量會到請求的實際處理服務(wù)器,然后將數(shù)據(jù)交由監(jiān)聽端口的服務(wù)進(jìn)行處理,這里根據(jù)語言或者實現(xiàn)的不同有Nginx、Tomcat等
- 服務(wù)的話以Java為例,現(xiàn)在主要流行的是Spring體系,接到請求后會做請求的Dispatch,交由一個線程進(jìn)行處理,使用Mybatis或其他ORM框架從數(shù)據(jù)庫中讀取數(shù)據(jù),處理成指定的數(shù)據(jù)格式并返回
- 數(shù)據(jù)庫層現(xiàn)在多使用MySql提供數(shù)據(jù)的存儲、查詢等,當(dāng)然也可能會使用Redis之類的NoSql進(jìn)行緩存
- 在這些都做完之后,會將結(jié)果層層返回,直至用戶的瀏覽器端,瀏覽器再根據(jù)http協(xié)議解析數(shù)據(jù),進(jìn)行最終的結(jié)果呈現(xiàn)
這里主要寫了我認(rèn)為比較重要的幾個節(jié)點,可以看到這個鏈路還是挺長的,而且這還少簡化了很多細(xì)節(jié),中間會涉及到很多技術(shù),后續(xù)的文章也根據(jù)這些節(jié)點來展開,盡量闡述明白。