上周我面了个三年 Javaer,这几个问题都没答出来
身为 Java Web 开发我发现很多人一些 Web 基础问题都答不上来。
上周我面试了一个三年经验的小伙子,一开始我问他 HTTP/1、HTTP/2相关的他到是能答点东西出来。
后来我问他:你知道 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); // 这是远程调用,逻辑是用户小组的服务实现的。
}
可能还有些小伙伴不太清楚,再来看个图。
把之前的用户实现拆分出来弄了一个用户服务,订单相关的也拆成了订单服务,都单独部署。
这样订单相关的服务要获取用户的信息就需要远程调用了。
可以看到 RPC 就是通过网络进行远程调用,订单服务其实就是客户端,而用户服务是服务端。
这又涉及到交互了,所以也需要约定一个格式,至于要不要用 HTTP 这个格式,就是大家自己看着办。
至此相信你对 HTTP 是啥也清楚了。
RPC 和 HTTP 的之间的关系也清楚了。
下次再也不怕被面试官问这个了。
那为什么要有 RPC?
可能你常听到什么什么之间是 RPC 调用的,那你有没有想过为什么要 RPC, 我们直接 WebClient HTTP 调用不行么?
其实 RPC 调用是因为服务的拆分,或者本身公司内部的多个服务之间的通信。
服务的拆分独立部署,那服务间的调用就必然需要网络通信,用 WebClient 调用当然可行,但是比较麻烦。
我们想即使服务被拆分了但是使用起来还是和之前本地调用一样方便。
所以就出现了 RPC 框架,来屏蔽这些底层调用细节,使得我们编码上还是和之前本地调用相差不多。
并且 HTTP 协议比较的冗余,RPC 都是内部调用所以不需要太考虑通用性,只要公司内部保持格式统一即可。
所以可以做各种定制化的协议来使得通信更高效。
比如规定 yes 代表 yes的练级攻略,你看是不是更高效了,少传输的 5 个字。
就像特殊行动的暗号,高效简洁!
所以公司内部服务的调用一般都用 RPC,而 HTTP 的优势在于通用,大家都认可这个协议。
所以三方平台提供的接口都是通过 HTTP 协议调用的。
所以现在知道为什么我们调用第三方都是 HTTP ,公司内部用 RPC 了吧?
对了。
上面这段话看起来仿佛 HTTP 和 RPC 是对等关系,不过相信大家看了之前的解析心里应该都有数了。
最后
最近几次面试下来我发现挺多同学基础还是挺薄弱的。
地基要牢啊,八股文得背没错,但是这种基本概念性的东西还是有必要清晰的。
看起来好像对平时的编码没什么用,但是这可以认为是一个“世界观”。
这对于一些事物的判断和认知有很重要的意义。
你站的高才能看的远。
对了,理解了 HTTP 的本质相信你对 RESTful 风格也应该会有更深一层的理解。
HTTP 它是协议,不是运输通道。
下一篇我会剖析下 RESTful ,让你知其然知其所以然。
平日的面试题遇到难处,或者看某个知识点翻遍全网的资料还是感觉很模糊、不透彻,可以私聊我,给我留言。
遇到合适的我会整理写出一篇文章,注意这个前提我认为合适的。
那种工作遇到很细节的场景的还是别了,这种问你上司比较合适:)。
我是 yes,从一点点到亿点点,微信搜一搜「yes的练级攻略」第一时间阅读,关注回复「123」一份 20W 字的走心算法攻略等你来领取,我们下篇见。
上周我面了个三年 Javaer,这几个问题都没答出来的更多相关文章
- 三年经验的C,超过两题答不出请离开软件界
1.double free是什么问题?申请地址与释放地址不一致会有什么问题? 2.main函数最多有几个参数?各是什么作用? 3.crt是什么?编译器是怎么样连接crt的(描述cl或者gcc方式) 4 ...
- [Java]如何为一个自定义类型的List排序。
好吧,三年了,又重拾我的博客了,是因为啥呢,哈哈哈.今天被问到一个题目,当场答不出来,动手动的少了,再此记录下来. Q:有一个MyObject类型的List,MyObject定义如下: class M ...
- 转头条:阿里p7架构师:三年经验应该具备什么样的技能?
问:工作中,有时候实现一个功能,会去看有没有现成的轮子可用.对于重复造轮子与改造轮子有什么看法? 答:一定会的,其实这也是一个提高技术能力的方法,比如今天想做个日期转换的功能,JDK8有日期的新特性就 ...
- 三年Linux运维工作总结教训
Linux运维一定要知道的六类好习惯和23个教训,避免入坑! 从事运维三年半,遇到过各式各样的问题,数据丢失,网站挂马,误删数据库文件,黑客攻击等各类问题. 今天简单整理一下,分享给各位小伙伴. 一. ...
- 记录面试一位三年经验Web前端开发者的过程
今天是2019年6月5日,后天就是端午节了,提前祝端午节快乐! 好了,开始这次面试过程的正题部分. 当我从人事手中接下这份三年哥(暂拟名称)的简历的时候,看到三年工作经验,心想 这应该是个大佬了 挺厉 ...
- 从苏宁电器到卡巴斯基第31篇:难忘的三年硕士时光 IX
在校的最后一个月 毕业答辩的评审老师宣布我没能通过,让我瞬间不知道该怎么好了.已经到了中午,老师们也都是准备吃盒饭去了,我和其他已经通过了的同学随便收拾了一下教室,然后无助的我赶紧去找旁听的教学秘书, ...
- 从苏宁电器到卡巴斯基第29篇:难忘的三年硕士时光 VII
我们可能无家可归 那天晚上和导师道别后,我们几个还聚在一起开了一个小会.当时大家觉得最坏的情况就是学院不肯让步,不能满足我们导师提出的条件.那么这样的话,我们几个只能够重新找导师了.而我们数媒专业里面 ...
- 三年Android开发,月薪一万二,不敢跳槽,每天都很焦虑
在我们的身边,存在一个普遍现象:很多人从事Android开发工作多年,走过的弯和坎,不计其数,经历的心酸难与外人道也.可是技术确难以提升.止步不前,薪资也只能看着别人水涨船高,自己却没有什么起色. 虽 ...
- [No00007F]2016-面经[下] 英文简历写作技巧
一.简历种类 1.中式 中式简历中,常包括政治面貌,性格及身高体重等.如果中英文简历一起递交,建议中文不写政治面貌,因为如果去外企工作,背景中的政治色彩越少越好,起码没有必要让老外知道. 性格是一个主 ...
随机推荐
- Python函数的定义和参数
函数的初识: 以功能为导向,一个函数就是一个功能.随调随用. 优点: 减少代码重复性. 增强代码的可读性. 函数的结构: def function_name(): 函数体 def: 关键字,定义函 ...
- 用python和GDAL 读取GRIB数据
from osgeo import gdal import numpy as np path = './data/201912/anl_surf125.2019120100' dataset = gd ...
- Windos--jar包注册成服务
1.下载资源 链接: https://pan.baidu.com/s/16asJXGudsRN23Rwra_qGZw 提取码: w2gv 解压后有五个文件 1.1注意事项 1.把你的生成的jar包放入 ...
- Maven2 ---- 安装及配置
Maven详解(二)------ Maven的安装配置 目录 1.下载 Maven 2.配置 Maven 环境变量 3.查看 Maven 环境变量是否配置成功 4.在 eclipse 中集成 Ma ...
- 万字长文深入理解java中的集合-附PDF下载
目录 1. 前言 2. List 2.1 fail-safe fail-fast知多少 2.1.1 Fail-fast Iterator 2.1.2 Fail-fast 的原理 2.1.3 Fail- ...
- HBase进阶
date: 2020-10-26 15:43:00 updated: 2020-10-26 18:45:00 HBase进阶 1. 架构 master负责管理多个region server,一个reg ...
- 从零造就JVM大牛(一)
引言 从事java的小伙伴大家好,如果你是一名从事java行业的程序员,无论你是小白还是工作多年的老司机,我相信这篇文章一定会给你带来 不同程度的收货不敢说你看完我的文章从此精通jvm打遍天下无对手, ...
- 【总结】mybatis
一.config配置文件详解 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE config ...
- RestfulApi 学习笔记——简单介绍(一)
前言 什么是restapi? 直接看:http://www.ruanyifeng.com/blog/2014/05/restful_api.html 阮一峰的blog,即可明白,下面是一些例子,增强理 ...
- Django项目-个人网站之投票模块
Django项目之个人网站 关注公众号"轻松学编程"了解更多. Github地址:https://github.com/liangdongchang/MyWeb.git 感兴趣的可 ...