手写RPC框架

news2024/11/24 21:00:09

文章目录

    • 什么是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.coloradmin.cn/o/1144803.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

编程实例:洗车店会员管理系统软件一卡多项目管理编程

编程实例:洗车店会员管理系统软件一卡多项目管理编程 编程系统化课程总目录及明细,点击进入了解详情。 https://blog.csdn.net/qq_29129627/article/details/134073098?spm1001.2014.3001.5502 1、会员可以直接用手机号,并可以绑定车牌号 2…

进阶JAVA篇- Java 综合基本语法实践(习题一)

路漫漫其修远兮,吾将上下而求索。—— 屈原 目录 第一道题:集合的灵活运用 第二道题:基础编程能力 第三道题: 手写 ArrayList 集合(模拟实现 ArrayList 核心API) 第四道题:二分查找的应用 第五道…

设置Oracle数据库默认为spfle启动,并且设置数据库SGA大小和PGA大小

本次目标:设置数据库默认为spfle启动,并且数据库SGA大小为2G,PGA大小为200M 1、环境检查 Oracle 9i以后启动的时候默认使用的初始化文件是spfile,但是为了万一还是进行查看一下 首先,确认您的数据库当前是否使用pfi…

事件循环的学习、执行上文、this、执行栈和任务队列

事件循环 对于js运行中的任务,js有一套处理收集,排队,执行的特殊机制,我们称之为事件循环(Even Loop). 🍕js一大特点就是单线程,同一个时间只能做一件事。为了协调事件、用户交互、脚本、UI渲染和网络处理…

FPGA_状态机工作原理

FPGA_状态机介绍和工作原理 状态机工作原理Mealy 状态机模型Moore 状态机模型状态机描述方式代码格式 总结 状态机工作原理 状态机全称是有限状态机(Finite State Machine、FSM),是表示有限个状态以及在这些状态之间的转移和动作等行为的数学…

2023年正版win10/win11系统安装教学(纯净版)

第一步:准备一个8G容量以上的U盘。 注意,在制作系统盘时会格式化U盘,所以最好准备个空U盘,防止资料丢失。 第二步:制作系统盘。 安装win10 进入windows官网 官网win10下载地址:https://www.microsoft.c…

【精选】VMware部署ESXI6.5 vCenter Server详解

VMware部署ESXI6.5 vCenter Server 一、ESXi主机介绍1、虚拟机的好处2、为什么要使用虚拟机 二、虚拟化服务器概述1、VSphere物理架构2、体系架构3、VMware vSphere 组件 三、ESXi安装环境1、安装步骤2、使用VMware新建ESXi主机3、初始环境安装 四、创建虚拟机五、安装部署VMwa…

kr 第三阶段(五)32 位逆向

如何寻找 main 函数 对于低版本的 VC 编译器(VC 6.0),main 函数在 PE 入口点 mainCRTStartup 函数中是倒数第 3 个函数调用,且参数个数为 3 个(wmain 函数为 4 个参数)。 对于高版本的 VC 编译器 程序入口…

DTI-ALPS处理笔记

DTI-ALPS处理笔记 前言: 前段时间刚好学习了一下DTI-ALPS处理(diffusion tensor image analysis along the perivascular space ),记录一下,以便后续学习。ALPS是2017年发表在《Japanese Journal of Radiology》的一篇文章首次提出的 (文章地址),主要用于无创评估脑内淋…

锐捷Smartweb管理系统 默认开启Guest账户漏洞

通过弱口令进行登录 guest/guest 文笔生疏,措辞浅薄,望各位大佬不吝赐教,万分感谢。 免责声明:由于传播或利用此文所提供的信息、技术或方法而造成的任何直接或间接的后果及损失,均由使用者本人负责, 文章…

ce从初阶到大牛(两台主机免密登录)

一、配置ssh远程连接 实现两台linux主机之间通过公钥验证能够互相实现免密登陆 1.确认服务程序是否安装 rpm -qa | grep ssh 2.是否启动 ps -aux | grep ssh 3.生成非对称公钥 ssh-keygen -t rsa 4.公钥发送到客户端 cd /root/.ssh/ ssh-copy-id root192.168.170.134 因为…

Apollo 快速上手指南:打造自动驾驶解决方案

快速上手 概述云端体验登录云端仿真环境 打开DreamView播放离线数据包PNC Monitor 内置的数据监视器cyber_monitor 实时通道信息视图福利活动 主页传送门:📀 传送 概述 Apollo 开放平台是一个开放的、完整的、安全的平台,将帮助汽车行业及自…

搭建帮助中心系统的关键注意事项

帮助中心系统是现代企业不可或缺的一部分。它们提供了一个集中管理和发布信息的平台,使企业能够向客户提供准确、及时且易于访问的帮助文档和知识库。在搭建帮助中心系统之前,务必要仔细考虑这些关键注意事项。 | 选择合适的帮助中心系统软件 考虑功能…

​Vue2响应式原理

目录 初始化 initProps():父组件传的 props 列表,proxy() 把属性代理到当前实例上 vm._props.xx 变成 vm.xx initData():判断data和props、methods是否重名,proxy() 把属性代理到当前实例上 this.xx observe():给…

OpenCV学习(五)——图像基本操作(访问图像像素值、图像属性、感兴趣区域ROI和图像边框)

图像基本操作 5. 图像基本操作5.1 访问像素值并修改5.2 访问图像属性5.2 图像感兴趣区域ROI5.3 拆分和合并图像通道5.4 为图像设置边框(填充) 5. 图像基本操作 访问像素值并修改访问图像属性设置感兴趣区域(ROI)分割和合并图像 …

洛谷 B2033 A*B问题 C++代码

目录 题目描述 AC Code 题目描述 AC Code #include<bits/stdc.h> using namespace std; int main() {long long a,b;cin>>a>>b;cout<<a*b<<endl;return 0; }

刷爆指针笔试题

第一题 int main() { int a[5] { 1, 2, 3, 4, 5 }; int *ptr (int *)(&a 1); printf( "%d,%d", *(a 1), *(ptr - 1)); return 0; } //程序的结果是什么&#xff1f; 先自己思考一下&#xff0c;然后再看解析哦 【解析】 &a表示整个数组的地…

LeetCode——哈希表(Java)

哈希表 简介242. 有效的字母异位词349. 两个数组的交集202. 快乐数 简介 记录一下自己刷题的历程以及代码&#xff0c;会尽量把在本地测试包含main函数的完整代码贴上&#xff0c;以及一些注释掉的输出语句。写题过程中参考了 代码随想录。会附上一些个人的思路&#xff0c;如…

LCD屏硬件调光的几种方式

一 前言 最近新开的项目用到了LCD屏&#xff0c;关于LCD屏的调光&#xff0c;主板硬件主要用到了偏压IC与背光IC。关于偏压IC,我们后期再聊&#xff0c;今天主要聊一聊背光IC&#xff0c;以及它的调光方式。 二 LED电路设计 在聊背光IC前&#xff0c;首先要对LCD屏的电压电流…

C++学习day--24 推箱子游戏图像化开发

环境要求&#xff1a; 1、VS2015以上 2、成功安装并配置图形库 项目注意事项&#xff1a;代码复制好以后&#xff0c;把下面的字符集改为多字节字符集 第 1 节 项目需求 实现一款推箱子游戏&#xff0c;效果如下图所示 , 具体规则&#xff1a; 1. 箱子只能推动而不能拉动…