手写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.rhkb.cn/news/173346.html

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

相关文章

基于小安派AiPi-Eye-S1的Nes游戏机

1.作品展示 作品功能可见以下B站视频 外壳可以使用灰太狼大佬提供的外壳STL文件。在嘉立创三维猴上打印(外壳12元快递6元)。 外壳从以下的帖子中获取: 模型分享 2.作品说明 2.1 硬件部分 硬件上使用到了AiPi-Eye-S1开发板以及3.5寸 240*3…

rust学习——智能指针

智能指针 在各个编程语言中,指针的概念几乎都是相同的:指针是一个包含了内存地址的变量,该内存地址引用或者指向了另外的数据。 在 Rust 中,最常见的指针类型是引用,引用通过 & 符号表示。不同于其它语言&#xf…

【Redis】Docker部署Redis数据库

Docker部署Redis数据库 1. Redis介绍2. CentOS 7 安装 & Docker 配置3. 拉取Redis 镜像、创建容器3.1 配置Docker镜像源3.2 拉取Redis 镜像3.3 容器创建 1. Redis介绍 Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用…

新一代AI技术,引领医疗智能革新共筑未来医疗生态

加快推进数字化转型,是我国抢抓新一轮科技革命和产业变革机遇的必然选择,数字化转型已不是“选择题”,而是关乎生存和长远发展的“必修课”。在此目标下,公共服务领域迎来深刻变革,医院也不例外,数字经济的…

力扣每日一题73:矩阵置零

题目描述: 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2…

MySQL 5.7限制general_log日志大小

背景 需求: 在MySQL 5.7.41中开启general_log 并限制其大小,避免快速增长占用硬盘空间。 解决: 通过定时任务,执行简单的脚本,判断general_log 日志的大小,实现对通用查询日志的“每日备份”或“每日清…

基于群居蜘蛛算法的无人机航迹规划

基于群居蜘蛛算法的无人机航迹规划 文章目录 基于群居蜘蛛算法的无人机航迹规划1.群居蜘蛛搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用群居蜘蛛算法来优化无人机航迹规划。 …

如何使用 Docker 搭建 Jenkins 环境?从安装到精通

不少兄弟搭 jenkins 环境有问题,有的同学用 window, 有的同学用 mac, 有的同学用 linux。 还有的同学公司用 window, 家里用 mac,搭个环境头发掉了一地。。。 这回我们用 docker 去搭建 jenkins 环境,不管你是用的是什么系统&…

一文5000字从0到1使用Jmeter实现轻量级的接口自动化测试(图文并茂)

接口测试虽然作为版本的一环,但是也是有一套完整的体系,有接口的功能测试、性能测试、安全测试;同时,由于接口的特性,接口的自动化低成本高收益的,使用一些开源工具或一些轻量级的方法,在测试用…

【PointNet—论文笔记分享】

第一个直接基于原始点云数据进行分割、分类的模型,之前都是基于多视图或者体素的方式。 论文: PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation代码: TensorFlow版 Pytorch版 基本模型架构: 分别对每个点进行特征提取…

SpringBoot集成Redis Cluster集群(附带Linux部署Redis Cluster高可用集群)

目录 一、前言二、集成配置2.1、POM2.2、添加配置文件application.yml2.3、编写配置文件2.4、编写启动类2.5、编写测试类测试是否连接成功 一、前言 这里会使用到spring-boot-starter-data-redis包,spring boot 2的spring-boot-starter-data-redis中,默…

适用于物联网的UI设计工具都有哪些?

随着科学技术的飞速发展,“万物相连的互联网”时代逐渐成为现实。如今,物联网已经不是什么新词了。事实上,早在各种屏幕设备诞生之前,人们就与物理世界交织在一起,产生了无数的互动。如何将人们多年积累的互动经验与物…

windows下OOM排查

如下有一段代码 package com.lm.demo.arthas.controller;import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import java.util.A…

PHP危险函数

PHP危险函数 文章目录 PHP危险函数PHP 代码执行函数eval 语句assert()语句preg_replace()函数正则表达式里修饰符 回调函数call_user_func()函数array_map()函数 OS命令执行函数system()函数exec()函数shell_exec()函数passthru() 函数popen 函数反引号 实列 通过构造函数可以执…

负载均衡的综合部署练习(hproxy+keepalived和lvs-DR+keepalived+nginx+Tomcat)

一、haproxykeepalived haproxy 2台 20.0.0.21 20.0.0.22 nginx 2台 20.0.0.23 20.0.0.24 客户机 1台 20.0.0.30 这里没有haproxy不是集群的概念,他只是代理服务器。 访问他直接可以直接访问后端服务器 关闭防火墙 安装haproxy和环境: yum in…

【Spring】快速入门Spring Web MVC

文章目录 1. 什么是Spring Web MVC1.1 MVC1.2 Spring MVC 2. 使用Spring MVC2.1 项目创建2.2 建立连接2.2.1 RequestMapping 注解2.2.2 RestController 注解2.2.3 RequestMapping 使⽤2.2.4 RequestMapping 是什么请求?POST?GET?…&#xff1…

Android原生项目集成uniMPSDK(Uniapp)遇到的报错总结

uni小程s序SDK 集成到Android原生项目:老项目中用到的库较多,会出现几种冲突问题,总结如下: 报错1: Execution failed for task :app:processDebugManifest. > Manifest merger failed with multiple errors, see logs Andro…

YUV的红蓝颠倒(反色)的原因及解决

原因 UV排列反了。 比如说,NV21和YUV420SP的Y排列相同,UV则相反。给你YUV420SP,你当作NV21保存JPG,就会发生红蓝拿起。 解决办法 就是把UV互换一下。具体代码: NV21转YUV420SP的代码_nv21转yuv420格式-CSDN博客 …

SpringCloud复习:(3)LoadBalancerInterceptor

使用Ribbon时,execute方法会由RibbonLoadBalancerClient类来实现 它会调用重载的execute方法 getLoadBalancer默认会返回ZoneAwareLoadBalancer(基类是BaseLoadBalancer).此处调用的getServer方法就会根据负载均衡策略选择适当的服务器来为下一步的htt…

算法通过村第十七关-贪心|白银笔记|贪心高频问题

文章目录 前言区间问题判断区间是否重复合并区间插入区间 字符串分割加油站问题总结 前言 提示:如果生活把你的门关上了,那你就再打开,这就是门,门就是这样的。 --佚名 贪婪的思想不一定要理解的很透彻,但是贪婪的问题…