网络请求现在充斥这我们生活中的各个地方,不论是在浏览器里面搜索你想要的信息,还是用手机跟朋友的聊微信,亦或者使用智能电视观看电视节目,网络请求无时无刻不在为你服务,那么你知道一个网络请求的完整链路吗?当从你在浏览器里面输入一个地址,它会经过那些环节才会到你看到的样子?
比如,我们在浏览器里面输:https://restapi.amap.com/v3/place/detail?id=B0FFFAB6J2&key=6797e532620992299480cb05dbca7cff
浏览器会显示如下信息
1{ 2 "count": "1", 3 "infocode": "10000", 4 "pois": [ 5 { 6 "parent": [], 7 "distance": [], 8 "pcode": "110000", 9 "importance": [], 10 "biz_ext": { 11 "cost": [], 12 "rating": [] 13 }, 14 "recommend": "0", 15 "type": "商务住宅;楼宇;商务写字楼", 16 "photos": [ 17 { 18 "title": "效果图", 19 "url": "http://store.is.autonavi.com/showpic/a9836f620749c34742cf1ab67dc98f08" 20 }, 21 { 22 "title": [], 23 "url": "http://store.is.autonavi.com/showpic/53b11166a310a21470acde3a" 24 }, 25 { 26 "title": [], 27 "url": "http://store.is.autonavi.com/showpic/53b11166a310a21470acde31" 28 } 29 ], 30 "discount_num": "0", 31 "gridcode": "5916739702", 32 "typecode": "120201", 33 "shopinfo": "0", 34 "poiweight": [], 35 "deep_info": { 36 "deepsrc": [] 37 }, 38 "citycode": "010", 39 "adname": "朝阳区", 40 "indoor_src": "高德地图", 41 "children": [], 42 "tel": [], 43 "id": "B0FFFAB6J2", 44 "tag": [], 45 "event": [], 46 "entr_location": "116.474531,39.993159", 47 "indoor_map": "1", 48 "email": [], 49 "timestamp": "2020-08-21 11:35:30", 50 "website": [], 51 "address": "阜荣街10号", 52 "adcode": "110105", 53 "pname": "北京市", 54 "biz_type": [], 55 "cityname": "北京市", 56 "postcode": [], 57 "match": "0", 58 "business_area": "望京", 59 "indoor_data": { 60 "cmsid": "TY000191_B0FFFAB6J2", 61 "truefloor": [], 62 "cpid": "B0FFFAB6J2", 63 "floor": [] 64 }, 65 "childtype": [], 66 "rich_content": [], 67 "exit_location": [], 68 "name": "首开广场", 69 "location": "116.473004,39.993306", 70 "shopid": [], 71 "navi_poiid": "J50F001020_342662", 72 "groupbuy_num": "0" 73 } 74 ], 75 "status": "1", 76 "info": "OK" 77}
这里我们以此为例分析下整个过程的发生,并延伸解读相关的一些概念。
首先看下请求的整个大致链路

- 用户在浏览器中输入想要访问的地址
- 浏览器需要从缓存或者DNS中获取要链接的IP地址,然后跟获取到的IP建立连接,并发送请求
- 现在一般大公司都会有统一接入层,我厂就会由统计接入层来处理https证书,转发流量等
- 转发后的流量会到请求的实际处理服务器,然后将数据交由监听端口的服务进行处理,这里根据语言或者实现的不同有Nginx、Tomcat等
- 服务的话以Java为例,现在主要流行的是Spring体系,接到请求后会做请求的Dispatch,交由一个线程进行处理,使用Mybatis或其他ORM框架从数据库中读取数据,处理成指定的数据格式并返回
- 数据库层现在多使用MySql提供数据的存储、查询等,当然也可能会使用Redis之类的NoSql进行缓存
- 在这些都做完之后,会将结果层层返回,直至用户的浏览器端,浏览器再根据http协议解析数据,进行最终的结果呈现
这里主要写了我认为比较重要的几个节点,可以看到这个链路还是挺长的,而且这还少简化了很多细节,中间会涉及到很多技术,后续的文章也根据这些节点来展开,尽量阐述明白。
