第01篇:手写JavaRPC框架之思路分析

简介: 本系列文章的总体目标是从零实现一个RPC框架,我们将从TCP通信协议开始,一步一步实操,将socket 二进制数据流一步一步变成Java可以认识的数据类型,从而最终实现RPC远程通信,并可以集成在Spring中,同时也可以支持SpringBoot的自动化配置。最终我们会将项目发布到全球Maven仓库, 让大家都可以下载学习。

作者: 西魏陶渊明

博客: https://blog.springlearn.cn/

天下代码一大抄, 抄来抄去有提高, 看你会抄不会抄!

一、前言

如果不是因为热爱,我不会这样;如果不是为了,涨点粉丝,我不会这样;
如果不是为了几两散碎银子,我更不会这样。

以前的文章开场太过严肃,太过专业。就像大学老师上课,只知道讲课。不知道互动。这样
效果太差,写的没意思,读者更是没意思。大数据分析还以为你是抄的,还不给你推荐热门 😭。

不然就改变一下风格吧,从本系列文章开始,小编就要放飞 ✈️ 自我,随心 ❤️ 而动。希望在分享,总结自己掌握的知识点的同时,能给各位客官带来一点小小的收获。小编尽量全力输出干货,如果看完感觉还行的话,希望能多多关注。你的关注,就是我进步的最大动力。如果看完,感觉就这? 可以留言讨论。接受各位看官的批评和意见。共同学习共同进步。

二、目标

本系列文章的总体目标是从零实现一个RPC框架,我们将从TCP通信协议开始,
一步一步实操,将socket 二进制数据流一步一步变成Java可以认识的数据类型,
从而最终实现RPC远程通信,并可以集成在Spring中,同时也可以支持SpringBoot的自动化配置。最终我们会将项目发布到全球Maven仓库, 让大家都可以下载学习。

本系列文章主要知识点以思维导图的方式,展示在下图=面,内容只会多不会少。干货较多,对于初级的同学可以收藏起来慢慢看。毕竟一口也吃不了一个胖子。但是不能没有信心。

正如小编的口头禅: 写代码和写文章是一样一样的。

天下代码一大抄,抄来抄去有提高,看你会抄不会抄。

三、思路分析

3.1 什么是RPC框架

我们在要写RPC框架,我们先思考下RPC是什么? 白话点就是一个远程通信的工具而已。
他可以让开发者像调用本地方法一样,方便的调用远程的方法。

目前市面上的RPC框架主要有下面这些

  • dubbo
  • grpc
  • feign

可能对于银行和传统国企可能偏爱国产的dubbo框架,可能会涉及到国家安全吧,而对于互联网公司更多的会使用SpringCloud的全家桶。那么不管他们使用的其中的哪一款,其实这些框架都是能做到,让开发者像调用本地方法一样实现远程方法的调用的。

可以实现远程调用的呢? 答案当然就是利用socket通信了。而socket底层通信
都是基于tcp/ip协议实现的。所以以上这三款的

3.2 通信框架的区别

  • dubbo
  • grpc
  • feign

共同点:

  • 都是基于tcp/ip协议来实现通信
  • 都屏蔽底层通信细节,使开发者只用关心自己的业务即可

不同点:

  • grpc和feign都是基于tcp协议更上层的http协议来实现的
  • dubbo是基于tcp协议上自己重新实现了一套自己的规则,而这个规则就是dubbo协议。

dubbo协议因为是直接基于tcp协议定制的,所以可能性能会更加的好。能实现更多的底层的特性,比如说长连接。而其他两款是基于http协议来进行封装的,正因为它的这个特性,所以只是http客户端都可以进行调用,更适合跨平台,跨语言。因为不管是什么语言,都支持http协议。但是他的性能可能就相对没有dubbo好,综上所述他们各有胜负。现在主要比的就是看谁的生态比较好,谁的周边扩展更加丰富。

3.3 RPC底层实现

前面我们说了,RPC框架是一个,可以让程序猿像调用本地方法一样实现远程方法调用的一个工具。其实这句话就说出了主要的答案。

![远程调用 = 计算机通信
屏蔽细节 = 动态代理](https://img.springlearn.cn/blog/7f72d53f64e4181913a662abc2b37143.png)

既然知道了他的大概实现,那么其实思路就有了。我们第一步就是使用Java语言来实现底层
的通信能力建设,然后在这个基础上进行二次封装,最终通过动态代理的形式,将底层通信的细节给屏蔽起来。如此就能实现一个RPC协议了。

思路就是这个思路。

所以本系列文章的第一部分,就是先完成通信层的建设,使用Java实现一个通用的底层协议,实现通信能力。

说着很简单,但是实现通信可没有那么简单哦。接下来我们面临一系列网络通信中的难题。比如说Java的通信API表难用,网络通信中还有黏包拆包等问题。但是没关系,这些坑小编已经踩过了,跟着小编的思路一步一步做。相信事半必能功倍。

相关文章
|
4月前
|
存储 数据管理 数据库
CRUD操作实战:从理论到代码实现的全面解析
【7月更文挑战第4天】在软件开发领域,CRUD代表了数据管理的四个基本操作:创建(Create)、读取(Read)、更新(Update)和删除(Delete)。这四个操作构成了大多数应用程序数据交互的核心。本文将深入讲解CRUD概念,并通过一个简单的代码示例,展示如何在实际项目中实现这些操作。我们将使用Python语言结合SQLite数据库来演示,因为它们的轻量级特性和易用性非常适合教学目的。
366 2
01 # 手写 new 的原理
01 # 手写 new 的原理
44 0
|
6月前
|
存储 JSON 缓存
前端面试必须掌握的手写题:基础篇
前端面试必须掌握的手写题:基础篇
|
JSON 前端开发 Java
《优化接口设计的思路》系列:第一篇—接口参数的一些弯弯绕绕
大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 作为一名从业已达六年的老码农,我的工作主要是开发后端Java业务系统,包括各种管理后台和小程序等。在这些项目中,我设计过单/多租户体系系统,对接过许多开放平台,也搞过消息中心这类较为复杂的应用,但幸运的是,我至今还没有遇到过线上系统由于代码崩溃导致资损的情况。这其中的原因有三点:一是业务系统本身并不复杂;二是我一直遵循某大厂代码规约,在开发过程中尽可能按规约编写代码;三是经过多年的开发经验积累,我成为了一名熟练工,掌握了一些实用的技巧。
70 0
|
存储 算法 C++
数据结构与算法——第四节 栈和队列(C 模拟实现+思路分析+运行截图)
对于栈和队列,我们在这里只是把 其底层的原理简单的说一下,等到C++说到STL的时候,我们还会详细地说。
192 0
数据结构与算法——第四节 栈和队列(C 模拟实现+思路分析+运行截图)
|
算法 搜索推荐 C++
【算法】面试必备之0基础学算法 快速排序(详细讲解+私人笔记+代码展示)
二分查找又称折半查找、二分搜索、折半搜索等,是在分治算法基础上设计出来的查找算法,对应的时间复杂度为O(logn)。到这里是不是感觉很熟悉,我们前两期的算法知识,也是基于分治的方法去进行学习的,如果有这方面还不了解的朋友,你可以到我的第一篇文章(0基础学算法)里面去查看一下。
136 0
【算法】面试必备之0基础学算法 快速排序(详细讲解+私人笔记+代码展示)
|
人工智能 算法 搜索推荐
【算法】面试必备之0基础学算法 归并排序(详细讲解+私人笔记+代码展示)
归并排序是一个稳定的排序算法,在进行子数组合并的时候,我们可以设置当元素大小相等时,先将前半部分的数据放入临时数组,这样就可以保证相等元素在排序后依然保持原来的顺序,并且归并排序的执行效率与原始数据的有序程度无关,其时间复杂度是非常稳定的,都是O(nlogn) ...
138 0
【算法】面试必备之0基础学算法 归并排序(详细讲解+私人笔记+代码展示)
|
消息中间件 编解码 Dubbo
第02篇:手写JavaRPC框架之设计思路
本篇文章的主要内容就是设计我们自己的通信协议及架构,可以这样说如果没有了本篇文章的内容,就不可能实现RPC。因为RPC的最基本要求就是能实现远程通信。本篇文章是讲述通信层的设计思路,
241 0
第02篇:手写JavaRPC框架之设计思路
|
缓存 前端开发 JavaScript
面试官:请手写一个curry工具函数?
前言 "函数柯里化"可能是很多小伙伴经常听到的一个概念,这也是在面试中很常考的。柯里化是我们英译过来的,它实际被称作"currying"。很多小伙伴可能对“函数柯里化”总是云里雾里的,但是事实上在项目中,其实很多地方都有“函数柯里化”的存在,只是我们没有发现而已,今天我们就来彻底学会它!
318 0
|
存储 SQL 前端开发
【自然框架】——思路、结构、特点的介绍(初稿,欢迎大家多提意见)
开场白  面向过程:面向过程是“写代码”,根据客户提出来的需求来写代码,包括函数。一步一步的写,都写完了,功能也就实现了。   面向对象:面向对象是“做设计”,先不考虑细节,而是先做总体设计。都设计好了,再去实现细节。
1049 0