Java大佬详细讲解rpc框架实现原理
RPC框架是什么?
RPC,Remote Procedure Call,源码是源码一种远程进程间通信方式。它允许程序调用另一个地址空间(通常是源码共享网络的另一台机器上)的过程或函数,而无需程序员显式编码远程调用的源码细节。这使得无论是源码源码安装byacc调用本地接口/服务还是远程接口/服务,编写的源码调用代码基本相同。RPC会隐藏底层的源码通讯细节,避免直接处理Socket或Http通讯。源码
RPC使用请求响应模型。源码客户端发起请求,源码服务器返回响应,源码类似于Http的源码进口溯源码燕窝礼盒工作方式。
RPC的源码使用形式类似于调用本地函数(或方法)去调用远程的函数(或方法)。
哪些是源码常见的RPC框架?
国内早期开源的有Dubbo,由阿里巴巴公司于年开发并对外开源,仅支持Java语言。微博内部使用的有Motan,于年对外开源,仅支持Java语言。腾讯内部使用并对外开源的有Tars,于年,仅支持C++语言。国外的Spring Cloud,由Pivotal公司在年对外开源,彩虹化刷网源码仅支持Java语言。
跨语言平台的开源RPC框架有gRPC,由Google于年对外开源,支持多种语言。Thrift,最初由Facebook开发的内部系统跨语言的RPC框架,于年贡献给了Apache基金会,成为Apache开源项目之一,支持多种语言。hprose是一个MIT开源许可的新型轻量级跨语言跨平台的面向对象的高性能远程动态通讯中间件,支持众多语言,如nodeJs,初晴云社区系统源码 C++, .NET, Java, Delphi, Objective-C, ActionScript, JavaScript, ASP, PHP, Python, Ruby, Perl, Golang等。
RPC框架的实现原理
在RPC框架中,主要有三个角色:Provider、Consumer和Registry。
服务节点角色说明:
* Server:服务提供方。
* Client:服务消费方。
* Registry:服务注册与发现的注册中心。
RPC调用流程
一次完整的RPC调用流程(同步调用,异步另说)如下:
1) 客户端调用以本地调用方式调用服务。
2) client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体。
3) client stub找到服务地址,并将消息发送到服务端。成功阶梯副图源码
4) server stub收到消息后进行解码。
5) server stub根据解码结果调用本地的服务。
6) 本地服务执行并将结果返回给server stub。
7) server stub将返回结果打包成消息并发送至消费方。
8) client stub接收到消息,并进行解码。
9) 客户端得到最终结果。
使用到的技术
1、动态代理:生成 client stub和server stub需要用到 Java 动态代理技术。
2、序列化:为了能在网络上传输和接收 Java对象,需要进行序列化和反序列化操作。
序列化:将Java对象转换成byte[]的过程,也就是编码的过程。
反序列化:将byte[]转换成Java对象的过程。
可以使用Java原生的序列化机制,但效率非常低,推荐使用一些开源的、成熟的序列化技术,如protobuf、Thrift、hessian、Kryo、Msgpack。
关于序列化工具性能比较可参考:jvm-serializers。
3、NIO:当前很多RPC框架直接基于netty这一IO通信框架,推荐使用Netty作为底层通信框架。
4、服务注册中心:可选技术包括Redis、Zookeeper、Consul和Etcd。
hprose如何实现松散耦合的服务发布?
大部分的远程调用技术在服务发布上需要繁琐的步骤,常见的服务编写方式有:中间语言编译法:例如Corba和Ice,开发者需要先编写中间语言接口,再将其编译为服务器端代码,接着在结构代码中嵌入服务实现。这种方法依赖于特定的编译过程。
远程对象继承方式:如.NET Remoting,通过继承远程对象类来创建服务类,这种方式要求服务类必须符合特定的继承结构。
接口实现方式:比如.NET Remoting和RMI,开发者需先定义远程调用接口,然后实现该接口来构建服务。这同样限制了直接利用现有本地功能的可能性。
语言特性标记服务:WCF利用语言特性来标识服务方法,但同样限制了灵活性。
然而,Hprose提供了一种松散耦合的服务发布方式,显著区别于上述方法。Hprose允许直接将已有的本地函数、方法、对象或类发布为远程服务,无需进行任何代码改动,甚至包括某些语言内置的函数。这极大地简化了新服务的创建过程,同时对于现有系统的改造也异常便捷,无需为发布服务进行额外的编码或设计工作。扩展资料
Hprose (High Performance Remote Object Service Engine) 是一个MIT开源许可的新型轻量级跨语言跨平台的面向对象的高性能远程动态通讯中间件。它支持众多语言,例如nodeJs, C++, .NET, Java, Delphi, Objective-C, ActionScript, JavaScript, ASP, PHP, Python, Ruby, Perl 等语言,通过 Hprose 可以在这些语言之间实现方便且高效的互通。2024-12-29 08:55
2024-12-29 08:47
2024-12-29 08:08
2024-12-29 07:33
2024-12-29 07:24