当前位置: 首页 > article >正文

手写RPC框架

文章目录

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

什么是RPC框架

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

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

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

RPC框架中的关键点

在这里插入图片描述

通信协议

远程过程调用底层一定是网络通信, 那通信就必然需要通信协议, 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框架开发方序列化协议通信协议特点
gRPCGoogleProtocol Buffers基于HTTP/2高效的跨语言RPC框架,基于HTTP/2,使用Protocol Buffers,支持双向流式通信。
Apache DubboApacheHessian自定义Dubbo协议面向Java的高性能RPC框架,支持分布式架构和服务治理,具有负载均衡、集群容错等功能。
Apache ThriftApache自定义二进制协议自定义通信协议多语言支持,用于构建高效且可扩展的服务,可支持跨语言的RPC框架。
Spring Cloud Netflix中的FeignSpringJSON/XML等基于HTTP等基于Spring Cloud的微服务框架,Feign为声明式Web服务客户端,支持负载均衡和容错特性。
Tars RPC腾讯Tars协议自定义Tars协议由腾讯开发,用于支持分布式系统的高性能RPC框架,提供了丰富的功能和工具,适用于大规模的分布式应用程序。

手写RPC框架介绍

在清楚了RPC框架中的关键点之后, 这里就手写了一个简单的RPC框架.
其实就是实现了这个过程.
在这里插入图片描述

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

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

项目框架

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

在这里插入图片描述

项目执行流程

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

在这里插入图片描述

项目启动

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

结果现象

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

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

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


http://www.kler.cn/a/108119.html

相关文章:

  • 11Java面向对象高级(篇2,Java程序的核心套路!!!!)
  • 在C++上实现反射用法
  • NVIDIA NIM 简介
  • Android 进入浏览器下载应用,下载的是bin文件无法安装,应为apk文件
  • Labelme标注数据的一些操作
  • Ubuntu 20.04安装CUDA 11.0、cuDNN 8.0.5
  • 网络安全(黑客)—小白自学
  • JavaScript的字符串介绍
  • Python 编写 Flink 应用程序经验记录(Flink1.17.1)
  • LuatOS-SOC接口文档(air780E)--max30102 - 心率模块
  • Geeker-Admin中ProTable表格分页之自定义接口页码、尺寸参数
  • MySQL -- 表的约束
  • Python通过ldap3操作LDAP账号
  • Java零基础入门-位运算符
  • How to install mongodb-7.0 as systemd service with podman
  • JVM面试知识点整理
  • PG数据库基本使用
  • 从Mysql架构看一条查询sql的执行过程
  • use renv with this project create a git repository
  • 分类预测 | MATLAB实现SSA-CNN-BiGRU麻雀算法优化卷积双向门控循环单元数据分类预测
  • 【软件安装环境配置】vscode 安装界面没有出现安装路径的选择 的解决,以及vscode的删除的问题
  • 【算法|动态规划No.32 | 完全背包问题】完全背包模板题
  • DAY05 循环嵌套+函数的笔记整理
  • 前端 : 用HTML ,CSS ,JS 做一个点名器
  • 【知识串联】概率论中的值和量(随机变量/数字特征/参数估计)【考研向】【按概率论学习章节总结】(最大似然估计量和最大似然估计值的区别)
  • C++之左值、右值、std::forward、std::move总结(二百五十)