手写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.hqwc.cn/news/151752.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能基础_机器学习003_有监督机器学习_sklearn中线性方程和正规方程的计算_使用sklearn解算八元一次方程---人工智能工作笔记0042

然后我们再来看看,如何使用sklearn,来进行正规方程的运算,当然这里 首先要安装sklearn,这里如何安装sklearn就不说了,自己查一下 首先我们还是来计算前面的八元一次方程的解,但是这次我们不用np.linalg.solve这个 解线性方程的方式,也不用 直接 解正规方程的方式: 也就是上面…

Mysql,SqlServer,Oracle获取库名 表名 列名

先看下需求背景: 获取某个数据源连接下所有库名,库下所有表名,表中所有字段 1.MySql 先说MySql吧,最简单 1.1获得所有数据库库名 这是一个mysql和sqlserver公用的方法,这里url不用担心数据库问题,他其实…

Android13源码添加系统服务

本文基于Android 13的framework层添加系统接口,为应用层提供读写函数、以及执行命令! 添加接口 frameworks/base/core/java/android/app/IDevices.aidl package android.app; interface IDevices {//读取文件String readFile(String path);//写入文件void writeF…

设计模式之中介模式

文章目录 一、介绍二、生活中的中介模式三、中介模式中的角色四、案例演示1. 角色分析 五、优缺点 一、介绍 中介模式(Mediator Pattern),属于行为型设计模式。目的是把系统中对象之间的调用关系从一对多转变成一对一的调用关系,以此来降低多个对象和类…

2023全新TwoNav开源网址导航系统源码 | 去授权版

2023全新TwoNav开源网址导航系统源码 已过授权 所有功能可用 测试环境:NginxPHP7.4MySQL5.6 一款开源的书签导航管理程序,界面简洁,安装简单,使用方便,基础功能免费。 TwoNav可帮助你将浏览器书签集中式管理&#x…

LeetCode:1465. 切割后面积最大的蛋糕(C++)

目录 1465. 切割后面积最大的蛋糕 题目描述: 实现代码与解析: 贪心 原理思路: 1465. 切割后面积最大的蛋糕 题目描述: 矩形蛋糕的高度为 h 且宽度为 w,给你两个整数数组 horizontalCuts 和 verticalCuts&#xff…

基于机器视觉的行人口罩佩戴检测 计算机竞赛

简介 2020新冠爆发以来,疫情牵动着全国人民的心,一线医护工作者在最前线抗击疫情的同时,我们也可以看到很多科技行业和人工智能领域的从业者,也在贡献着他们的力量。近些天来,旷视、商汤、海康、百度都多家科技公司研…

安装使用vcpkg的简易教程

目录 1. 首先安装vcpkg2. 在vcpkg目录下运行bootstrap-vcpkg.bat 命令3. 接着vs进行集成4. 使用vcpkg搜索可用的包5.下载安装所需包6.下载安装完成 1. 首先安装vcpkg 使用git命令下载 git clone https://github.com/Microsoft/vcpkg.git如果下载失败可直接下载文件 (vcpkg-ma…

计算机视觉 激光雷达结合无监督学习进行物体检测的工作原理

一、简述 激光雷达是目前正在改变世界的传感器。它集成在自动驾驶汽车、自主无人机、机器人、卫星、火箭等中。该传感器使用激光束了解世界,并测量激光击中目标返回所需的时间,输出是点云信息,利用这些信息,我们可以从3D点云中查找障碍物。 从自动驾驶汽车的角度看激光雷达…

【Java】电子病历编辑器源码(云端SaaS服务)

电子病历编辑器极具灵活性,它既可嵌入到医院HIS系统中,作为内置编辑工具供多个模块使用,也可以独立拿出来,与第三方业务厂商展开合作,为他们提供病历书写功能,充分发挥编辑器的功能。 电子病历基于云端SaaS…

8、电路综合-基于简化实频的SRFT微带线的带通滤波器设计

8、电路综合-基于简化实频的SRFT微带线的带通滤波器设计 此处介绍微带线综合的巴特沃斯带通滤波器和切比雪夫带通滤波器的设计方法。对于理查德域的网络综合技术而言,这种带通综合和低通综合在本质上并无区别,因为理查德域函数是周期的。低通滤波器的SR…

Python中的*args 和 **kwargs

在Python中的代码中经常会见到这两个词 args 和 kwargs,前面通常还会加上一个或者两个星号。其实这只是编程人员约定的变量名字,args 是 arguments 的缩写,表示位置参数;kwargs 是 keyword arguments 的缩写,表示关键字…