程序员如何设计一个rpc框架?
RPC框架全称叫“Remote Procedure Call”-远程过程调用。
在分布式应用大放异彩的今天,软件研发工作(微服务、中台)是一定离不开分布式,既然说到分布式就一定离不开RPC,所以RPC框架也是广大程序员进阶路上必须跨过去的一道坎,也是工作中经常会用到的。因此,了解并掌握RPC框架的底层原理和其设计思想也是每一个程序员的必备技能之一。
业界知名RPC
各大互联网公司都或多或少实现了自己的RPC框架,其中比较出名且常用的有:
阿里巴巴的dubbo:这个大家应该都用到过吧?GitHub地址:
基于阿里巴巴fork的当当版dubbox:这个貌似也都用到过?在dubbo不死不活的那几年。GitHub地址:
谷歌grpc:谷歌版本的rpc,GitHub地址(Java版):
大家可以自己去GitHub上去搜索这三大框架并进行学习。
自己简单实现一个最基本的RPC框架
如果我们自己去实现一个简单的RPC框架要怎么做?这个时候我们应该意识到我们是在写一个框架,写一个框架意味着我们无法再随意的使用第三方依赖包,也就是除了一些工具类包可以使用,其他的都需要我们用Java一行一行的写出来。
下面提供一下如何用Java实现一个简单的RPC功能(谈不上框架):
先定义一个RPC接口类,代码如下图:
写Rpc接口类的实现类实现这两个方法,export方法如下图:
refer方法:
框架定义完成后,我们开始使用这个框架,先简单定义一个测试用的服务接口:
实现类:
我们需要写一个provider把这个服务提供出去,运行这个main方法即可:
写一个cosumer远程消费这个服务:
运行这个main方法会输出:
这样一个简单的RPC远程过程调用就实现了,是不是很简单?采用Java Socket套接字编程和Java自带的序列化。
设计一个RPC框架需要我们掌握哪些知识?
上面简单实现了一个RPC框架,这个只是实验性质的编码,实际上是无法使用的,因为在实际业务中,我们面对的是高并发、多请求。上面的套接字编程也是阻塞的,另外序列化也是用的Java自带的序列化方法。
而了解主流rpc实现原理的同学都知道,每一个rpc框架在性能的考虑上都做到了自己框架的极致,框架本身既要考虑高可扩展的同时又得考虑高性能。
比如在dubbo中,默认使用hessian序列化的方式传输网络数据,同时也实现了主流的集中序列化方式,比如Java自带的序列化、Kryo序列化、fastJson序列化等方式。底层采用netty去做网络通信使用非阻塞NIO。注册中心既有zookeepeer,也支持redis。动态代理采用Javassist等等技术。
所以我们在设计一个rpc框架的时候,首先必须掌握上面说的那些知识,还得要求我们能够很好的结合每一个技术,做到融汇贯通。
网上也有很多关于RPC相关知识的文章,也有dubbo、dubbox、grpc等rpc框架的源码解析文章,建议大家可以深耕这一块,彻底摸透掌握这块的实现原理。
以上就是我个人关于“如何设计一个RPC框架”的回答,欢迎大家批评指正,交流补充。
我是【java架构设计】,关注我,持续为您提供Java优质内容!
如何才能成为java架构师?我为大家来分析一下?
首先架构师不是那么好当,技术实力一定要过关,要具有架构师的思想,其次架构师是企业级开发所需的Dubbo框架、zookeper基本原理、redis分布式缓存、JVM性能优化,Nginx+apache+Tomcat集群部署、大数据hadoop,Hbase实时计算spark、storm、数据分析分词和权重等核心技术。
如何成为一个优秀的架构师呢?我用七张图片来告诉大家。
另外的四张图片想成为架构师的可以私信我,每天更新java架构师技术视频资料。
大家可以先学习下分布式锁的实现:
链接: 密码: umu3
首先呢,我觉得工作3年左右开始考虑这个事儿是正常的,写了一定的功能,接触了一些框架了,可能遇到了不少坑,也加了不少班,但是忽然想起来做的东西零零散散,找不到精深的方法。
这个问题不是你一个人的问题,也不是做程序才会遇到的问题,只不过软件工程是实践科学,基本都是反着来的,先做了,然后找资料再学原理,基于此,如果说你想利用空闲时间正向地梳理这些东西的话,还是先从基础出发(以java web系来说,我最熟悉的):
1、java core,基础,集合,多线程,jvm的基础
2、框架方面:spring、springmvc(restful的请求原理)、spring boot(这里只是配置和使用,不用急于求成,spring的东西很多)
3、数据库方面(1、mysql、oracle;2、常用连接池:druid、hikari等)
4、rpc:httpclient,dubbo,thrift,grpc(使用没啥难度、主要是学习这几种典型rpc的架构和使用场景)
5、nosql:redis、mongodb、cassandra、memcache(使用场景、集群方式、常见的数据结构、使用场景、缺点很重要)
6、业务工具(1、POI:用来导入、出excel和word,功能强大~;2、javax mail发送邮件;等等)
7、总结一下常用的算法、不一定是面试常考的,基础排序和查找算法、链表的操作、图相关的操作等,实践中可能遇到的少,但是思维要有
8、如果是后端工程师,建议适当做一些前端开发了解一些前端的技术,是你未来更好的架构和理解前端和协作打下基础,这里包括常见的前端框架(angular、vue、react)、打包工具(webpack、gulp等)、原生js的dom操作
9、了解一些大型架构的细节也是学习和成长的方式。
。。。
其他的东西还有很多,其实你自己列一列这些细节,再有几年,就会有自己的体系了。

