基于TCP和HTTP协议的RPC简单实现

article/2025/9/19 4:22:06

一、RPC基本概念

1、基本概念

(1)RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议;

(2)RPC协议假定某些传输协议的存在,如TCP或HTTP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层;

(3)RPC使得开发包括网络分布式多程序在内的应用程序更加容易;

(4)RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行;

(5)随着系统业务的不断发展增长,对服务的压力逐渐增大,一方面可以通过硬件的方式提高系统的性能;另一方面,可以通过软件的方式来实现系统整体的性能。主流的解决方案,就是讲一个比较大的系统不断进行拆分,拆分为独立的服务系统,不同服务系统之间通过HTTP请求进行通信,或者其他协议进行通信。RPC就是不同系统之间相互通信交换数据服务的有利工具;

2、优势长处

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

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

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

3、远程过程调用流程图

这里写图片描述

上图是一张比较完整的远程控制调用流程图,客户进程作为服务的消费者,服务器进程作为服务的生产者,如下图所示:(当然客户端也可以作为服务生产者存在,这里只是简单说明问题)。

这里写图片描述

服务调用方发送RPC请求到服务的提供方,服务的提供方根据调用服务的参数和执行的方法进行返回结果,服务的调用方和服务的提供方之间传输的数据需要进行序列化和反序列化操作。

4、对象序列化和反序列化

(1)序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

(2)之所以要进行序列化,是因为在网络上进行传输的话,无论任何类型的数据,最终都需要转化为二进制流在网络上传输。

(3)数据的发送方需要将传输的对象转化为二进制流才能在网络上进行传输,这也就是序列化的过程;数据的接收方则需要将接受到的二进制流在恢复为对象,这个过程就是对象的反序列化的过程。

(4)序列化和反序列化总结:

这里写图片描述

(5)序列化和反序列化的方式有很多,常见的有使用Java本身内置的序列化方式、Hession、JSON、XML等。Java内置的可以直接使用Java提供的类不需要引用其他jar包,但是效率不是很高,下边是一张各种序列化空间和性能对比:

解析性能:

这里写图片描述

序列化之空间开销:

这里写图片描述

(6)基于Java内置的序列化和反序列化关键代码实现:

这里写图片描述

其他序列化和反序列化的方式也大致如此,基本思路是一样的。

二、基于TCP的RPC实现

1、基本思路

首先,远程控制调用RPC的本质还是底层的Scoket通信。对于简单的设计实现来说,其基本思路是:

1、服务的调用方Consumer通过Socket建立起与服务的提供方Provider的连接;
2、Consumer将需要调用的方法名称和参数通过Socket发送给Provider;
3、Provider获取Consumer请求的数据并进行解析,执行具体的某一个方法,构造返回数据,返回给Consumer;
4、Consumer获得Provider返回的数据进行相应的处理;

2、具体项目代码

这里写图片描述

具体代码如下:

(1)ConsumerDemo 代码:

/*** 服务消费者* Created by xuliugen on 2016/12/9.*/
public class ConsumerDemo {public static void main(String[] args) throws NoSuchMethodException, IOException, ClassNotFoundException {//获取服务提供者的接口名,一般RPC框架都是暴露服务提供者的接口定义String providerInterface = ProviderDemo.class.getName();//需要远程执行的方法,其实就是消费者调用生产者的方法Method method = ProviderDemo.class.getMethod("printMsg", java.lang.String.class);//需要传递的参数Object[] rpcArgs = {"Hello RPC!"};Socket consumer = new Socket("127.0.0.1", 8899);//将方法名称和参数 传递给服务生产者ObjectOutputStream output = new ObjectOutputStream(consumer.getOutputStream());output.writeUTF(providerInterface);output.writeUTF(method.getName());output.writeObject(method.getParameterTypes());output.writeObject(rpcArgs);//从生产者读取返回的结果ObjectInputStream input = new ObjectInputStream(consumer.getInputStream());Object result = input.readObject();System.out.println(result.toString());}
}

(2)ProviderDemo 代码如下:

/*** 服务提供者接口,用于暴露给服务消费者进行消费* Created by xuliugen on 2016/12/9.*/
public interface ProviderDemo {/*** 服务提供者打印Msg方法*/public String printMsg(String msg);
}

(3)ProviderDemoImpl代码如下:

/*** 服务提供者实现类* Created by xuliugen on 2016/12/9.*/
public class ProviderDemoImpl implements ProviderDemo {public String printMsg(String msg) {System.out.println("----" + msg + "----");return "Ni Hao " + msg;}
}

(4)ProviderServer代码如下:

/*** 生产者运行的服务器* Created by xuliugen on 2016/12/9.*/
public class ProviderServer {public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {//用于存放生产者服务接口的Map,实际的框架中会有专门保存服务提供者的Map<String, Object> serviceMap = new HashedMap();serviceMap.put(ProviderDemo.class.getName(), new ProviderDemoImpl());//服务器ServerSocket server = new ServerSocket(8899);while (true) {Socket socket = server.accept();ObjectInputStream input = new ObjectInputStream(socket.getInputStream());String interfaceName = input.readUTF(); //获取服务消费者需要消费服务的接口名String methodName = input.readUTF(); 获取服务消费者需要消费服务的方法名//参数的类型Class<?>[] parameterTypes = (Class<?>[]) input.readObject();//参数的对象Object[] rpcArgs = (Object[]) input.readObject();//执行调用过程Class providerInteface = Class.forName(interfaceName); //得到接口ClassObject provider = serviceMap.get(interfaceName);//取得服务实现的对象//获取需要执行的方法Method method = providerInteface.getMethod(methodName, parameterTypes);//通过反射进行调用Object result = method.invoke(provider, rpcArgs);//返回给客户端即服务消费者数据ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());output.writeObject(result);}}
}

(5)先开发服务器ProviderServer,然后执行ConsumerDemo,执行结果如下:

这里写图片描述

客户端执行一次请求,返回正确的结果。

这里写图片描述

上述显示了两条信息,这是因为服务器是while循环接受客户端请求的,共执行了两次。

上述过程完成了一个简单的RPC远程控制调用的案例,实际使用框架的时候,比这考虑的要多很多,这只是简单介绍一下思路。关于基于HTTP协议的RPC的简单实现其思想和TCP的一样,这里不再做过多说明。

博主使用最多的框架是Dubbo,服务的生产者将服务注册到注册中心,消费者向注册中心查找服务并获取服务生产者的信息,调用服务,详细请移步查看:Dubbo详细介绍与安装使用过程


参考文章:

1、百度百科RPC远程过程调用协议
2、序列化和反序列化
3、《大型分布式网站架构设计与实践–陈康贤 著》


http://chatgpt.dhexx.cn/article/X5coYHFT.shtml

相关文章

RPC协议及常用框架

https://www.jianshu.com/p/8ba4b7b834aa RPC协议 RPC:远程过程调用&#xff0c;原则上来说系统间跨进程的调用都属于RPC范畴 RMI/HTTP/dubbo/Spring Cloud/thrift RPC框架如何实现分布式环境下的远程调用 在一个典型的RPC的使用场景中&#xff0c;包含了服务发现&#xf…

【RPC】RPC基础(二)RPC协议

文章目录 RPC核心原理1. RPC基础1.2 RPC协议为什么设计RPC协议如何设计RPC协议可扩展协议的设计思考 RPC核心原理 1. RPC基础 1.2 RPC协议 RPC协议和HTTP协议一样都属于应用层协议 协议的作用&#xff1a; ​ 协议就像是文章中的标点符号、段落格式等规定&#xff0c;有了…

Nodejs 之 RPC 协议简介

背景 随着 Nodejs 的兴起&#xff0c;越来越多的 Web 服务中间层被搭建起来。如 Node 服务端渲染&#xff0c;BFF(Backend For Frontend))层&#xff0c;而 RPC 是远端过程调用&#xff0c;经常用于 BFF 层。最近&#xff0c;我打算写一个中间层&#xff0c;用 Nodejs 调用 Go…

RPC协议底层原理与实现

RPC协议基本组成 在一个典型RPC的使用场景中&#xff0c;包含了服务发现、负载、容错、 网络传输 、 序列化 等组件&#xff0c;其中RPC协议就指明了程序如何进行网络传输和序列化 。也就是说一个RPC协议的实现就等于一个非透明的RPC调用&#xff0c;如何做到的的呢&#xff1f…

RPC详解

RPC是什么 RPC&#xff08;Remote Procedure Call&#xff09;远程过程调用协议&#xff0c;一种通过网络从远程计算机上请求服务&#xff0c;而不需要了解底层网络技术的协议。RPC它假定某些协议的存在&#xff0c;例如TPC/UDP等&#xff0c;为通信程序之间携带信息数据。在O…

深入理解RPC—协议

协议 一提到协议&#xff0c;你最先想到的可能是 TCP 协议、UDP 协议等等&#xff0c;并且这些网络传输协议的实现有点晦涩难懂。虽然在 RPC 中我们也会用到这些协议&#xff0c;但这些协议更多的是对我们上层应用是透明的&#xff0c;我们 RPC 在使用过程中并不太需要关注他们…

浅谈RPC协议

RPC协议 RPC简介为啥需要RPCRPC的调用过程gRPCProtoBuffergRPC实战 RPC简介 RPC&#xff08;Remote Procedure Call Protocol&#xff09;远程过程调用协议&#xff0c;目标就是让远程服务调用更加简单、透明。RPC 框架负责屏蔽底层的传输方式&#xff08;TCP 或者 UDP&#x…

网络协议——RPC协议综述

拿最简单的场景&#xff0c;客户端调用一个加法函数&#xff0c;将两个整数加起来&#xff0c;返回它们的和。 如果放在本地调用&#xff0c;那是简单的不能再简单了&#xff0c;。但是一旦变成了远程调用&#xff0c;门槛一下子就上去了。 如何解决这五个问题&#xff1f; …

RPC(远程过程调用协议)简介

RPC框架解释 谁能用通俗的语言解释一下什么是 RPC 框架&#xff1f; - 远程过程调用协议RPC&#xff08;Remote Procedure Call Protocol) 首先了解什么叫RPC&#xff0c;为什么要RPC&#xff0c;RPC是指远程过程调用&#xff0c;也就是说两台服务器A&#xff0c;B&#xff0…

RPC和HTTP

一、为什么需要RPC&#xff0c;而不是简单的HTTP接口&#xff1f; RPC&#xff08;即Remote Procedure Call&#xff0c;远程过程调用&#xff09;&#xff0c;主要是基于TCP/IP协议&#xff1b;而HTTP服务主要是基于HTTP协议的。我们都知道HTTP协议是在传输层协议TCP之上的&a…

RPC入门总结(一)RPC定义和原理

转载&#xff1a;深入浅出 RPC - 浅出篇 转载&#xff1a;RPC框架与Dubbo完整使用 转载&#xff1a;深入浅出 RPC - 深入篇 转载&#xff1a;远程调用服务(RPC)和消息队列(Message Queue)对比及其适用/不适用场合分析 一、RPC 1. RPC是什么 RPC&#xff08;Remote Proced…

RPC协议与Http协议区别

RPC调用 RPC是远程过程调用&#xff08;Remote Procedure Call&#xff09;的缩写形式。SAP系统RPC调用的原理其实很简单&#xff0c;有一些类似于三层构架的C/S系统&#xff0c;第三方的客户程序通过接口调用SAP内部的标准或自定义函数&#xff0c;获得函数返回的数据进行处理…

RPC——RPC协议介绍及原理详解

common wx&#xff1a;CodingTechWork 介绍 RPC框架 概念 RPC&#xff08;Remote Procedure Call Protocol&#xff09; 远程过程调用协议。RPC是一种通过网络从远程计算机程序上请求服务&#xff0c;不需要了解底层网络技术的协议。RPC主要作用就是不同的服务间方法调用就…

RPC协议简述

RPC是指远程过程调用&#xff0c;也就是说两台服务器&#xff0c;一个应用部署在其中一台服务器上&#xff0c;想要调用另外一台服务器上应用提供的函数&#xff08;方法&#xff09;&#xff0c;由于不在一个内存空间&#xff0c;不能直接调用&#xff0c;需要通过网络来表达调…

一文带你搞懂HTTP和RPC协议的异同

1 什么是RPC协议 1.1 简介 这是老生常谈的协议了&#xff0c;RPC即远程过程调用&#xff08;Remote Procedure Call&#xff09;&#xff0c; RPC协议是一种通过网络从远程计算机程序上请求服务&#xff0c;而不需要了解底层网络技术的协议。 1.2 原理及模型 RPC协议广泛的…

关于RPC协议的通俗理解

根据网上搜索的一些资料摘抄汇总的&#xff0c;如果有误&#xff0c;欢迎斧正。 作者&#xff1a;肖继潮 链接&#xff1a;http://www.zhihu.com/question/25536695/answer/31046384 来源&#xff1a;知乎 著作权归作者所有&#xff0c;转载请联系作者获得授权。 早期单机时代&…

NLP之中文命名实体识别

在MUC-6中首次使用了命名实体&#xff08;named entity&#xff09;这一术语&#xff0c;由于当时关注的焦点是信息抽取&#xff08;information extraction&#xff09;问题&#xff0c;即从报章等非结构化文本中抽取关于公司活动和国防相关活动的结构化信息&#xff0c;而人名…

命名实体识别(biLSTM+crf)

本文是翻译的github这个项目的博客https://guillaumegenthial.github.io/sequence-tagging-with-tensorflow.html。 为什么要用biLSTM?为了使特征提取自动化。当使用CRF工具来进行命名实体识别时&#xff0c;需要自定义模板&#xff08;或者使用默认的模板&#xff09;。 任…

命名实体识别(NER)算法

文章目录 标注方案问题建模评价指标常用的NER方法深度学习方法&#xff08;in survey&#xff09;输入的分布式表示上下文编码解码器**先说MLPsoftmax和CRF**softmax 延伸至多标签解码 **RNN**Pointer Networks 实践Bert SoftmaxBert CRF 参考 之前做了NER的相关工作&#xf…

命名实体识别(NER):BiLSTM-CRF原理介绍+Pytorch_Tutorial代码解析

本文较全面的介绍了命名实体识别&#xff08;NER&#xff09;&#xff0c;包括NER定义、BiLSTM-CRF模型、Pytorch代码实现&#xff0c;未来将继续完善本文&#xff0c;以求涵盖NER众多方面。 文章目录 命名实体识别任务&#xff08;NER&#xff09;定义BiLSTM-CRF模型模型输入L…