身为 Java Web 开发我发现很多人一些 Web 基础问题都答不上来。
上周我面试了一个三年经验的小伙子,他简历写着写着对操作系统、计算机网络、算法都比较熟悉。
我心里想,这个小伙子看起来胸有成竹好像有点东西,我就问:你挑个你最有自信的我先问问。
这是想找个他最有自信的看看他到底有多强。
一开始我问他 HTTP/1、HTTP/2 相关的他到是能答点东西出来。
就是 HTTP1.1什么特性,哪里哪里不好。
然后 HTTP2 什么特性,比 HTTP1.1 好在哪里哪里这样。
但是他的一些措辞让我感觉是把 HTTP 作为一个“运输通道”。
所以后来我问他:你怎么理解 HTTP 的,它的本质是什么,有什么用?
面试者愣一会儿,我接着问:就是说 HTTP 的作用,为什么客户端和服务端要用 HTTP 这个协议来通信。
他说是提供了一个通道来传输数据。
我说 HTTP 是一个协议。
我接着问那你知道什么是 HTTP 和 RPC 的关系吗?
为什么要有 RPC?
他眼睛盯着桌上的水,额了半天。
行那我再来问问你项目相关的吧。
后来关于项目细节、整体架构和一些场景的处理都问了,小伙子都答不好,最后我跟他说回家等通知吧。
面完试之后我回去问了同事相同的问题,我发现答的也不够好,有些地方有点混淆。
当然我同事也经常问我问题,我也答不好,就共同进步,走向人生巅峰,迎娶那啥啥的。
所以今儿我就整理一波来说说这类问题,相信看完文章之后你会有进一步的认识。
HTTP 的本质
首先你要明确 HTTP 是一个协议,是一个超文本传输协议。
它基于 TCP/IP 来传输文本、图片、视频、音频等。
重点来了。
HTTP 不提供数据包的传输功能,也就是数据包从浏览器到服务端再来回的传输和它没关系。
这是 TCP/IP 干的。
那 HTTP 有啥用?我们来分析一波。
我们上网要么就是获取一些信息来看,要么就是修改一些信息。
比如你用浏览器刷微博就是获取信息,发微博就是修改信息。
所以说浏览器需要告知服务器它需要什么,这次的请求是要获取哪些信息?发怎么样的微博。
这就涉及到浏览器和服务器之间的通信交互。
而交互就需要一种格式。
像你我之间的谈话就用中文,你要突然换成俄语我听不懂那不就 GG 了。
所以说 HTTP 它规定了一种格式,一种通信格式,大家都用这个格式来交谈。
这样不论你是什么服务器、什么浏览器都能顺利的交流,减少交互的成本。
就像全世界如果都讲中文,那我们不就不需要学英文了,那不就较少交互的成本了。
不像现在我们还得学英文,不然就看不懂文档等等。
万一之后俄语又起来了,咱还得对接俄文,这交互成本是不是就上来了。
而网络世界还好,咱们现在的 Web 交互基本上就是 HTTP 了。
其实 HTTP 协议的格式很像我们信封,有个固定的格式。
。
左上角写邮编,右上角贴邮票,然后地址姓名啥的依次来。
因为计算机是很死板的,不像我们人一样有一种立体扫描感,所以要规定先写头、再写尾。
你要是先写尾,再写头计算机就认不出来了。
所以 HTTP 就规定了请求先搞请求行、再搞请求报头、再搞请求体。
响应就状态行、响应报头、响应体。
所以 HTTP 的本质是什么?
就是客户端和服务端约定好的一种通信格式。
对 HTTP 想有多的认识可以看我之前的文章 从 1950 年开始说起,带你看 HTTP 的演进之路
HTTP 和 RPC 的关系
HTTP 和 RPC 其实是两个维度的东西, HTTP 指的是通信协议。
而 RPC 则是远程调用,其对应的是本地调用。
RPC 的通信可以用 HTTP 协议,也可以自定义协议,是不做约束的。
像之前的单体时代,我们的 service 调用就是自己实现的方法,是本地进程内的调用。
public User getUserById(Long id) { return userDao.getUserById(id); // 这叫本地调用 }
现在都是微服务了,根据业务模块做了不同的拆分,像用户的服务不用我这个小组负责,我这小组只要写订单服务就行了。
但是我们服务需要用到用户的信息,于是我们需要调用用户小组的服务,于是代码变成了以下这种
public User getUserById(Long id) { return userConsumer.getUserById(id); // 这是远程调用,逻辑是用户小组的服务实现的。 }