什么是RPC,RPC原理是什么?

什么是RPC?

RPC(Remote Procedure Call)远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。比如两个不同的服务A、B部署在两台不同的机器上,那么服务A如果想要嗲用服务B中的某个方法该怎么办呢?使用Http请求当然可以,但是可能会比较慢而且一些优化做的并不好。RPC的出现就是为了解决这个问题。

RPC原理是什么?

1、服务消费方(client)调用以本地调用方式调用服务;

2、client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;

3、client stub找不到服务地址,并将消息发送到服务端;

4、server stub收到消息后进行解码;

5、server stub根据解码结果调用本地的服务;

6、本地服务执行并将结果返回给server stub;

7、server stub将返回结果打包成消息并发送至消费方;

8、client stub接收到消息,并进行解码;

9、服务消费方得到最终结果。

时序图如下:

 RPC解决了什么问题?

从上面对RPC介绍的内容中,概括来讲,RPC主要解决了:让分布式或者微服务系统中不同服务之间像本地调用一样简单。

常见的RPC框架总结

RMI(JDK自带):JDK自带的RPC,有很多局限性,不推荐使用。

Dubbo:Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成,目前Dubbo已经成为Spring Cloud Alibaba中的官方组件。

gRPC:gRPC是可以在任何环境中运行的现代开源高性能RPC框架,他可以通过插拔的支持来有效的链接数据中心内和跨数据中心的服务,以实现负载均衡,跟踪,运行情况检查和身份验证。它也适用于分布式计算的最后一英里,以将设备,移动应用程序和浏览器连接到后端服务。

Hessian:Hessian是一个轻量级的remotingonhttp工具,使用简单的方法提供了RMI的功能,相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。

Thrift:Apache Thrift是Facebook开源的跨语言的RPC通信框架,目前已经捐献给Apache基金会管理,由于其跨语言特性和出色的性能,在很多互联网公司得到应用,有能力的公司甚至会基于thrift研发一套分布式服务框架,增加诸如服务注册、服务发现等功能。

既然有Http,为啥用RPC进行服务调用?

RPC只是一种设计而已

RPC只是一种概念,一种设计,就是为了解决不同服务之间的调用问题,它一般会包含传输协议和序列化协议这两个。

实现RPC的可以传输协议可以直接建立在TCP之上,也可以建立在HTTP协议之上,大部分RPC框架都是使用的TCP链接(gRPC使用了HTTP2).

Http和TCP

可能现在很多对计算机网络不太熟悉的朋友已经被搞蒙了,要想真正搞懂,还需要简单复习一下计算机网络基础知识:

我们通常说的计算机网络的五层协议的体系结构是指:应用层、传输层、网络层、数据链路层、物理层。

应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。Http属于应用层协议,他会基于TCP/IP通信协议来传输数据(Html文件、图片、查询结果等)。Http协议工作于客户端-服务端框架之上。浏览器作为Http客户端通过URL向Http服务端即Web服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息,Http协议建立在TCP协议之上。

传输层(transport layer)的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。TCP是传输层协议,主要解决数据如何在网络中传输。相比于UDP、TCP提供的是面向链接的、可靠的数据传输服务。

主要关键就在于Http使用的TCP协议,和我们自定义的TCP协议在报文上的区别。

http1.1协议的TCP报文包含太多在传输过程中可能无用的信息:

使用自定义TCP协议进行传输就会避免上面这个问题,极大的减轻了传输数据的开销。这也就是为什么通常会采用自定义TCP协议的RPC来进行服务调用的真正原因。除此之外,成熟的RPC框架还提供好了“服务自动注册于发现”、“智能负载均衡”、“可视化的服务治理和运维”、“运行期流量调度”等等功能,这些也算是选择RPC进行服务注册和发现的一方面原因吧。

一个常见的错误观点

很多文章中还会提到说Http协议相较于自定义TCP报文协议,增加的开销在于链接的建立与断开,但是这个观点已经被否认,下面截取自某乎中的一个回答:

浅谈RPC与Http的更多相关文章

  1. 浅谈RPC调用

    RPC英文全称remote procedure call 翻译成中文的意思就是远程过程调用.RPC的出现其实主要是为了解决分布式系统间的通信透明性的问题. 那什么是分布式系统的通信透明性问题?这个问题 ...

  2. 浅谈RPC框架

    RPC(Remote Promote Call) RPC(Remote Promote Call):一种进程间通信方式.允许像调用本地服务一样调用远程服务. RPC框架的主要目标就是让远程服务调用更简 ...

  3. 浅谈WebService的版本兼容性设计

    在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...

  4. TODO:浅谈pm2基本工作原理

    TODO:浅谈pm2基本工作原理 要谈Node.js pm2的工作原理,需要先来了解撒旦(Satan)和上帝(God)的关系. 撒旦(Satan),主要指<圣经>中的堕天使(也称堕天使撒旦 ...

  5. 浅谈测试rhel7新功能时的感受及遇到的问题【转载】

    半夜起来看世界杯,没啥激情,但是又怕错误意大利和英格兰的比赛,就看了rhel7 相关新功能的介绍. rhel7的下载地址: https://access.redhat.com/site/downloa ...

  6. Web Service进阶(七)浅谈SOAP Webservice和RESTful Webservice

    浅谈SOAP Webservice和RESTful Webservice REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性.RE ...

  7. 【转】浅谈.net remoting 与webservice

    1. .NET Remoting .NET Remoting是微软随.NET推出的一种分布式应用解决方案,被誉为管理应用程序域之间的 RPC 的首选技,它允许不同应用程序域之间进行通信(这里的通信可以 ...

  8. 浅谈REST API

    浅谈REST API 说明: 本文部分内容根据其它网络文章编写,如有版权问题请及时通知. 背景 发迹于互联网的REST,在国内国外混得可谓是风生水起,如今又进入电信行业的视野,连TMF都将其作为战略项 ...

  9. 朱晔的互联网架构实践心得S2E6:浅谈高并发架构设计的16招

    朱晔的互联网架构实践心得S2E6:浅谈高并发架构设计的16招 概览 标题中的高并发架构设计是指设计一套比较合适的架构来应对请求.并发量很大的系统,使系统的稳定性.响应时间符合预期并且能在极端的情况下自 ...

随机推荐

  1. 一,kubeadm初始化k8s集群

    docker安装 wget    https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo yum inst ...

  2. 鸡汤 & 毒鸡汤

    1.别低估任何人. 2.你没那么多观众,别那么累. 3.温和对人对事.不要随意发脾气,谁都不欠你的. 4.现在很痛苦,等过阵子回头看看,会发现其实那都不算事. 5.和对自己有恶意的人绝交.人有绝交,才 ...

  3. ASP.net MVC 构建layui管理后台(构造基础仓储)<1>

    本文章为ASP.net MVC 构建layui管理后台,第一篇. 使用EF+ado.net 实体数据模型模式进行底层的数据库连接. 在项目添加一个类库Model 在类库Model上添加一个ado.ne ...

  4. What is the difference between shades and shadows?

    Shade is the darkness of an object not in direct light, while shadows are the silhouette of an objec ...

  5. File的获取功能(新手)

    //导入包.import java.io.File;/*File的获取功能*///创建的一个类.public class zylx2 { //公共静态的主方法. public static void ...

  6. C 2015年真题

    1.写出程序输出结果 void main() { char p[10]="abc"; char q[]="xyz"; int i,j; i=0; while(* ...

  7. fastjson JSONObject.toJSONString 出现 $ref: "$."的解决办法(重复引用)

    首先,fastjson作为一款序列化引擎,不可避免的会遇到循环引用的问题,为了避免StackOverflowError异常,fastjson会对引用进行检测. 如果检测到存在重复/循环引用的情况,fa ...

  8. [剑指offer]14-1.剪绳子

    14-1.剪绳子 方法一 动态规划 思路:递归式为f(n)=max(f(i), f(n-i)),i=1,2,...,n-1 虽然我现在也没有彻底明白这个递归式是怎么来的,但用的时候还是要注意一下.f( ...

  9. 图解Java设计模式之模板模式

    图解Java设计模式之模板模式 豆浆制作问题 模板方法模式基本介绍 模板方法模式原理类图 模板方法模式解决豆浆制作问题 模板方法模式的钩子方法 模板方法模式在Spring框架中的源码分析 模板方法模式 ...

  10. drf认证源码分析

    补充: 一.django中间件之路由斜杠的自动添加源码 其实我们每次在写路由的时候,如果在路由层给他设置的是加/,但实际上我们在浏览器中输入的时候并没有加/发现也能调用,前面说了是浏览器内部走了重定向 ...