手写RPC框架

文章目录

    • 什么是RPC框架
    • RPC框架中的关键点
      • 通信协议
      • 序列化协议
      • 动态代理和反射
    • 目前已有的RPC框架
    • 手写RPC框架介绍
      • 项目框架
      • 项目执行流程
      • 项目启动

什么是RPC框架

RPC(Remote Procedure Call,远程过程调用), 简单来说遵循RPC协议的就是RPC框架.

那RCP协议是什么呢?
RPC协议是一种用于实现远程通信的协议,允许一个计算机程序在另一个地址空间(通常是在另一台计算机上或另一个服务上)执行程序或函数,就像本地调用一样。
在远程调用过程中,开发者无需显示处理网络细节, 底层的通讯对于客户端来说、对于开发者来说是无感的.

RPC 框架使分布式系统的开发更加容易,它隐藏了网络通信的细节,使开发者能够专注于业务逻辑,就像调用本地函数一样调用远程服务。

RPC框架中的关键点

手写RPC框架_第1张图片

通信协议

远程过程调用底层一定是网络通信, 那通信就必然需要通信协议, HTTP和TCP等都可以选择作为RPC的通信协议.

序列化协议

在网络通信中, 数据以二进制形式传输的, 也就是字节流, 但是在我们的Java程序中, 一定是以Java对象进行使用的, 所以这里必然有一个转换过程.就是在发送的时候将Java对象,转成字节流, 在接收的时候,将字节流转成Java对象, 这个转换过程的一个规范,规定就是序列化协议.

常见的序列化协议有JSON、Protocol Buffers、Thrift、Hessian. 比如SpringCloud一般使用JSON, 而Dubbo则默认使用Hessian.

动态代理和反射

客户端:
我们在客户端调用某个方法时,自己并没有操作, 但是却可以在底层执行网络通信这些, 一定是代理对象在帮我们做这些事情, 所以在客户端一定是需要动态代理的.

服务端:
服务端在收到请求时, 请求中会携带类名、方法名、方法参数等, 那这个时候就需要真正调用对应的方法, 就会用到反射.

目前已有的RPC框架

目前一些常见的 RPC 框架包括 gRPC、Apache Thrift、Apache Dubbo、CORBA(Common Object Request Broker Architecture)等。

这些框架提供不同的特性和支持不同的编程语言,但它们的核心目标是相同的:简化远程服务调用并提供高效的通信机制

RPC框架 开发方 序列化协议 通信协议 特点
gRPC Google 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框架.
其实就是实现了这个过程.
手写RPC框架_第2张图片

这个简单的手写框架主要目的是让大家能够彻底理解RPC框架底层原理,所以这个项目使用了Java中默认的序列化协议+NIO模型+TCP协议+动态代理+反射实现了RPC调用.

完整项目代码我放在了github上,有需要可以自取->rpc框架代码
同时也在CSDN放了一份->rpc框架代码

项目框架

这个项目由四部分组成.各个模块介绍以及依赖关系如下:

手写RPC框架_第3张图片

项目执行流程

本项目以 IHelloService 接口中的hello方法为例, 说明项目中每个类的具体功能和执行流程.

手写RPC框架_第4张图片

项目启动

  1. 启动服务端
    执行rpc-server-provider模块下的App.class类.
  2. 启动客户端
    执行rpc-client模块下的App.class类

结果现象

在客户端调用hello方法,传入参数hello.

手写RPC框架_第5张图片

IHelloService.hello方法本身并没有实现, 通过rpc调用能够执行服务端的方法,返回拼接后的字符串, 即代表执行成功.

手写RPC框架_第6张图片

手写RPC框架_第7张图片

今天的分享就到这里了,有问题可以在评论区留言,均会及时回复呀.
我是bling,未来不会太差,只要我们不要太懒就行, 咱们下期见.
在这里插入图片描述

你可能感兴趣的:(分布式微服务,rpc,网络协议,网络)