RPC:远程过程调用(分布式、微服务间的方法调用)程序员
HTTP:无状态,每次请求都要发送一个request,服务器响应以后就断掉(http header中的keep-alive指的是tcp)spring
TCP:面向链接,三次握手保证通讯可靠编程
UDP:非面向链接,不可靠,速度快(能够手动对数据收发进行验证,IM系统多采用,QQ)浏览器
Socket:TCP协议的接口实现,面向传输层进行网络编程, socket并非一种协议,是在程序员层面上对TCP/IP协议的封装和应用。实际上是一个调用接口,方便程序员使用TCP/IP协议栈而已。程序员经过socket来使用tcp/ip协议。可是socket并非必定要使用tcp/ip协议,Socket编程接口在设计的时候,就但愿也能适应其余的网络协议。安全
RPC(Remote Procedure Call)是远程过程调用,好比说如今有两台服务器A, B,一个在A服务器上的应用想要调用B服务器上的应用提供的某个,因为不在两个方法不在一个内存空间,不能直接调用,须要经过网络表达调用的语义和传达调用的数据。常存在于分布式系统中。服务器
RPC跟HTTP不是对立面,RPC中可使用HTTP做为通信协议。RPC是一种设计、实现框架,通信协议只是其中一部分。网络
RPC的本质是提供了一种轻量无感知的跨进程通讯的方式,在分布式机器上调用其余方法与本地调用无异(远程调用的过程是透明的,你并不知道这个调用的方法是部署在哪里,经过PRC可以解耦服务)。RPC是根据语言的API来定义的,而不是基于网络的应用来定义的,调用更方便,协议私密更安全、内容更小效率更高。架构
http接口是在接口很少、系统与系统交互较少的状况下,解决信息孤岛初期常使用的一种通讯手段;优势就是简单、直接、开发方便。利用现成的http协议 进行传输。可是若是是一个大型的网站,内部子系统较多、接口很是多的状况下,RPC框架的好处就显示出来了,首先(基于TCP协议的状况下)就是长连接,没必要每次通讯都要像http 同样去3次握手什么的,减小了网络开销;其次就是RPC框架通常都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来讲是无感知、统一化的操做。第三个来讲就是安全性。最后就是最近流行的服务化架构、服务化治理,RPC框架是一个强力的支撑。框架
TCP 三次握手:握手过程当中并不传输数据,在握手后服务器与客户端才开始传输数据,理想状态下,TCP 链接一旦创建,在通信双方中的任何一方主动断开链接以前 TCP 链接会一直保持下去。socket
Socket 是对 TCP/IP 协议的封装,是针对TCP或UDP的具体接口实现,提供了在传输层进行网络编程的方法, Socket 只是个接口不是协议,经过 Socket 咱们才能使用 TCP/IP 协议,除了 TCP,也可使用 UDP 协议来传递数据。
建立 Socket 链接的时候,能够指定传输层协议,能够是 TCP 或者 UDP,当用 TCP 链接,该Socket就是个TCP链接,反之。
Socket 原理
Socket 链接,至少须要一对套接字,分为 clientSocket,serverSocket 链接分为3个步骤:
(1) 服务器监听:服务器并不定位具体客户端的套接字,而是时刻处于监听状态;
(2) 客户端请求:客户端的套接字要描述它要链接的服务器的套接字,提供地址和端口号,而后向服务器套接字提出链接请求;
(3) 链接确认:当服务器套接字收到客户端套接字发来的请求后,就响应客户端套接字的请求,并创建一个新的线程,把服务器端的套接字的描述发给客户端。一旦客户端确认了此描述,就正式创建链接。而服务器套接字继续处于监听状态,继续接收其余客户端套接字的链接请求.
Socket为长链接:一般状况下Socket 链接就是 TCP 链接,所以 Socket 链接一旦创建,通信双方开始互发数据内容,直到双方断开链接。在实际应用中,因为网络节点过多,在传输过程当中,会被节点断开链接,所以要经过轮询高速网络,该节点处于活跃状态。
不少状况下,都是须要服务器端向客户端主动推送数据,保持客户端与服务端的实时同步。
若双方是 Socket 链接,能够由服务器直接向客户端发送数据。
若双方是 HTTP 链接,则服务器须要等客户端发送请求后,才能将数据回传给客户端。
所以,客户端定时向服务器端发送请求,不只能够保持在线,同时也询问服务器是否有新数据,若是有就将数据传给客户端。
一个完整的RPC架构里面包含了四个核心的组件,分别是Client,Server,Client Stub以及Server Stub,这个Stub你们能够理解为存根。分别说说这几个组件:
客户端(Client),服务的调用方。
服务端(Server),真正的服务提供者。
客户端存根,存放服务端的地址消息,再将客户端的请求参数打包成网络消息,而后经过网络远程发送给服务方。
服务端存根,接收客户端发送过来的消息,将消息解包,并调用本地的方法。
RPC主要是用在大型企业里面,由于大型企业里面系统繁多,业务线复杂,并且效率优点很是重要的一块,这个时候RPC的优点就比较明显了。实际的开发当中是这么作的,项目通常使用maven来管理。好比咱们有一个处理订单的系统服务,先声明它的全部的接口(这里就是具体指Java中的interface),而后将整个项目打包为一个jar包,服务端这边引入这个二方库,而后实现相应的功能,客户端这边也只须要引入这个二方库便可调用了。为何这么作?主要是为了减小客户端这边的jar包大小,由于每一次打包发布的时候,jar包太多老是会影响效率。另外也是将客户端和服务端解耦,提升代码的可移植性。
目前流行的开源RPC框架仍是比较多的。下面重点介绍三种:
gRPC是Google最近公布的开源软件,基于最新的HTTP2.0协议,并支持常见的众多编程语言。 咱们知道HTTP2.0是基于二进制的HTTP协议升级版本,目前各大浏览器都在马不停蹄的加以支持。 这个RPC框架是基于HTTP协议实现的,底层使用到了Netty框架的支持。
Thrift是Facebook的一个开源项目,主要是一个跨语言的服务开发框架。它有一个代码生成器来对它所定义的IDL定义文件自动生成服务代码框架。用户只要在其以前进行二次开发就行,对于底层的RPC通信等都是透明的。不过这个对于用户来讲的话须要学习特定领域语言这个特性,仍是有必定成本的。
Dubbo是阿里集团开源的一个极为出名的RPC框架,在不少互联网公司和企业应用中普遍使用。协议和序列化框架均可以插拔是及其鲜明的特点。一样的远程接口是基于Java Interface,而且依托于spring框架方便开发。能够方便的打包成单一文件,独立进程运行,和如今的微服务概念一致。