同步操作将从 SnailClimb/guide-rpc-framework 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
如访问速度不佳,可放在 Gitee 地址:https://gitee.com/SnailClimb/guide-rpc-framework 。
大概 2 个月前,我说过要利用业余时间写一个简单的 RPC 框架,今天(2020-06-05)总算将其开源出来,希望对小伙伴们有帮助。
虽说 RPC 的原理实际不难,但是,自己在实现的过程中自己也遇到了很多问题。Guide-rpc-framework 目前只实现了 RPC 框架最基本的功能,一些可优化点都在下面提到了,有兴趣的小伙伴可以自行完善。
guide-rpc-framework 是一款基于 Netty+Kyro+Zookeeper 实现的 RPC 框架。代码注释详细,结构清晰,并且集成了 Check Style 规范代码结构,非常适合阅读和学习。
由于 Guide 哥自身精力和能力有限,如果大家觉得有需要改进和完善的地方的话,欢迎将本项目 clone 到自己本地,在本地修改后提交 PR 给我,我会在第一时间 Review 你的代码。
我们先从一个基本的 RPC 框架设计思路说起!
一个典型的使用 RPC 的场景如下,一般情况下 RPC 框架不仅要提供服务发现功能,还要提供负载均衡、容错等功能,这个的 RPC 框架才算真正合格。
简单说一下设计一个最基本的 RPC 框架的思路:
为了循序渐进,最初的是时候,我是基于传统的 BIO 的方式 Socket 进行网络传输,然后利用 JDK 自带的序列化机制 以及内存直接存储相关服务相关信息来实现这个 RPC 框架的。
后面,我对原始版本进行了优化,已完成的优化点和可以完成的优化点我都列在了下面 👇。
为什么要把可优化点列出来? 主要是想给哪些希望优化这个 RPC 框架的小伙伴一点思路。欢迎大家 Clone 本仓库,然后自己进行优化。
CompletableFuture
包装接受客户端返回结果(之前的实现是通过 AttributeMap
绑定到 Channel 上实现的) 详见:使用 CompletableFuture 优化接受服务提供端返回结果
RpcRequest
和 RpcReuqest
对象作为消息体,然后增加如下字段(可以参考:《Netty 入门实战小册》和 Dubbo 框架对这块的设计):
克隆项目到自己的本地:git clone git@github.com:Snailclimb/guide-rpc-framework.git
然后使用 IDEA 打开,等待项目初始化完成。
这一步主要是为了在 commit 代码之前,跑 Check Style,保证代码格式没问题,如果有问题的话就不能提交。
以下演示的是 Mac/Linux 对应的操作,Window 用户需要手动将
config/git-hooks
目录下的pre-commit
文件拷贝到 项目下的.git/hooks/
目录。
执行下面这些命令:
➜ guide-rpc-framework git:(master) ✗ chmod +x ./init.sh
➜ guide-rpc-framework git:(master) ✗ ./init.sh
简单介绍一下是怎么做的!
init.sh
这个脚本的主要作用是将 git commit 钩子拷贝到项目下的 .git/hooks/
目录,这样你每次 commit 的时候就会执行了。
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
检查代码格式问题。
#!/bin/sh
#set -x
echo "begin to execute hook"
mvn checkstyle:check
RESULT=$?
exit $RESULT
IntelliJ IDEA-> Preferences->Plugins->搜索下载 CheckStyle 插件,然后按照如下方式进行配置。
配置完成之后,按照如下方式使用这个插件!
这里使用 Docker 来下载安装。
下载:
docker pull zookeeper:3.4.14
运行:
docker run -d --name zookeeper -p 2181:2181 zookeeper:3.4.14
实现接口:
public class HelloServiceImpl implements HelloService {
@Override
public String hello(Hello hello) {
......
}
}
发布服务(使用 Netty 进行传输):
HelloService helloService = new HelloServiceImpl();
NettyServer nettyServer = new NettyServer("127.0.0.1", 9999);
nettyServer.publishService(helloService, HelloService.class);
ClientTransport rpcClient = new NettyClientTransport();
RpcClientProxy rpcClientProxy = new RpcClientProxy(rpcClient);
HelloService helloService = rpcClientProxy.getProxy(HelloService.class);
String hello = helloService.hello(new Hello("111", "222"));
写这个 RPC 框架主要是为了通过造轮子的方式来学习,检验自己对于自己所掌握的知识的运用。
实现一个简单的 RPC 框架实际是比较容易的,不过,相比于手写 AOP 和 IoC 还是要难一点点,前提是你搞懂了 RPC 的基本原理。
我之前从理论层面在我的知识星球分享过如何实现一个 RPC。不过理论层面的东西只是支撑,你看懂了理论可能只能糊弄住面试官。咱程序员这一行还是最需要动手能力,即使你是架构师级别的人物。当你动手去实践某个东西,将理论付诸实践的时候,你就会发现有很多坑等着你。
大家在实际项目上还是要尽量少造轮子,有优秀的框架之后尽量就去用,Dubbo 在各个方面做的都比较好和完善。
Java :
CompletableFuture
的使用Netty :
ByteBuf
介绍Zookeeper :
基本概念;
数据结构;
如何使用 Netflix 公司开源的 zookeeper 客户端框架 Curator 进行增删改查;
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。