Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >花了快2个月!Guide自己动手写了一个简单的RPC框架!

花了快2个月!Guide自己动手写了一个简单的RPC框架!

作者头像
Guide哥
发布于 2020-06-06 08:17:11
发布于 2020-06-06 08:17:11
1.5K00
代码可运行
举报
文章被收录于专栏:JavaGuideJavaGuide
运行总次数:0
代码可运行

“Github地址:https://github.com/Snailclimb/guide-rpc-framework (欢迎star,欢迎一起完善!共勉!)

前言

大概2个月前,我说过要利用业余时间写一个简单的 RPC 框架,今天总算将其开源出来,希望对小伙伴们有帮助。

虽说RPC 的原理实际不难,但是,自己在实现的过程中自己也遇到了很多问题。Guide-rpc-framework目前只实现了 RPC 框架最基本的功能,一些可优化点都在下面提到了,有兴趣的小伙伴可以自行完善。

介绍

Guide-rpc-framework 是一款基于 Netty+Kyro+Zookeeper 实现的 RPC 框架。代码注释详细,结构清晰,并且集成了 Check Style 规范代码结构,非常适合阅读和学习。

由于 Guide 哥自身精力和能力有限,如果大家觉得有需要改进和完善的地方的话,欢迎将本项目 clone 到自己本地,在本地修改后提交 PR 给我,我会在第一时间 Review 你的代码。

我们先从一个基本的 RPC 框架设计思路说起!

一个基本的 RPC 框架设计思路

一个典型的使用 RPC 的场景如下,一般情况下 RPC 框架不仅要提供服务发现功能,还要提供负载均衡、容错等功能,这个的 RPC 框架才算真正合格。

一个完整的RPC框架使用示意图

简单说一下设计一个最基本的 RPC 框架的思路:

  1. 注册中心 :注册中心首先是要有的,推荐使用 Zookeeper。注册中心主要用来保存相关的信息比如远程方法的地址。
  2. 网络传输 :既然要调用远程的方法就要发请求,请求中至少要包含你调用的类名、方法名以及相关参数吧!推荐基于 NIO 的 Netty 框架。
  3. 序列化 :既然涉及到网络传输就一定涉及到序列化,你不可能直接使用 JDK 自带的序列化吧!JDK 自带的序列化效率低并且有安全漏洞。所以,你还要考虑使用哪种序列化协议,比较常用的有 hession2、kyro、protostuff。
  4. 动态代理 :另外,动态代理也是需要的。因为 RPC 的主要目的就是让我们调用远程方法像调用本地方法一样简单,使用动态代理屏蔽远程接口调用的细节比如网络传输。
  5. 负载均衡 :负载均衡也是需要的。为啥?举个例子我们的系统中的某个服务的访问量特别大,我们将这个服务部署在了多台服务器上,当客户端发起请求的时候,多台服务器都可以处理这个请求。那么,如何正确选择处理该请求的服务器就很关键。假如,你就要一台服务器来处理该服务的请求,那该服务部署在多台服务器的意义就不复存在了。负载均衡就是为了避免单个服务器响应同一请求,容易造成服务器宕机、崩溃等问题,我们从负载均衡的这四个字就能明显感受到它的意义。
  6. ......

项目基本情况和可优化点

最初的是时候,我是基于传统的 BIO 的方式 Socket 进行网络传输,然后利用 JDK 自带的序列化机制 以及内存直接存储相关服务相关信息来实现这个 RPC 框架的。

后面,我对原始版本进行了优化,已完成的优化点和可以完成的优化点如下。

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

项目模块概览

运行项目

1.导入项目

克隆项目到自己的本地:git clone git@github.com:Snailclimb/guide-rpc-framework.git

然后使用 IDEA 打开,等待项目初始化完成。

2.初始化 git hooks

“以下演示的是 Mac/Linux 对应的操作,Window 用户需要手动将 config/git-hooks 目录下的pre-commit 文件拷贝到 项目下的 .git/hooks/ 目录。

你需要执行下面这些命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
➜  guide-rpc-framework git:(master) ✗ chmod +x ./init.sh
➜  guide-rpc-framework git:(master)./init.sh

init.sh 这个脚本的主要作用是将 git commit 钩子拷贝到项目下的 .git/hooks/ 目录,这样你每次 commit 的时候就会执行了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cp config/git-hooks/pre-commit .git/hooks/
chmod +x .git/hooks/pre-commit

“抱怨:项目上一直用的 Gradle,很久没用 Maven 了,感觉 Gradle 很多方面都比 Maven 要更好用!比如 Gradle 的项目依赖文件build.gradle 比 Maven 的pom.xml更加清晰简洁(Maven 是因为 xml 的锅)、Gradel 还可以使用 groovy 语言......

pre-commit 的内容如下,主要作用是在提交代码前运行 Check Style检查代码格式问题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/sh
#set -x

echo "begin to execute hook"
mvn checkstyle:check

RESULT=$?

exit $RESULT

3.CheckStyle 插件下载和配置

IntelliJ IDEA-> Preferences->Plugins->搜索下载 CheckStyle 插件,然后按照如下方式进行配置。

CheckStyle 插件下载和配置

配置完成之后,按照如下方式使用这个插件!

插件使用方式

4.下载运行 zookeeper

这里使用 Docker 来下载安装。

下载:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker pull zookeeper:3.4.14

运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -d --name zookeeper -p 2181:2181 zookeeper:3.4.14

使用

服务提供端

实现接口:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class HelloServiceImpl implements HelloService {
   @Override
    public String hello(Hello hello) {
      ......
    }
}

发布服务(使用 Netty 进行传输):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HelloService helloService = new HelloServiceImpl();
NettyServer nettyServer = new NettyServer("127.0.0.1", 9999);
nettyServer.publishService(helloService, HelloService.class);

服务消费端

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ClientTransport rpcClient = new NettyClientTransport();
RpcClientProxy rpcClientProxy = new RpcClientProxy(rpcClient);
HelloService helloService = rpcClientProxy.getProxy(HelloService.class);
String hello = helloService.hello(new Hello("111", "222"));

相关问题

为什么要造这个轮子?Dubbo 不香么?

写这个 RPC 框架主要是为了通过造轮子的方式来学习,检验自己对于自己所掌握的知识的运用。

实现一个简单的 RPC 框架实际是比较容易的,不过,相比于手写 AOP 和 IoC 还是要难一点点,前提是你搞懂了 RPC 的基本原理。

我之前从理论层面在我的知识星球分享过如何实现一个 RPC。不过理论层面的东西只是支撑,你看懂了理论可能只能糊弄住面试官。咱程序员这一行还是最需要动手能力,即使你是架构师级别的人物。当你动手去实践某个东西,将理论付诸实践的时候,你就会发现有很多坑等着你。

大家在实际项目上还是要尽量少造轮子,有优秀的框架之后尽量就去用,Dubbo 在各个方面做的都比较好和完善。

如果我要自己写的话,需要提前了解哪些知识

下面这些是最基本的:

Java

  1. 动态代理机制;
  2. 序列化机制以及各种序列化框架的对比,比如hession2、kyro、protostuff。
  3. 线程池的使用;
  4. CompletableFuture 的使用
  5. ......

Netty

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

Zookeeper :

  1. 基本概念;
  2. 数据结构
  3. 如何使用Netflix公司开源的zookeeper客户端框架Curator进行增删改查;
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JavaGuide 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
guide-rpc-framework 源码学习
我:朋友圈有个程序猿花了2个月的头发写了一个 RPC 框架示例(代码地址:https://github.com/Snailclimb/guide-rpc-framework),刚刚下载到本地看着看着就【手动狗头】。
FoamValue
2020/08/31
1.1K0
手写了一个RPC框架
当开发一个单体项目的时候,大家肯定都写过类似的代码。即服务提供方和服务调用方在一个服务中
Java识堂
2020/11/03
4860
项目推荐 I 手写RPC框架(一)
RPC框架代码量较多,将仅对核心过程进行梳理,完整代码见:https://github.com/wdw87/wRpc
用户3946442
2022/04/11
1.2K0
如何手撸一个较为完整的RPC框架?
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/03/04
1.5K0
为了带你搞懂RPC,我们手写了一个RPC框架
远程服务调用(Remote procedure call)的概念历史已久,1981年就已经被提出,最初的目的就是为了调用远程方法像调用本地方法一样简单,经历了四十多年的更新与迭代,RPC 的大体思路已经趋于稳定,如今百家争鸣的 RPC 协议和框架,诸如 Dubbo (阿里)、Thrift(FaceBook)、gRpc(Google)、brpc (百度)等都在不同侧重点去解决最初的目的,有的想极致完美,有的追求极致性能,有的偏向极致简单。
PPPHUANG
2022/04/12
1.2K0
为了带你搞懂RPC,我们手写了一个RPC框架
远程服务调用(Remote procedure call)的概念历史已久,1981年就已经被提出,最初的目的就是为了调用远程方法像调用本地方法一样简单,经历了四十多年的更新与迭代,RPC 的大体思路已经趋于稳定,如今百家争鸣的 RPC 协议和框架,诸如 Dubbo (阿里)、Thrift(FaceBook)、gRpc(Google)、brpc (百度)等都在不同侧重点去解决最初的目的,有的想极致完美,有的追求极致性能,有的偏向极致简单。
Rude3Knife的公众号
2022/04/28
4340
为了带你搞懂RPC,我们手写了一个RPC框架
从零开始实现RPC框架 - RPC原理及实现
RPC(Remote Procedure Call)即远程过程调用,允许一台计算机调用另一台计算机上的程序得到结果,而代码中不需要做额外的编程,就像在本地调用一样。
李海彬
2018/07/26
1.3K0
从零开始实现RPC框架 - RPC原理及实现
自己实现一个RPC框架 顶
RPC框架称为远程调用框架,其实现的核心原理就是消费者端使用动态代理来代理一个接口的方法(基于JDK的动态代理,当然如果使用CGLib可以直接使用无接口类的方法),通过加入网络传输编程,传输调用接口方法名称,方法参数来给提供者获取,再通过反射,来执行该接口的方法,再将反射执行的结果通过网络编程传回消费者端。
算法之名
2020/06/11
4260
手写RPC框架指北另送贴心注释代码一套
Angular8正式发布了,Java13再过几个月也要发布了,技术迭代这么快,框架的复杂度越来越大,但是原理是基本不变的。所以沉下心看清代码本质很重要,这次给大家带来的是手写RPC框架。
全菜工程师小辉
2019/08/16
6780
【RPC 专栏】简单了解RPC实现原理
中文详细注释的开源项目 Java 并发源码合集 RocketMQ 源码合集 Sharding-JDBC 源码解析合集 Spring MVC 和 Security 源码合集 MyCAT 源码解析合集 时下很多企业应用更新换代到分布式,一篇文章了解什么是RPC。 原作者梁飞,在此记录下他非常简洁的rpc实现思路。 核心框架类 /* * Copyright 2011 Alibaba.com All right reserved. This software is the * confidential a
芋道源码
2018/06/12
1.8K0
RPC框架原理与实现
RPC,全称 Remote Procedure Call(远程过程调用),即调用远程计算机上的服务,就像调用本地服务一样。那么RPC的原理是什么呢?了解一个技术最好的思路就是寻找一个该类型麻雀虽小五脏俱全的开源项目,不负所期,找到一个轻量级分布式 RPC 框架,本文从这个项目入手来解读RPC的原理及其实现。 其实说到RPC,大家应该不会陌生才是,以往流行的Web Service就是一种RPC,一般来说RPC 可基于 HTTP 或 TCP 协议,因为Web Service 基于HTTP,所以具有良好的跨平台性
JadePeng
2018/03/12
2.3K0
RPC框架原理与实现
Netty实现一个简单的 RPC
众所周知,dubbo 底层使用了 Netty 作为网络通讯框架,而 Netty 的高性能我们之前也分析过源码,对他也算还是比较了解了。今天我们就自己用 Netty 实现一个简单的 RPC 框架。
用户5224393
2019/08/12
4160
Netty实现一个简单的 RPC
带你手把手实操一个RPC框架
首先从个人成长角度,如果一个新时代码农能清楚的了解RPC框架所具备的要素,掌握RPC框架中涉及的服务注册发现、负载均衡、序列化协议、RPC通信协议、Socket通信、异步调用、熔断降级等技术,可以全方位的提升基本素质。
得物技术
2022/12/13
1.2K0
带你手把手实操一个RPC框架
通过 Netty、ZooKeeper 手撸一个 RPC 服务
使用 Netty、ZooKeeper 和 Spring Boot 手撸一个微服务框架。
Yano_nankai
2021/05/08
1.2K0
通过 Netty、ZooKeeper 手撸一个 RPC 服务
【Netty】04 - 利用netty搭建类似于dubbo的rpc框架
学自蚂蚁课堂项目 项目地址: dubbo原理图 搭建dubbo rpc远程调用框架的思想 搭建dubbo-server 自定义rpc注解,在需要注册到zk上的类加,标识此类需要注册到zk上 将本地服务
envoke
2020/09/17
6110
【Netty】04 - 利用netty搭建类似于dubbo的rpc框架
100行代码透彻解析RPC原理
本文主要论述的是“RPC 实现原理”,那么首先明确一个问题什么是 RPC 呢?RPC 是 Remote Procedure Call 的缩写,即,远程过程调用。RPC 是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而开发人员无需额外地为这个交互编程。
Java技术江湖
2022/02/17
7140
100行代码透彻解析RPC原理
花了一星期,自己写了个简单的RPC框架
学了netty框架以及看了一下一小部分的netty框架的源码,听说dubbo是基于netty框架的一个优秀的落地实现,所以看了一小部分dubbo的源码,感觉学习netty总要有一个方式证明自己曾经学过,所以写下这一篇小笔记,写给自己看。
CBeann
2023/12/25
2380
花了一星期,自己写了个简单的RPC框架
RPC 实战与原理
核心理念:调用链,全局唯一的 ID 将同一请求串联起来,从而还原调用关系,统计系统指标。
Yano_nankai
2021/01/26
6250
RPC 实战与原理
教你用 Netty 实现一个简单的 RPC!
众所周知,dubbo 底层使用了 Netty 作为网络通讯框架,而 Netty 的高性能我们之前也分析过源码,对他也算还是比较了解了。今天我们就自己用 Netty 实现一个简单的 RPC 框架。
Java技术栈
2019/11/14
5070
造个轮子之基于 Netty 实现自己的 RPC 框架
服务端开发都会或多或少的涉及到 RPC 的使用,当然如果止步于会用,对自己的成长很是不利,所以楼主今天本着知其然,且知其所以然的精神来探讨一下 RPC 这个东西。
haifeiWu
2018/09/11
5310
造个轮子之基于 Netty 实现自己的 RPC 框架
相关推荐
guide-rpc-framework 源码学习
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验