动手造轮子之hadoo-simple-rpc

动手造轮子之hadoo-simple-rpc

hadoo-simple-rpc:

基于netty+kryo+zookeeper实现的一个简易rpc框架

微信图片_2017120716352714

1.前言

一直对分布式系统方向的知识很感兴趣,既然目前单机性能瓶颈已经无法打破,那么用分布式的思路解决问题就是一个必然的趋势,我想这也是微服务诞生的契机,而分布式系统面临的一个主要问题,就是节点之前的通信问题,也就是RPC(远程过程调用),用通俗的话解释,就是客户端可以像调用本地方法一样调用远程节点上的方法,这个过程,对于客户端来讲是透明的
RPC框架,可以将跨节点方法调用的细节封装起来,其中可能涉及到网络IO的传输、服务的注册和发现,以及服务端节点的负载均衡等等,客户端通通不用考虑,只是调用了一个方法,拿到了一个返结果,这样,就可以打破单机性能瓶颈的限制,使用微服务的架构方式,享受微服务带来的种种方便。看来,RPC在其中扮演着一个非常重要的角色。

市面上已经产生了很多的性能优良的RPC框架,例如Dubbo、gRP以及Spring Cloud等等,直接用起来也是很香,为什么要自己造轮子?

首先,造轮子是为了更好的使用轮子,项目中使用到了一个框架,那么就会不可避免的产生各种各样的问题,如果我们没有深入理解框架内部的原理,那么出现问题的时候,我们只能面向google解决问题,在网上搜索一些能够解决当前场景的问题的答案,说实话, 这很吃运气,隔靴搔痒,对实现原理有一定的了解,可以帮助我们快速的定位解决问题。除此以外,实现过程中会涉及到很多的底层基础知识,具体在后面会详细列举,另外,功利一点来讲,对于目前参加秋招的我来讲,也是一个不错的项目经历。天上飞的理论,都要有地上的实现。

2.涉及到了哪些知识?

  • 软实力:

编程方式的锻炼,硬编码习惯导致了项目重构,意识到了面向接口编程思想的重要性

熟悉版本控制工具的使用:Git

  • Java

线程池的使用

动态代理机制

CompletableFuture的使用

...各种api

  • 网络编程

目前框架支持BIO和Netty两种方式

  1. 使用 Netty 进行网络传输;
  2. ByteBuf 介绍
  3. Netty 粘包拆包
  4. Netty 长连接和心跳机制
  • ZooKeeper

基本概念,原理

使用了新的客户端工具Curator进行CRUD

  • 序列化以及压缩

对象是不能直接在网络中进行传输的,需要序列化为字节流,另外如果有相关的场景需求,还需要级性压缩操作

  • 。。。

3.项目相关情况

项目结构图:

image-20200906172718471
  • SPI机制引入

    引入了类似dubbo的SPI机制,可以通过配置文件的方式,灵活加载接口的实现类,程序易于扩展

  • 使用序列化机制Kryo实现序列化,后面会增加其他序列化方式,支持选择配置

  • 网络传输实现了BIO和Netty两种方式,其中Netty 重用 Channel 避免重复连接服务端

  • 增加 Netty 心跳机制 : 保证客户端和服务端的连接不被断掉,避免重连。

  • 引入Spring通过注解注册服务

  • 负载均衡:目前仅支持随机算法

4.展望与致谢

目前只是完成了一些基本功能以及模块,后面会对一些细节进行优化,同时也会逐渐深入了解底层的知识,其中主要以Netty为主,另外这个项目参考了网上的一些优秀框架,这里特别感谢Guide哥以及《消息队列高手课》李玥,参考了两位大神很多的想法,十分感谢!后面的一些项目演进在github上进行:

https://github.com/yeshadoo/hadoo-simple-rpc

一些理论知识的深入,我会继续发表相关的博客~

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://hadoo666.top/archives/动手造轮子之hadoo-simple-rpcmd