网站首页 > 技术文章 正文
在微服务架构中,使用RPC(Remote Procedure Call)进行服务之间的交互是我们通常采用的一种集成方式,与REST方式的请求调用模式相比,RPC具有更强的契约规范(Schema),同时相比REST方式也有更好的性能优势。
RPC框架概述
RPC是一种进程间通信方式,可以像调用本地服务一样调用远程服务。RPC的核心并不在于使用什么协议,RPC的主要目标是让远程服务调用更简单、透明,让远程方法调用如本地调用一样方便,我们并不需要知道这个调用的方法所部署的网络位置。
RPC通信过程
RPC主要用到了动态代理模式。RPC框架负责屏蔽底层的传输方式(TCP或者UDP)、序列化方式(XML、JSON、二进制)和通信细节。开发人员在使用的时候只需要了解谁在什么位置提供了什么样的远程服务接口即可,并不需要关心底层通信细节和调用过程,如下图所示。
● 远程提供者需要以某种形式提供服务调用相关的信息,包括但不限于服务接口定义、数据结构、中间态的服务定义文件。
例如Facebook的Thrift的IDL文件,Web Service的WSDL文件,服务的调用者需要通过一定的途径获取远程服务调用相关的信息。
● 远程代理对象:远程代理对象是为一个对象在不同地址空间提供的局部代表,它可以将一个对象隐藏于不同地址空间。
● 通信:RPC框架与具体的协议无关。
● 序列化:毕竟是远程通信,需要将对象转化成二进制流进行传输。不同的RPC框架应用的场景不同,在序列化上也会采用不同的技术。
RPC和REST对比RPC和REST在请求模式上都属于点对点的请求/响应模式。REST是一种设计风格,它的很多思维方式与RPC是相互冲突的。RPC的思想是把本地函数映射到API,也就是说一个API对应的是一个函数方法(Function)。例如本地有一个getAllUsers方法,能通过某种约定的协议来远程调用这个getAllUsers方法,至于这个协议是Socket、HTTP还是其他协议并不重要,RPC中的主体是动作,强调互操作性。而REST则不然,它的URL链接主体是资源,REST强调远端的资源访问,而且REST大多数基于HTTP完成,规定了使用HTTP Method表达本次要做的动作,类型一般也不超过四五种。这些动作表达了对资源仅有的几种转化方式。
RPC最大的劣势是“紧耦合”,RPC客户端以多种方式与服务实现紧密耦合,它很难在不中断客户端的情况下更改服务实现。所以RPC的集成交互方式更偏向内部调用,而REST更偏向外部调用。Web服务应该算RPC的一个子集,理论上RPC能实现的功能用Web服务也能实现,甚至很多RPC框架选用HTTP作为传输层。
我们讨论RPC和Web的区别,主要关注两个因素:序列化协议和传输协议。序列化协议比如常见的XML,以及JSON和比较现代的ProtocolBuffers、Thrift。传输协议比如TCP、UDP,以及更高层的HTTP 1.1、HTTP 2.0。
一般我们用RPC而不是HTTP构建自己的服务,通常考虑下面的因素:
● 接口是否需要Schema约束。
● 是否需要更高效的传输协议(TCP、HTTP 2.0)。
● 是否对性能、数据包的大小非常敏感。
HTTP是基于文本的协议,头部需要提供多冗余(对于RPC服务而言)的协议头信息。HTTP中我们用得最多就是RESTful框架,而RESTful框架本质上基于弱Schema约束协议。对于RPC方式的调用来说,Thrift这种序列化协议的优势在于有非常严格的IDL(交互规范约束Schema)的存在,可以保证服务端接收的参数和Schema保持一致。
RPC与Web Service对比Web Service是在RPC的基础上发展而来的。它可以使用开放的XML来描述、发布、发现、协调和配置这些应用程序,它可以用于开发分布式交互操作的应用程序。而RPC使用C/S方式发送请求到服务器,等待服务器返回结果。
Web Service提供的服务是基于Web容器的,底层使用HTTP,类似于一个远程的服务提供者。比如天气预报服务,对各地客户端提供天气预报,是一种请求应答机制,是跨系统、跨平台的。
RPC与RMI的对比
RMI只用于Java中以客户端的存根对象(Stub)作为远程接口进行远程方法的调用。每个远程方法都具有方法签名。如果一个方法在服务器上执行,但是没有匹配的签名被添加到这个远程接口(Stub)上,那么这个新添加的方法就不能被RMI客户端所调用。
RPC是网络服务协议,与操作系统和语言无关,RPC通过网络服务协议向远程主机发送请求,请求包含一个参数集和一个文本值,通常形成“classname.methodname(参数集)”的形式。RPC远程主机会去搜索与之相匹配的类和方法,找到后就执行方法并把结果编码,再通过网络协议发回。
本文给大家讲解的内容是RPC远程过程调用,RPC框架概述
- 下篇文章给大家讲解的内容是RPC远程过程调用,主流RPC通信框架
- 觉得文章不错的朋友可以转发此文关注小编;
- 感谢大家的支持!
猜你喜欢
- 2024-09-30 SpringCloud 远程调用为啥要采用HTTP,而不是RPC?
- 2024-09-30 PRA10.3平台API接口调用 api接口调用教程
- 2024-09-30 Spring Cloud Gateway一次请求调用源码解析
- 2024-09-30 Go教程34:Go微服务间Http+Json调用
- 2024-09-30 接口测试:A13_HttpRunner_hook_01_钩子机制及用例层面的调用
- 2024-09-30 Spring 框架里的 HTTP 调用,RestTemplate 还是 WebClient
- 2024-09-30 HarmonyOS如何调用http/https接口?
- 2024-09-30 Feign : 优雅的调用 API 调用feign接口
- 2024-09-30 Spring Boot调用http接口的简单方法
- 2024-09-30 远程调用中,rpc到底比http好在哪里
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- mybatis返回int (51)
- jsonproperty注解无效 (52)
- jtextfield (48)
- flaskrequest.data (53)
- preflight请求 (48)
- request.getheader (57)
- pomexclusion (55)
- javassh连接远程服务器 (80)
- java-jar输出日志 (71)
- mybatis.type-aliases-package (63)
- arraystoreexception (56)
- 线程池submit (67)
- sshshell (49)
- vue2props (57)
- 微信小程序form表单提交 (55)
- javabase64转图片 (55)
- javaobject转map (74)
- java接口文档生成工具 (49)
- tcpflags (59)
- 虚拟机共享文件夹在哪 (60)
- shiro设置session过期时间 (61)
- python-msimpleserver (48)
- map转list对象 (50)
- resttemplate文件上传 (57)
- networkmanager是什么服务 (69)
本文暂时没有评论,来添加一个吧(●'◡'●)