Skip to content
JavaGuideJavaGuide
面试指南
优质专栏
项目精选
书籍精选
旧版链接open in new window
RSS订阅open in new window
关于作者
github icon
  • 《Java 面试指北》
    • 《手写 RPC 框架》
      • 介绍
        • 内容概览
          • 项目基本情况和可优化点
            • 星球其他资源
              • 星球限时优惠

              《手写 RPC 框架》

              author iconGuidecategory icon
              • 知识星球
              calendar icon2022年3月8日word icon约 1540 字

              此页内容
              • 介绍
              • 内容概览
              • 项目基本情况和可优化点
              • 星球其他资源
              • 星球限时优惠

              # 介绍

              《手写 RPC 框架》 是我的知识星球的一个内部小册,我写了 12 篇文章来讲解如何从零开始基于 Netty+Kyro+Zookeeper 实现一个简易的 RPC 框架。

              麻雀虽小五脏俱全,项目代码注释详细,结构清晰,并且集成了 Check Style 规范代码结构,非常适合阅读和学习。

              # 内容概览

              通过这个简易的轮子,你可以学到 RPC 的底层原理和原理以及各种 Java 编码实践的运用。你甚至可以把它当做你的毕设/项目经验的选择,这是非常不错!对比其他求职者的项目经验都是各种系统,造轮子肯定是更加能赢得面试官的青睐。

              • Github 地址:https://github.com/Snailclimb/guide-rpc-frameworkopen in new window 。
              • Gitee 地址:https://gitee.com/SnailClimb/guide-rpc-frameworkopen in new window 。

              # 项目基本情况和可优化点

              为了循序渐进,最初的是时候,我是基于传统的 BIO 的方式 Socket 进行网络传输,然后利用 JDK 自带的序列化机制 来实现这个 RPC 框架的。后面,我对原始版本进行了优化,已完成的优化点和可以完成的优化点我都列在了下面 👇。

              为什么要把可优化点列出来? 主要是想给哪些希望优化这个 RPC 框架的小伙伴一点思路。欢迎大家 fork 本仓库,然后自己进行优化。

              • 使用 Netty(基于 NIO)替代 BIO 实现网络传输;
              • 使用开源的序列化机制 Kyro(也可以用其它的)替代 JDK 自带的序列化机制;
              • 使用 Zookeeper 管理相关服务地址信息;
              • Netty 重用 Channel 避免重复连接服务端;
              • 使用 CompletableFuture 包装接受客户端返回结果(之前的实现是通过 AttributeMap
              • 增加 Netty 心跳机制
              • 客户端调用远程服务的时候进行负载均衡
              • 处理一个接口有多个类实现的情况
              • 集成 Spring 通过注解注册服务;
              • 集成 Spring 通过注解进行服务消费;
              • 增加服务版本号
              • 对 SPI 机制的运用;
              • 增加可配置比如序列化方式、注册中心的实现方式,避免硬编码
              • 客户端与服务端通信协议(数据包结构)重新设计 ,可以将原有的 RpcRequest和 RpcReuqest
                • 魔数 : 通常是 4 个字节。这个魔数主要是为了筛选来到服务端的数据包,有了这个魔数之后,服务端首先取出前面四个字节进行比对,能够在第一时间识别出这个数据包并非是遵循自定义协议的,也就是无效数据包,为了安全考虑可以直接关闭连接以节省资源。
                • 序列化器编号 :标识序列化的方式,比如是使用 Java 自带的序列化,还是 json,kyro 等序列化方式。
                • 消息体长度 : 运行时计算出来。
                • ......
              • 编写测试为重构代码提供信心
              • 服务监控中心(类似 dubbo admin)
              • 设置 gzip 压缩

              # 星球其他资源

              除了 《从零开始写一个 RPC 框架》 之外,星球还有 《Java 面试指北》、 《Java 必读源码系列》(目前已经整理了 Dubbo 2.6.x 、Netty 4.x、SpringBoot2.1 的源码) 、《Kafka 常见面试题/知识点总结》 等多个专栏。

              另外,星球还会有读书活动、学习打卡、简历修改、免费提问、海量 Java 优质面试资源以及各种不定时的福利。

              # 星球限时优惠

              两年前,知识星球的定价是 50/年 ,这是星球的最低定价,我还附送了优惠券。扣除了星球手续费,发了各种福利之后,几乎就是纯粹做公益。

              当时的想法真不是为了赚钱,不开玩笑,不打诳语!目前星球有 8000+ 人,其中有超过 35% 的小伙伴都是星球刚开那会就加入了。

              随着时间推移,星球积累的干货资源越来越多,我花在星球上的时间也越来越多。于是,我将星球的定价慢慢调整为了 159/年!是的,星球的价格会慢慢升高的,想要加入的小伙伴一定要尽早。

              你可以添加我的微信领取星球专属优惠券,限时 100 元/年 加入。

              如果你经济确实有困难的话,加我的时候说明一下情况就好,莫欺少年穷,可以理解,一定不要去用什么花呗类借贷产品。

              不过,还是希望大家也不要利用我的好心,感恩!信任!理解!

              edit icon编辑此页open in new window
              上次编辑于: 2022/3/30 上午10:01:15
              贡献者: guide
              上一页
              《Java 面试指北》
              鄂ICP备2020015769号-1
              Copyright © 2022 Guide