当前位置: 首页 > 后端技术 > PHP

帮助phper了解RPC

时间:2023-03-30 03:35:05 PHP

1发生了什么。什么是rpc?RPC的全称是RemoteProcedureCall,翻译过来就是“远程过程调用”。目前主流平台都支持各种远程调用技术,以满足分布式系统架构下不同系统之间的远程通信和相互调用。远程调用的应用场景极其广泛,实现方式也是五花八门。2.从通信协议层面基于HTTP协议(如基于文本的SOAP(XML)、Rest(JSON)、基于二进制的Hessian(二进制))基于TCP协议(通常借助高性能网络Mina、Netty等框架)什么是RPC(RemoteProcedureCall)简单来说,RPC就是从一台机器(client)通过传递参数和得到返回的结果。RPC会隐藏底层通信细节(不需要直接处理Socket通信或Http通信)RPC是一种请求响应模型。客户端发起请求,服务器返回响应(类似于Http的工作方式)。RPC用于像调用本地函数(或方法)一样调用远程函数(或方法)。远程过程调用的发展历史ONCRPC(开放网络计算的远程过程调用)、OSFRPC(开放软件基金会的远程过程调用)CORBA(通用对象请求代理体系结构)DCOM(分布式组件对象模型)、COM+JavaRMI。NETRemotingXML-RPC、SOAP、WebServicePHPRPC、Hessian、JSON-RPC、MicrosoftWCF、WebAPIZeroCIce、Thrift、GRPCHproseEarlyRPC第一代RPC(ONCRPC、OSFRPC)不支持对象的传递。CORBA太复杂,各种实现不兼容,普通程序员玩不转。DCOM、COM+都逃不过Windows的魔掌。RMI只能用Java玩。.NETRemoting只能在.NET平台上玩。XML-RPC、SOAP、WebService冗余数据过多,处理速度过慢。RPC-styleWebService不跨语言,Document-styleWebService太难用了。WebService并没有解决用户真正的问题,它只是把一个问题变成了另一个问题。Web服务的规范非常复杂,以至于在.NET和Java平台之外没有真正好的实现,甚至没有可用的实现。跨语言、跨平台只是WebService的一个口号。虽然很多人相信这一点,但实际上并没有真正实现。PHPRPC基于PHP内置的序列化格式,在跨语言类型映射方面存在缺陷。通信依赖于HTTP协议,没有其他底层通信方式的选择。内置的加密传输既是一个特点也是一个缺点。虽然比基于XML的RPC快,但还不够快。Hessian二进制数据格式是完全不可读的。官方只提供了两种半语言的实现(Java、ActionScript和不太完善的Python实现),其他语言的第三方实现混杂。支持的语言不够多,web前端的JavaScript完全无视。虽然是动态RPC,但是动态性还是不好。虽然比基于XML的RPC快,但还不够快。JSON-RPCJSON是文本可读的,比XML更简洁。JSON受限于JavaScript语言的子集,无法表示足够多的数据类型。JSON格式不能表示数据中的自引用、交叉引用和循环引用。有些语言有多个版本的实现,但是类型映射没有统一的标准,存在兼容性问题。JSON-RPC虽然有规范,但是没有统一的实现。不同语言各自的实现存在兼容性问题,无法真正互通。MicrosoftWCF和WebAPI是微软对现有技术在.NET平台上的统一封装。它们是.NETRemoting、WebService和基于JSON和XML等数据格式的REST式服务等技术的集成。这些服务虽然号称可以在.NET平台外调用,但实际上与在.NET平台内调用是完全不同的。它不提供其他平台语言可用的任何工具。ZeroCIce,Thrift,GRPC原有RPC技术的跨语言面向对象回归。类型和接口定义仍然需要用中间语言来编写。您仍然需要一个代码生成器来将用中间语言编写的类型和接口定义翻译成您的编程语言的客户端和服务器的存根。你必须根据生成的服务器代码独立编写服务,并且不能将现有代码直接发布为服务。您必须使用生成的客户端代码来调用服务,没有其他更灵活的方法。如果您的中间代码被修??改,您必须至少重复上述所有步骤一次。Hprose无侵入式设计,无需单独定义类型,无需单独编写服务,现有代码可直接发布为服务。具有丰富的数据类型和完善的跨语言类型映射,支持自引用、互引用和循环引用数据。支持HTTP、TCP、Websocket等多种传输方式,客户端调用方式更加灵活,支持同步调用、异步调用、动态参数、可变参数、引用参数传递、多结果返回(Golang)等语言特性,而Hprose2.0甚至支持推送。具有良好的可扩展性,可以通过过滤器和中间件实现加密、压缩、缓存、代理等各种功能扩展。兼容无差异的跨语言调用支持更多通用语言和平台支持浏览器端跨域调用无中间语言,无学习成本卓越的性能,简单的RPC和Socket有什么区别?两者都是调用远程的方法,都是客户端/服务器模型。RPC(RemoteProcedureCall)使用客户端/服务器模型在两个进程之间进行通信。Socket是RPC经常使用的通信方式之一。RPC是在Socket的基础上实现的,需要比Socket更多的网络和系统资源。除了Socket,RPC还有其他的通信方式,如:http、操作系统自带的管道等技术实现对远程程序的调用。在微软的Windows系统中,RPC使用命名管道进行通信。RPC和REST有什么区别?了解RPC后,我们知道RPC是client/server模式,调用远程方法。REST也是我们熟悉的一套API调用协议方法。它也是基于客户端/服务器模式并调用远程方法。两者有什么区别?RESTAPI和RPC都在服务端将函数封装成接口,暴露给客户端调用。但是,RESTAPI是基于HTTP协议的。REST致力于通过http协议中的POST/GET/PUT/DELETE等方法和人类可读的URL来服务于http请求。另一方面,RPC可能不基于HTTP协议。因此,如果两种后端语言互相调用的话,使用RPC可以达到更好的性能(省去了HTTP头等一系列东西),而且应该更容易配置。如果前端通过AJAX调用后端的话,还是用RESTAPI比较好(因为无论如何都绕不开HTTP的坎)。1、HTTP和RPC是一个级别,还是被RPC包含?2、Restful也属于RPC吗?上图是一个比较完整的关系图。这时我们发现HTTP(图中蓝色方框)出现了两次。其中一种与RPC并行,是一种跨应用调用方法的解决方案;另一种是RPC包含的,是RPC通信过程的可选协议之一。因此,第一个问题的答案是两者兼而有之。查看它指的是哪个蓝色框。从题主的提问来看,题主既然纠结于两者,应该指的是与RPC并列的蓝框。第二个问题是询问远程过程调用(红框)是否包含Restful(黄框)。这种理解的关键在于对RPC的理解。RPC从字面上理解为远程过程调用,即在一个应用程序中调用另一个应用程序的方法。那么Restful就满足了,通过它可以在一个应用中调用另一个应用的方法。但是,以上理解使得RPC的定义过于宽泛。RPC通常是指在一个应用中通过调用另一个应用的接口实现的远程调用,也就是红框所指的范围。这样RPC就不包括Restful了。所以第二个问题的答案是Restful不属于RPC,除非对RPC有非常规的广义理解。RPC的英文全称是RemoteProcedureCall,中文翻译为“远程过程调用”。略显晦涩的其实就是“过程”,过程其实就是方法。因此,RPC可以理解为“远程方法调用”。要了解远程过程调用,首先要了解过程调用。很简单,如下图,就是调用一个方法。这太常见了,无法解释太多。在分布式系统中,由于每个服务的边界很小,很可能调用其他服务提供的方法。这就产生了服务A需要调用服务B中的方法,即远程过程调用。如果想让服务A调用服务B中的方法,首先想到的就是通过HTTP请求来实现。是的,这个很常见,比如服务B暴露了一个Restful接口,然后让服务A调用它的接口。基于Restful的调用方式非常好,因为可读性好(服务B暴露了Restful接口,当然可读性好)而且HTTP请求可以穿越各种防火墙,所以非常好。但是,如前所述,基于Restful的远程过程调用有明显的缺点,主要是效率低下和调用封装复杂。当存在大量服务间调用时,这些缺点变得更加明显。服务A调用服务B的过程是应用之间的内部过程,宜牺牲可读性来提高效率和易用性。基于这种思想,RPC诞生了。通过hprose实现rpcHPROSE是HighPerformanceRemoteObjectServiceEngine的简称,中文翻译为“高性能远程对象服务引擎”。是一种先进的轻量级跨语言跨平台面向对象的高性能远程动态通信中间件。它不仅易于使用,而且功能强大。您只需要一点时间学习,就可以用它轻松搭建一个跨语言、跨平台的分布式应用系统。Hprose支持多种流行的编程语言,例如:AAutoQuickerActionScriptASPC++Delphi/FreePascaldotNET(C#,VisualBasic...)GolangJavaJavaScriptNode.jsObjective-CPerlPHPPythonRuby通过Hprose,您可以轻松高效地实现这些语言之间的互通。基本实现在同一个文件夹下,执行以下操作,分别是拉取和构建命令,创建两个文件,执行php文件。拉取hprose组件composerrequirehprose/hprose建立server.phpsetErrorTypes(E_ALL);$server->setDebugEnabled();$server->addFunction('hello');$server->start();建立client.phpfullDuplex=true;Futureco(function()使用($test){try{var_dump((yield$test->hello("yieldworld1")));var_dump((yield$test->hello("yieldworld2")));var_dump((yield$test->hello("yieldworld3")));var_dump((yield$test->hello("yieldworld4")));var_dump((yield$test->hello("yieldworld5")));var_dump((yield$test->hello("yieldworld6")));}catch(Exception$e){echo($e);}});执行phpserver.phpphpclient.php结果string(19)"Helloyieldworld1!"string(19)"Helloyieldworld2!"string(19)"Helloyieldworld3!"string(19)"Helloyieldworld4!"string(19)"Helloyieldworld5!"string(19)"Helloyieldworld6!"继续学习:HproseforPHPUser手册本文节选自:https://www.kancloud.cn/marti...