guide-rpc-framework 源码学习
老婆:你为什么跪着写文章?
我:朋友圈有个程序猿花了2个月的头发写了一个 RPC 框架示例(代码地址:https://github.com/Snailclimb/guide-rpc-framework),刚刚下载到本地看着看着就【手动狗头】。
GitHub 上的开源项目,我最喜欢的那种 star 多于 1k 的,其次是 README.MD 有文字带图片的。前者,是拥有千名程序员的点[jia]赞[xing];后者,是作者走心了。guide-rpc-framework 新鲜出炉,star 较少属于后者。
项目模块
guide-rpc-framwork 是基于 Netty、Kyro、Zookeeper 实现的 RPC 框架。
- example-client 示例客户端
- example-service 示例服务端
- hello-service-api 存放服务接口
- rpc-framework-common 实例对象、枚举、工具类
- rpc-framework-simple RPC 框架核心实现类
项目模块是非常简练的,如果换成是我这种强迫症患者来分的话,还是会增加一个 rpc-framework-parent 模块(虽然 rpc-framework-parent 这个模块没什么用处)。
REAMDE.md 有完整的教程(包括 Zookeeper 安装等等),这里就不再赘述了。还没有项目经验的新手,可以 fork 参与开源项目开发哦。
RPC 核心框架
RPC-FRAMEWORK-COMMON
简洁干练的 common 工程,约定了 RPC 错误信息、响应错误码枚举,RPC、序列化的自定义错误,单例工厂类,线程池、zookeeper 工具类。
RPC-FRAMEWORK-SERVICE
RPC 框架的核心实现类。保存服务端注册的实例,并提供动态代理的方式用于客户端发送请求(socket、netty 方式)到服务端。
同时,提供了 Zookeeper 的服务注册、kyro 序列化与反序列化的能力。
示例使用
EXAMPLE-SERVER
RPC 服务端,使用 netty、socket 两种注册方式提供服务。
public static void main(String[] args) {
HelloService helloService = new HelloServiceImpl();
NettyServer nettyServer = new NettyServer("127.0.0.1", 9999);
nettyServer.publishService(helloService, HelloService.class);
}
public static void main(String[] args) {
HelloService helloService = new HelloServiceImpl();
SocketRpcServer socketRpcServer = new SocketRpcServer("127.0.0.1", 8080);
socketRpcServer.publishService(helloService, HelloService.class);
}
EXAMPLE-CLIENT
RPC 客户端,使用 netty、socket 两种客户端方式发送请求到服务端。
public static void main(String[] args) {
ClientTransport rpcClient = new NettyClientTransport();
RpcClientProxy rpcClientProxy = new RpcClientProxy(rpcClient);
HelloService helloService = rpcClientProxy.getProxy(HelloService.class);
String hello = helloService.hello(new Hello("111", "222"));
//如需使用 assert 断言,需要在 VM options 添加参数:-ea
assert "Hello description is 222".equals(hello);
for (int i = 0; i < 50; i++) {
String des = helloService.hello(new Hello("111", "~~~" + i));
System.out.println(des);
}
}
public static void main(String[] args) {
ClientTransport clientTransport = new SocketRpcClient();
RpcClientProxy rpcClientProxy = new RpcClientProxy(clientTransport);
HelloService helloService = rpcClientProxy.getProxy(HelloService.class);
String hello = helloService.hello(new Hello("111", "222"));
System.out.println(hello);
}
小结
写到这里,腿脚已经麻木了。有的程序员两个月能产出优质的框架代码,而我沉迷于猛男捡树枝不能自拔
。
这个周末,又一次成功“强迫”自己学习。
- NodeJS 应用仓库钓鱼
- Codeforces 626D Jerry's Protest(暴力枚举+概率)
- CodeM美团点评编程大赛初赛B轮 黑白树【DFS深搜+暴力】
- Uva 10339 - Watching Watches【数论,暴力】
- Codeforces 626E Simple Skewness(暴力枚举+二分)
- 如何启用Windows 10客户端Hyper-V
- 51Nod 1632 B君的连通(递归,快速幂)
- 51Nod 1046 A^B Mod C(日常复习快速幂)
- EntityFramework 外键值映射
- Codeforces 626C Block Towers(二分)
- 51Nod 1004 n^n的末位数字(日常复习快速幂,莫名的有毒,卡mod值)
- kmp模版
- 触发器在渗透中的利用
- Codeforces 626B Cards(模拟+规律)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- functional 和 bind 用法
- Flutter基础widgets教程-FittedBox篇
- muduo Dispatcher消息分发器 通过多态和模板进行向上类型转换
- Flutter基础widgets教程-FloatingActionButton篇
- VBS基础篇 - 对象(3) - FileSystemObject对象
- vbs 实现文件夹拷贝--采用堆栈不递归
- vbs - 一个简单的栈 -- 只能存储类对象
- Flutter基础widgets教程-FlutterLogo篇
- 配置压缩版mysql 5.7以上版本
- nutz 自定义sql的使用
- nutz 中 子模块 参数的使用。
- java向mysql插入数据乱码问题解决
- java向数据库中插入中文出现乱码
- Flutter基础widgets教程-FractionallySizedBox篇
- 关于myeclipse控制台输出中文乱码的问题