互联网开发相关面试题(一篇文章搞定云服务、分布式中的远程调用技术)


一篇文章搞定分布式开发中的远程调用技术

1、关于Spring Cloud的远程调用


1、Spring Cloud项目中是怎么实现远程调用的:

(1)我们是使用SpringCloud Feign技术来实现远程调用的,
(2)SpringCloud Feign底下是使用httpclient技术来进行远程调用的
(3)而httpclient基于RPC框架
RPC框架是可以基于http协议或者tcp/ip协议,(我们是使用的tcp/ip)
(如果是基于tcp/ip协议速度就快,可是使用tcp/ip协议的话就要担心序列化的问题,很复 杂,)
(如果是http协议速度就慢点,但是很简单使用,主要是在服务调用方通过标识请求, GET,POST然后通过url来定位到服务提供方提供的服务,数据通过xml或者json来传 输的就行了,为什么说http协议慢点,因为http协议底层是使用tcp/ip协议的)

2、什么是Http协议

(HTTP协议,即超文本传输协议(Hypertext transfer protocol)。是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。)

3、什么是TCP/IP协议

(TCP/IP传输协议,即传输控制/网络协议)

4、分布式开发使用RPC和HTTP有什么不同

1.我们在分布式开发中是可以基于RPC服务,也可以基于http服务来进行远程调用
RPC服务和HTTP服务对比

2.在 RPC 中,发出请求的程序是客户程序,而提供服务的程序是服务器。
HTTP是一种超文本传输协议。是WWW浏览器和WWW服务器之间的应用层通讯协议。

3.传输协议不同
以前不懂的时候就搞不清楚,感觉都是写一个服务然后在客户端调用就行了么,到后面就自己研究了一下发现,

(1)RPC服务,RPC主要是基于TCP/IP协议的,也可以基于HTTP协议
HTTP服务,只能基于HTTP协议,而http底层又是基于tcp/ip协议的
所以效率来看的话,RPC更加快

(2)RPC和HTTP负载均衡不同的的对比
RPC,基本都自带了负载均衡策略
HTTP,需要配置Nginx,HAProxy来实现

(3)论复杂度,RPC框架肯定是高于简单的HTTP接口的
基于HTTP实现远程调用的话很简单,主要是在服务调用方通过标识请求,GET,POST然后通过url来定位到服务提供方提供的服务,数据通过xml或者json来传输,省去了TCP的序列化和反序列化

而RPC就需要担心,对象序列化和反序列化
之所以要进行序列化,是因为在网络上进行传输的话,无论任何类型的数据,最终都需要转化为二进制流在网络上传输。
(把对象转为二进制流称为序列号,,,,把二进制流恢复为对象称为反序列化)

5、什么是HttpClient接口

Httpclient在工作中用的还是比较多的,主要用httpclient技术完成一些第三方接口服务的调用,例如:发送短信验证码、邮箱激活等。

6、你自己开发过HttpClient接口吗

我们自己也开发过httpclient相关的接口,我们上一个项目就是前后台完全分离的,由web前端工作人员,通过使用js跨域访问我们的httpclient接口,我们首先会根据需求文档结合前端工程师对页面数据的要求,开发相应的接口文档接口文档中主要有请求路径、请求类型、请求头信息、请求报文、响应报文等内容。我们后台在编写httpclient接口时,只需要正常的编写我们的controller层就能完成httpclient接口的发布,我们发布的接口都遵循rest开发风格,为方法规定具体的请求类型,主要分为:get、post、put、delete四种类型,用来区分增删改查四个功能,我们在controller类上使用@ResetController(@ResponseBody和@controller两个注解的结合,加上@ResetController之后所有的方法返回值返回的就是json字符串,就不需要在每个方法钱加@ResponseBody注解)作为注解,我们还提供了一个统一的拦截器,用来判断请求头信息中的用户信息是否准确,若准确继续请求,反之拦截请求,整体感觉这个技术也挺简单的。

2、RPC框架面试题


1、什么是RPC服务

远程过程调用,是分布式系统常见的一种通信方法,感觉都是写一个服务然后在客户端调用就行了,就是像调用本地方法一样调用远程方法。

2、使用RPC优势长处

(1)RPC解决了单台服务器处理能力受硬件成本的限制问题,RPC将原本本地调用转变 为调用远端服务器上的方法,极大程度上提高了系统的处理能力和吞吐量;

(2)RPC使得不同系统隔离开来,对于不同模块的开发人员不用关心具体方法的实现, 只关心该方法能提供的数据和解决的问题,使得开发效率和系统维护变得简单;

(3)PRC作为分布式应用不得不了解和掌握的一块重要的内容。

3、RPC的架构

RPC分为四个组件
1.客户端(Client),服务的调用方。
2.服务端(Server),真正的服务提供者。
3.客户端存根,存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方。
4.服务端存根,接收客户端发送过来的消息,将消息解包,并调用本地的方法。

4、为什么我们要用RPC?

RPC 的主要目标是让构建分布式应用更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。为实现该目标,RPC 框架需提供一种透明调用机制让使用者不必显式的区分本地调用和远程调用。

5、RPC需要解决的三个问题

RPC要达到的目标:远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。

Call ID映射。我们怎么告诉远程机器我们要调用哪个函数呢?在本地调用中,函数体是直接通过函数指针来指定的,我们调用具体函数,编译器就自动帮我们调用它相应的函数指针。但是在远程调用中,是无法调用函数指针的,因为两个进程的地址空间是完全不一样。所以,在RPC中,所有的函数都必须有自己的一个ID。这个ID在所有进程中都是唯一确定的。客户端在做远程过程调用时,必须附上这个ID。然后我们还需要在客户端和服务端分别维护一个 {函数 <–> Call ID} 的对应表。两者的表不一定需要完全相同,但相同的函数对应的Call ID必须相同。当客户端需要进行远程调用时,它就查一下这个表,找出相应的Call ID,然后把它传给服务端,服务端也通过查表,来确定客户端需要调用的函数,然后执行相应函数的代码。

序列化和反序列化。客户端怎么把参数值传给远程的函数呢?在本地调用中,我们只需要把参数压到栈里,然后让函数自己去栈里读就行。但是在远程过程调用时,客户端跟服务端是不同的进程,不能通过内存来传递参数。甚至有时候客户端和服务端使用的都不是同一种语言(比如服务端用C++,客户端用Java或者Python)。这时候就需要客户端把参数先转成一个字节流,传给服务端后,再把字节流转成自己能读取的格式。这个过程叫序列化和反序列化。同理,从服务端返回的值也需要序列化反序列化的过程。

网络传输。远程调用往往是基于网络的,客户端和服务端是通过网络连接的。所有的数据都需要通过网络传输,因此就需要有一个网络传输层。网络传输层需要把Call ID和序列化后的参数字节流传给服务端,然后再把序列化后的调用结果传回客户端。只要能完成这两者的,都可以作为传输层使用。因此,它所使用的协议其实是不限的,能完成传输就行。尽管大部分RPC框架都使用TCP协议,但其实UDP也可以,而gRPC干脆就用了HTTP2。Java的Netty也属于这层的东西。

3、三次握手四次挥手是什么

(三次握手四次挥手是为了建立可靠的连接)最终的远程调用就在TCP连接建立过程与断开过程

TCP三次握手建立连接:
三次握手的目的是建立可靠的通信信道,主要的目的就是双方确认自己与对方的发送与接收机能正常。
1.第一次握手:客户什么都不能确认;服务器确认了对方发送正常
2.第二次握手:客户确认了:自己发送、接收正常,对方发送、接收正常;服务器确认 了:自己接收正常,对方发送正常
3.第三次握手:客户确认了:自己发送、接收正常,对方发送、接收正常;服务器确认 了:自己发送、接收正常,对方发送接收正常
所以三次握手就能确认双发收发功能都正常,缺一不可。

TCP的四次挥手断开连接:
四次挥手断开连接是因为要确定数据全部传书完了
1.客户与服务器交谈结束之后,客户要结束此次会话,就会对服务器说:我要关闭连接了(第一 次挥手)
2.服务器收到客户的消息后说:好的,你要关闭连接了。(第二次挥手)
3.然后服务器确定了没有话要和客户说了,服务器就会对客户说,我要关闭连接了。(第三次挥 手)
4.客户收到服务器要结束连接的消息后说:已收到你要关闭连接的消息。(第四次挥手),才关闭

4、socket是什么

则是对TCP/IP协议的封装和应用(程序员层面上),Socket本身并不是协议,而是一个调用接口(API,它只是提供了一个针对TCP或者UDP编程的接口),通过Socket,我们才能使用TCP/IP协议,实际上,Socket跟TCP/IP协议没有必然的联系。
Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以说,Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,

5、HTTP协议面试题集


1、说一下什么是Http协议?

对器客户端和 服务器端之间数据传输的格式规范,格式简称为“超文本传输协议”。

2、GET方法与POST方法的区别

区别一:
get重点在从服务器上获取资源,post重点在向服务器发送数据;
区别二:
Get传输的数据量小,因为受URL长度限制,但效率较高;
Post可以传输大量数据,所以上传文件时只能用Post方式;
区别三:
get是不安全的,因为URL是可见的,可能会泄露私密信息,如密码等;
post是放在请求头部的,是安全的

3.HTTP请求由那几个部分组成
请求行 (包含请求方法、URI、HTTP版本信息),
请求头
请求数据

4.响应报文包含三部分
a、状态行:包含HTTP版本、状态码、状态码的原因短语
b、响应首部字段
c、响应内容实体

5、常见的HTTP相应状态码

返回的状态
1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求

200:请求被正常处理
204:请求被受理但没有资源可以返回
206:客户端只是请求资源的一部分,服务器只对请求的部分资源执行GET方法,相应报文中通过Content-Range指定范围的资源。
301:永久性重定向
302:临时重定向
303:与302状态码有相似功能,只是它希望客户端在请求一个URI的时候,能通过GET方法重定向到另一个URI上
304:发送附带条件的请求时,条件不满足时返回,与重定向无关
307:临时重定向,与302类似,只是强制要求使用POST方法
400:请求报文语法有误,服务器无法识别
401:请求需要认证
403:请求的对应资源禁止被访问
404:服务器无法找到对应资源
500:服务器内部错误
503:服务器正忙

6.http版本的对比

HTTP1.0版本的特性
早先1.0的HTTP版本,是一种无状态、无连接的应用层协议。
HTTP1.0规定浏览器和服务器保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器处理完成后立即断开TCP连接(无连接),服务器不跟踪每个客户端也不记录过去的请求(无状态)。

HTTP1.1版本新特性
a、默认持久连接节省通信量,只要客户端服务端任意一端没有明确提出断开TCP连接,就一直保持连接,可以发送多次HTTP请求
b、管线化,客户端可以同时发出多个HTTP请求,而不用一个个等待响应
c、断点续传原理

HTTP2.0版本的特性
二进制分帧(采用二进制格式的编码将其封装)
首部压缩(设置了专门的首部压缩设计的HPACK算法。)
流量控制(设置了接收某个数据流的多少字节一些流量控制)
多路复用(可以在共享TCP链接的基础上同时发送请求和响应)
请求优先级(可以通过优化这些帧的交错和传输顺序进一步优化性能)
服务器推送(就是服务器可以对一个客户端请求发送多个响应。服务器向客户端推送资 源无需客户端明确的请求。(重大更新))

7、Http协议中有那些请求方式?

GET: 用于请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL传参给服务器
POST:用于传输信息给服务器,主要功能与GET方法类似,但一般推荐使用POST方式。
PUT: 传输文件,报文主体中包含文件内容,保存到对应URI位置。
HEAD: 获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URI是否有 效。
DELETE:删除文件,与PUT方法相反,删除对应URI位置的文件。
OPTIONS:查询相应URI支持的HTTP方法。

8.http和https的区别
(其实HTTPS就是从HTTP加上加密处理(一般是SSL安全通信线路)+认证+完整性保护)
区别:
1,http需要拿到ca证书,需要钱的
2,端口不一样,http是80,https443
3,http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协 议。
4.http和https使用的是完全不同的连接方式(http的连接很简单,是无状态的;HTTPS 协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协 议安全。)

发布了36 篇原创文章 · 获赞 36 · 访问量 9888

猜你喜欢

转载自blog.csdn.net/weixin_43122090/article/details/103656300