RPC(Remote Procedure Call,远程过程调用), 简单来说遵循RPC协议的就是RPC框架.
那RCP协议是什么呢?
RPC协议是一种用于实现远程通信的协议,允许一个计算机程序在另一个地址空间(通常是在另一台计算机上或另一个服务上)执行程序或函数,就像本地调用一样。
在远程调用过程中,开发者无需显示处理网络细节, 底层的通讯对于客户端来说、对于开发者来说是无感的.
RPC 框架使分布式系统的开发更加容易,它隐藏了网络通信的细节,使开发者能够专注于业务逻辑,就像调用本地函数一样调用远程服务。
远程过程调用底层一定是网络通信, 那通信就必然需要通信协议, HTTP和TCP等都可以选择作为RPC的通信协议.
在网络通信中, 数据以二进制形式传输的, 也就是字节流, 但是在我们的Java程序中, 一定是以Java对象进行使用的, 所以这里必然有一个转换过程.就是在发送的时候将Java对象,转成字节流, 在接收的时候,将字节流转成Java对象, 这个转换过程的一个规范,规定就是序列化协议.
常见的序列化协议有JSON、Protocol Buffers、Thrift、Hessian. 比如SpringCloud一般使用JSON, 而Dubbo则默认使用Hessian.
客户端:
我们在客户端调用某个方法时,自己并没有操作, 但是却可以在底层执行网络通信这些, 一定是代理对象在帮我们做这些事情, 所以在客户端一定是需要动态代理的.
服务端:
服务端在收到请求时, 请求中会携带类名、方法名、方法参数等, 那这个时候就需要真正调用对应的方法, 就会用到反射.
目前一些常见的 RPC 框架包括 gRPC、Apache Thrift、Apache Dubbo、CORBA(Common Object Request Broker Architecture)等。
这些框架提供不同的特性和支持不同的编程语言,但它们的核心目标是相同的:简化远程服务调用并提供高效的通信机制
RPC框架 | 开发方 | 序列化协议 | 通信协议 | 特点 |
---|---|---|---|---|
gRPC | Protocol Buffers | 基于HTTP/2 | 高效的跨语言RPC框架,基于HTTP/2,使用Protocol Buffers,支持双向流式通信。 | |
Apache Dubbo | Apache | Hessian | 自定义Dubbo协议 | 面向Java的高性能RPC框架,支持分布式架构和服务治理,具有负载均衡、集群容错等功能。 |
Apache Thrift | Apache | 自定义二进制协议 | 自定义通信协议 | 多语言支持,用于构建高效且可扩展的服务,可支持跨语言的RPC框架。 |
Spring Cloud Netflix中的Feign | Spring | JSON/XML等 | 基于HTTP等 | 基于Spring Cloud的微服务框架,Feign为声明式Web服务客户端,支持负载均衡和容错特性。 |
Tars RPC | 腾讯 | Tars协议 | 自定义Tars协议 | 由腾讯开发,用于支持分布式系统的高性能RPC框架,提供了丰富的功能和工具,适用于大规模的分布式应用程序。 |
在清楚了RPC框架中的关键点之后, 这里就手写了一个简单的RPC框架.
其实就是实现了这个过程.
这个简单的手写框架主要目的是让大家能够彻底理解RPC框架底层原理,所以这个项目使用了Java中默认的序列化协议+NIO模型+TCP协议+动态代理+反射实现了RPC调用.
完整项目代码我放在了github上,有需要可以自取->rpc框架代码
同时也在CSDN放了一份->rpc框架代码
这个项目由四部分组成.各个模块介绍以及依赖关系如下:
本项目以 IHelloService 接口中的hello方法为例, 说明项目中每个类的具体功能和执行流程.
结果现象
在客户端调用hello方法,传入参数hello.
IHelloService.hello方法本身并没有实现, 通过rpc调用能够执行服务端的方法,返回拼接后的字符串, 即代表执行成功.
今天的分享就到这里了,有问题可以在评论区留言,均会及时回复呀.
我是bling,未来不会太差,只要我们不要太懒就行, 咱们下期见.