正文
netty实战--手写rpc框架
顶
原
荐
字数 1151
阅读 1150
收藏 28
点赞 1
评论 0
Netty
华为云开发者4大福利:2核4G云主机、DevCloud、应用服务、培训课程 免费领取 >>>
在看此篇内容时需要浏览下面内容
从零开始学netty——如何面对粘包和拆包
从零开始学netty——自定义协议rpc大家大概都听说过,远程过程调用。简单来说,就是我的一个操作是远程操作的给的结果,举个例子,考试作弊,你把考题发出去了,你同学帮你做好把答案传输给你,然后你就把答案写上,那么在判卷老师眼里,你回答的还不错,但是,其实你是做了远程过程调用的。
rpc的好处也在上面的例子中体现了,当自身能力不行的时候,可以依靠强大的远程力量来做到结果。如果自己有能力回答卷子,那就没必要走rpc了。换句话说就是
自身执行的消耗 > 别人执行的消耗+传输的消耗
rpc的要点
这里就是建立连接的过程,代码都比较套路,这里不列举。最后会贴出代码地址的,这里先通思路。序列化没有选择pb,而是选择了protostuff,这里得解释一下原因。
既然是方法调用,一个方法的唯一标志是类名,方法名,参数类型。你还得把方法参数也传递走。
private String id; private String className; private String methodName; private Object[] args; private Class<?>[] parameterTypes;
这里还有传输一个id,是为了做标志,例如我发了题目出去,最希望的就是回到我的是第4题答案是什么,而不是xxxx问题的答案是什么。id就是唯一表示一次问题的。
大家也发现了里面有Object类型和Class类型,这些类型是pb里没有的,所以此时pb就不适合作为序列化的选择了。
收到的就比较简单了,就是唯一的id以及结果
private String id; private Object result;
netty的返回的结果是在handler里,而不是我们的业务线程,如何传递就成为了一个问题。上面的唯一的id就是解决的关键点,我选择了SynchronousQueue来作为传递的媒介,如果不了解这个类的可以先查看一下,他主要就是作为传递媒介的,有点类似阻塞队列。
private static ConcurrentHashMap<String, SynchronousQueue> mapInfo = new ConcurrentHashMap<>();
使用一个map来保存id,和传递媒介,业务线程只要拿着SynchronousQueue就好,等消息收到,就把结果放入SynchronousQueue中,业务线程就可以拿到结果了,与此同时,要把id从map里移除。
想做到方法调用,还扩充了部分功能,这个是装饰者或者代理模式的效果。因为这里只做一层包装,所以选择代理模式,如果是不断的扩充功能的情况,装饰者会更好一些。因为我们是java编写,动态代理就是一个不错的选择。
public static <T> T getProxy(final Class<T> clazz) { return (T) Proxy.newProxyInstance(clazz.getClassLoader(), new Class[] { clazz }, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { RpcRequest request = new RpcRequest(); request.setMethodName(method.getName()); request.setClassName(clazz.getName()); Class<?>[] parameterTypes = method.getParameterTypes(); request.setArgs(args); String id = UUID.randomUUID().toString(); request.setId(id); SynchronousQueue queue = new SynchronousQueue(); ResultInfo.putSunchronousQuee(id, queue); Client.write(request); return queue.take(); } }); }
这里使用了比较简单的方法,就是手动把服务加入。
public static void put(Object value) { Class<?>[] interfaces = value.getClass().getInterfaces(); for(Class<?> interfaceTmp:interfaces){ services.put(interfaceTmp.getName(), value); } }
这里选择把接口作为key,对象作为value。如果结合spring就可以更简单一些,通过注解来做,不用自己手动写了。
这里实现的rpc的基础功能,就是远程调用。技术点就在动态代理和消息通讯上。动态代理的目的是为了让rpc在调用的时候更简单,通讯部分才是rpc的主要点,通过反射等方式,让远程的机器进行运算,并且返回结果。所有的代码如下: https://github.com/xpbob/lightrpc
© 著作权归作者所有
共有人打赏支持
粉丝 74
博文 71
码字总数 57378
作品 0
相关文章 最新文章
源码系列 手写spring mvc框架 基于Spring JDBC手写ORM框架 实现自己的MyBatis Spring AOP实战之源码分析 Spring IOC高级特性应用分析 ORM框架底层实现原理剖析 手写Spring MVC框架实现 手把手...
茶轴的青春 ⋅ 04/17 ⋅ 0
具有一到五年开发经验 需要学习内容很多 JVM/分布式/高并发/性能优化/Spring MVC/Spring Boot/Spring Cloud/MyBatis/Netty源码分析等等等 01、透彻理解Tomcat原理手写动静态资源的实现 02、分...
阿阳啊啊 ⋅ 2017/11/29 ⋅ 0
手写了一个rpc 1.zookeeper注册发现服务; 2.common-pool管理netty-client链接; 3.netty nio异步通讯,通过notify实现同步调用 问题来了,上述RPC本地调用耗时400ms/100次,对比另一款rpc耗时...
许雪里 ⋅ 2015/11/06 ⋅ 0
源码系列 手写spring mvc框架 基于Spring JDBC手写ORM框架 实现自己的MyBatis Spring AOP实战之源码分析 Spring IOC高级特性应用分析 ORM框架底层实现原理剖析 手写Spring MVC框架实现 手把手...
美的让人心动 ⋅ 04/16 ⋅ 0
RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络,从远程计算机程序上请求服务,而不必了解底层网络技术的协议。说的再直白一点,就是客户端在不必知道调用细节的...
vshcxl ⋅ 2017/10/20 ⋅ 0
有人回答说这只能是大企业或者互联网企业工程师才能拿到。也许是的,小公司或者非互联网企业拿两万的不太可能是码农了,应该已经转管理。还有区域问题,这个不在我的考虑范围内,因为除了北上...
阿阳啊啊 ⋅ 2017/10/16 ⋅ 0
分布式架构 迎接高并发大数据的挑战,从深度到广度完善知识体系,成为下一个互联网高薪人才。 理论结合实战,透彻理解分布式架构及其解决方案。 面向人群 1、工作1-5年需要突破瓶颈; 2、传统...
Java高级架构 ⋅ 2017/12/21 ⋅ 0
Dubbo-G 详细介绍 Dubbo是一个被国内很多互联网公司广泛使用的开源分布式服务框架,即使从国际视野来看应该也是一个非常全面的SOA基础框架。作为一个重要的技术研究课题,在联想电商我们根据...
技术专家 ⋅ 2017/05/26 ⋅ 23
利用netty写了一个简单的RPC框架,纯粹是为了理解RPC框架。 使用protostuff 1.07 序列化,以netty 3.2.1 网络框架。 下载地址:https://github.com/stefzhlg/snrpc ##How to use e.g. 1,ser...
stefanzhlg ⋅ 2014/12/05 ⋅ 2
今天我们要来做一道小菜,这道菜就是RPC通讯框架。它使用netty作为原料,fastjson序列化工具作为调料,来实现一个极简的多线程RPC服务框架。 我们暂且命名该RPC框架为rpckids。 ...
深度学习 ⋅ 04/16 ⋅ 0
没有更多内容
加载失败,请刷新页面
加载更多下一页
Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《夜游记》- 水仙斗活佛 《夜游记》- 水仙斗活佛 手机党少年们想听歌,请使劲儿戳(这里) @Mr_李 : 这个会上热门么? @沉...
小小编辑 ⋅ 今天 ⋅ 5
准备资料 VS 2015,cocos2d 3.17,python 2.7.9(windows版本),安卓NDK,SDK,ant。 安装python的时候记得把最后一个Add python.exe to Path安装在本地硬盘上,默认是不安装的。 点击cocos2d根目...
算法之名 ⋅ 今天 ⋅ 0
编写切入代码 使用
黄柳淞 ⋅ 今天 ⋅ 0
参考:http://www.linuxidc.com/Linux/2016-07/133646.htm 安装过程遇到的问题 1 选择安装界面选择“Install CentOS 7”后,卡在: sd 8:0:0:0 :[sda] assuming drive cache:write through 解......
大熊猫 ⋅ 今天 ⋅ 0
我们平时提及Minor GC、Young GC、Major GC,它们之间的关系是怎样的呢? 如下图1所示,一图胜千言,这是JDK8之前的,JDK8上没有最右边的Perm区。 图1 Minor/Young/Major GC的关系 此图来自国...
汉斯-冯-拉特 ⋅ 今天 ⋅ 0
#include<stdio.h>#include<math.h>#define N 10000001bool prime[N];int main(){ long int i, j, ans = 0; for(i=2; i<N; i++) if(i%2) ......
临江仙卜算子 ⋅ 今天 ⋅ 0
序 本文主要研究一下HystrixMetricsPublisher HystrixMetricsPublisher hystrix-core-1.5.12-sources.jar!/com/netflix/hystrix/strategy/metrics/HystrixMetricsPublisher.java /** * Abs......
go4it ⋅ 今天 ⋅ 0
构建项目之前,本地需要安装环境:node.js; 在cmd窗口,通过 npm命令安装 vue-cli: npm install --global vue-cli 然后进入到项目根文件,执行以下命令,初始化项目: vue init webpack gar...
bug_404 ⋅ 今天 ⋅ 0
展开数组: 1. ...:[1,2,3,4]->....[1,2,3,4]->1,2,3,4,5 2. ...1,2,3,4,5->...1,2,3,4,5->[1,2,3,4,5] 剩余参数:必须放在最后 函数变化: 1.函数默认参数: function show({x=0,y=0}={}{ con......
kitty1116 ⋅ 今天 ⋅ 0
zblog是国内团队开发和打造的一款优秀的博客系统程序,一经发布便受到了很多博主的喜爱,安全做的比较好,程序使用比较简单,插件也比较多,适合我们这种技术小白来用,方便了很多爱写博客的...
原创小博客 ⋅ 今天 ⋅ 1
没有更多内容
加载失败,请刷新页面
加载更多下一页