网络请求现在充斥这我们生活中的各个地方,不论是在浏览器里面搜索你想要的信息,还是用手机跟朋友的聊微信,亦或者使用智能电视观看电视节目,网络请求无时无刻不在为你服务,那么你知道一个网络请求的完整链路吗?当从你在浏览器里面输入一个地址,它会经过那些环节才会到你看到的样子?
比如,我们在浏览器里面输: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": "商务住宅;楼宇;商务写字楼",
"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": "朝阳区",
"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"
}
这里我们以此为例分析下整个过程的发生,并延伸解读相关的一些概念。
首先看下请求的整个大致链路
- 用户在浏览器中输入想要访问的地址
- 浏览器需要从缓存或者DNS中获取要链接的IP地址,然后跟获取到的IP建立连接,并发送请求
- 现在一般大公司都会有统一接入层,我厂就会由统计接入层来处理https证书,转发流量等
- 转发后的流量会到请求的实际处理服务器,然后将数据交由监听端口的服务进行处理,这里根据语言或者实现的不同有Nginx、Tomcat等
- 服务的话以Java为例,现在主要流行的是Spring体系,接到请求后会做请求的Dispatch,交由一个线程进行处理,使用Mybatis或其他ORM框架从数据库中读取数据,处理成指定的数据格式并返回
- 数据库层现在多使用MySql提供数据的存储、查询等,当然也可能会使用Redis之类的NoSql进行缓存
- 在这些都做完之后,会将结果层层返回,直至用户的浏览器端,浏览器再根据http协议解析数据,进行最终的结果呈现
这里主要写了我认为比较重要的几个节点,可以看到这个链路还是挺长的,而且这还少简化了很多细节,中间会涉及到很多技术,后续的文章也根据这些节点来展开,尽量阐述明白。