说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

如何基于Vert.x实现远程调用?

HTML文档下载 WORD文档下载 PDF文档下载
Vert.x是一款基于JVM的轻量级、非阻塞、高并发的异步应用开发框架,旨在为现代移动、Web以及企业应用设计而来。Vert.x的核心是用Java编写的。

Vert.x的微服务

最近关于微服务的概念到处都在宣传,而Vert.x的verticle本身就是很好的一种服务定义,你可以把verticle看成一个service,也可以把verticle看成一个actor。这样你的视角会切到Actor模型里。本文我们将讨论如何基于Vert.x实现远程调用。

传统Java开发人员受EJB以及Spring的影响比较深,所以对面向接口编程了解的比较多。哪怕跨JVM也可以通过接口来调用对方提供的方法。这是非常友好方便的开发方式,因为框架层面做了服务发现以及服务生命周期的管理。

Vert.x本质上可以通过verticle来定义服务边界,通过EventBus来包装并提供服务,消费端可以根据EventBus的Address来调用暴露出来的服务。而服务的发现以及隐藏则由Vert.x包装掉,乍一看一切都显得很自然,仿佛Vert.x就是为微服务而生的。

Vert.x EventBus两宗罪

但Vert.x的EventBus有两点不太好的地方,导致不能原生支持面向接口的服务调用。

EventBus是Vert.x的核心,因为它的存在可以使得系统模块化解耦成为可能,同时也可以将业务水平扩展。我们只需要定义EventBus地址然后传入Json对象就可以,所有的事情都很流畅。但是这里有一点不太好的地方,默认传输协议走Json,而Json本身不太好定义数据类型。

如果了解Vert.x历史的同学肯定知道为什么EventBus一定要使用Json作为主要的传输对象——为了兼容其他JVM上的弱语言。可是现实情况中80%的项目都是基于Java跑的,根本就没有考虑去兼容其他JVM上的语言。这就造成了一种尴尬,大家都传Json对象,然后在Handler里先做一次转换,将Json对象转换成POJO,之后再做业务上的逻辑。这里明显在Handler里做了很多与业务无关的事情,服务定位与对象转换,这些本质上应该是框架层面去解决的。

不能隐试的将Json对象转成POJO这是EventBus的一宗罪。(Vert.x3可以直接接受POJO,但是针对一个address,只能接收一种POJO格式。)另外当我们使用EventBus的时候不能很方便的确定方法逻辑,简单的讲我只能EventBus。send()后面跟地址参数以及JSON对象,而这并不适合描述业务,这是EventBus的二宗罪。

举个例子,有一个业务逻辑,对用户的账户进行存款与取款这两个操作,如果用Java接口来描述就很Easy。

interface Account {void saveMemory(int total);void withdrawMemory(int total); }

如果换成EventBus你会发现没办法定义行为的名称(Java的方法),只能通过eb.send("address", json)来调用目标接口。这里的json也许得包含method的描述。这样会显得很啰嗦,关键是对IDE不友好,重构起来不方便,严重影响团队开发流畅度。

看到这里大家也许已经有点明白了,如果能够做到RPC调用,那会非常方便我们开发。

Vertx-RPC介绍

介于上面的原因,我们开发了一个简单的RPC框架,它简单的封装了EventBus,使之可以包装成Java的接口。这样客户端与服务端之间调用就像本地接口一样。 vertx-rpc其实做的非常简单,他只依赖protostuff,作为数据传输的协议,当然也可以使用JSON协议。接着只需要定义好接口,然后在服务端实现接口,而客户端只依赖接口,单独将项目打包成jar暴露给出来就可以使用了。

我们继续上面的例子,根据接口我们会把项目分成两个Maven模块。SPI,SPI-impl,在parent的pom.xml定义好即可。下面我们先在impl的项目里启动好service并通过EventBus暴露服务。

Vertx vertx = Vertx.vertx();String address = "serviceAddress";RPCServerOptions rpcServerOptions = new RPCServerOptions(vertx).setBusAddress(address).addService(new MyServiceImpl());new VertxRPCServer(rpcServerOptions);

以上四行代码就已经成功的定义了服务,是这里要注意new MyServiceimpl()必须实现spi项目里的MyService接口。下面我们来看调用方,怎么调用服务。

Vertx vertx = Vertx.vertx();String address = "serviceAddress";RPCClientOptions<MyService> rpcClientOptions = new RPCClientOptions<MyService>(vertx).setBusAddress(address).setServiceClass(MyService.class);MyService myService = new VertxRPCClient<>(rpcClientOptions).bindService();

这里本质上是两行代码,一行定义了rpcClient的配置通过RPCClientOptions,另外一行直接绑定服务,通过VertxRPCClient。bindService()。最后得到了接口MyService。下面你就可以在客户端直接调用服务端的接口了,一切又回到了以前的面向接口编程。

这里有个完整的项目例子。我们把项目里的SPI定义接口,里面除了接口,还包含接口用到的对象以及异常。以后所有的操作都是面向这个SPI来做,service-impl就实现了其接口,outer-invoker其实是外部的service依赖接口来调用service-impl。这便是完全面向接口编程。

vertx-rpc除了包装EventBus使之可以通过Java标准方法调用外,还可以通过注解来定义每一个方法的超时时间。

@RequestProp(timeout = 1, timeUnit = TimeUnit.SECONDS, retry = 2)void hello(String what, Handler<AsyncResult<String>> handler);

这里就对hello方法定义了超时时间,以及超时重试次数,非常方便用于幂等的方法。上面的方法第二个参数是Vert。x的handler回调,这里也可以使用RxJava或者Java8的CompletableFuture

Observable<String> hello(String what)//或者CompletableFuture<String> hello(String what)

具体可以参考项目例子。


刘小溪

作者简介:

刘小溪,leap.as高级Java工程师,关注Java异步高性能框架Vert.x以及容器化技术Docker,喜欢函数式语言。更多请参阅刘小溪个人博客:http://www.streamis.me/。

PS:对Vert.x感兴趣的开发者朋友,可以移步去Vert.x Meetup#3,现场与大牛们零距离探讨技术问题,聆听Vert.x的最佳实践,您也可以成为vert.x模块的贡献者。


如果你或者你的团队有不错的开发工具、Web开发框架、语言编译器等,欢迎与我联系,我们将挖掘您背后的开发故事,让更多人了解并喜欢上你的应用。(投稿或寻求报道请与我联系:xiamz#csdn.net 注:请将#改为@。)

(责编/夏梦竹)

如何给苹果提交Bug或功能需求? 深入钻研Augular两年 谈谈其究竟适用于哪些场合 唐巧:谈谈React Native 在Swift中,如何更优雅地处理网络返回数据? Spark生态系统解析及基于Redis的开源分布式服务Codis 阿里巴巴技术专家杨晓明:基于Hadoop技术进行地理空间分析 Bowery为什么放弃Node.js,转向Go? 《近匠》有了APM,用户快到碗里来——专访听云CTO Wood 联通WO+梦工厂唐敏:走进厦门 构建移动数字生态 HTML5 VS 原生,世界究竟是谁的? 完全开放 微软开源.NET Core的执行引擎CoreCLR Swift与Objective-C的兼容“黑魔法”:@objc和Dynamic 网络技术,从“数制”开始学起——跟随王达老师一步步学习 UPYUN CTO黄慧攀:UPYUN这些年,一段“刚好”的旅程 2015移动游戏重中之重:需成功把握1%付费用户的心 UNITE 2015 BEIJING 20大议题首爆 死路一条?智能硬件免费没有未来 APICloud推出“模块 Store” 公布APP创业 “Time to Market”战略 极路由加入海尔U+联盟 可跨品牌控制多款家居设备 《近匠》Amaze UI:做最懂中国程序员的开源HTML5框架 Testin CTO徐琨:要做测试领域的阿里云! TIOBE 2015年2月编程语言排行榜:JavaScript排名达历史最高点 机智云发布第二代GoKit开发板,兼容Arduino与Intel Edison 计算机视觉,让冰冷的机器看懂这个多彩的世界 昔日学霸反哺教育 打造教育领域今日头条 第三方DevOps实践报告发布 84%中国企业预将受益 《程序员必读之软件架构》作者Simon Brown:架构师与程序员的区别 Xcode 6.3 Beta发布,Swift 1.2带来哪些新变化? 应用生与死:移动测试究竟该怎么搞? Chrome将跟SPDY说再见,拥抱HTTP/2 ImageNet挑战赛中超越人类的计算机视觉系统 求助jb9的破解 报表问题,急呀,救命呀~~~55555~~~~ 500分求解决一个问题 在线等待 解决立即给分 2003下为什么我的声卡不能用? 在程式AAA.PRG中如何修改表的字段的類型,比如字段C類型改為N類型??很急!!! 为什么有时候成员函数或变量显示不出来 救命!我在程序中使用webbrowse控件………… 在线等待。 也许是一个很简单的问题! 连接mysql出错 寻关于工控的中英文对照资料 想在暑假打工(计算机方面的)需要什么条件啊? 关于SQL SERVER的疑难问题!来者有分!(在线等待!分数不够可以再加) MTS与线程——高分相赠!!!! 来看看啊,告诉我再哪里下就给分啊~~ 大对象问题,所有书都是这么说的,可是都作不成功? 如何指定tquery中的某一行? 如何通过API发送翻页按键给控件? 在jbuilder 中 不能通过 创建Ejb Tester对EntityBean进行测试吗?SessionBean都可以的 如何在ie中点右键获得这个ie窗口的window Text以及其主框架的URL。 关于Kdevelop开发 大家讨论一下项目负责人到底该赚多少钱(年薪)? ★★★★★如何在文件下载完毕后自动关闭浏览器??★★★★★ #### 关于CWebBrowser控件 #### 兄弟我要做一个网上银行系统,需要做压力测试,各位有过这样的经验吗??怎么来测试,用什么工具来进行并发访问压力测试? 兄弟我要做一个网上银行系统,需要做压力测试,各位有过这样的经验吗??怎么来测试,用什么工具来进行并发访问压力测试? 菜鸟问题,在线等待,如何让JList显示带gif的文字啊? delphi+access 用ADO连接,为什么在SQL语句中用SUM()时,执行出错?送分 为什么我make时,有错误:'class' or 'interface' expected Dreamweaver mx自带的制作下拉菜单的部题? Interbase字段类型有多少,就这些吗??急呀 Sybase:怎样知道本地的哪些数据库文件已经被连接,和连接的DBN,DBF,ENG。无论是Central还是其他应用打开的,我咨询Sybase公司,还不行 请问如何用ASP.NET或ASP发送会议要求和约会 怎么样在网页上插一个FLASH动画呢 小问题,很快结帖 为什么会出InvocationTargetException ***急购vb6.0控件参考,MFC类库大全(上,下),运行库大全(希望) Applet向Servlet发消息,分别发post和get请求,请问该如何实现 请教,DataGrid实现分页后怎么保存 每一页DataGrid里的checkbox的状态 关于多个radiobuttonlist的选择问题。 Server.CreateObject("LyfUpload.UploadFile") 怎样动态的创建ado.net中的dataadapt和dataconnection? 可不可以在微软的中文网站上找到中英文的技术文章,asp是微软的技术吧? 请问如何将owc生成的图表赋不同的颜色 保存jsp文件时遇到问题,help frame中的数据传递 今天做舅舅了!!! 哈哈,我要当干妈啦:D 任何定义一个动态的结构体数组 大侠,求救,如何将英文的sql7.0的备份文件恢复到sql 2000中。来者有分。 如何用HttpResponse.Redirect()打开新的窗口 请问JBuilder错误提示:cannot access directory javax\mail at line 7, column 1 一次函数的关系式的问题已知一次函数的图象经过点A(-1,3)和点B(2,-3),求:(1)一次函数的关系式(2)判断点C(-2,5)是否在该函数图象上 第一单元复习-五年级备课室-小学语文教育教学的 没有世上两个人会用同一种方式读同一本书的名言是什么? 备课组内如何进行合作 请各位高手帮忙做11个选择题,急等~ 脚裸是身体的哪里啊我一直不知道脚裸是在哪里 光不沿直线传播会怎么样3个合理场景. 成语晨什么暮什么 关于解直角三角形的题,已知在△ABC中,∠A、∠B、∠C对边分别为abc;关于x的一元二次方程x²-(c+4)x+4c+8=0的两根为a、b,且9c=25a*cosB1、判断△ABC的形状2、求a、b、c的值 光在何时会沿直线传播?光只有在真空中才沿直线传播, "晨"字开头的成语?有没有晨字开头的成语帮忙写一下~ 学过《走遍美国》的进啊大家认为《走遍美国》能提高语法吗?有人说《走遍美国》太口语化了……只能提高听力和口语,对语法没什么帮助你们认为呢?我觉的里面还有很多语法知识啊大家给 南开区 教学质量监测 第五组 作文记一次校园升旗仪式(场面描写) 怎样选择初中体育教学内容 谁有人教语文六年级上册第五课詹天佑的备课 写一次难忘的升旗仪式400字作文有趣 已知AB=AC,D是AB上的一点,DE⊥BC于E,ED的延长线交CA的延长线于F,试说明△ADF是等腰三角形的理由.不好意思,刚刚的问题提错了,这个才是的。抱歉。如图所示,在△ABC中,∠ACB=90°,点D,E在AB上 平行四边形的一个角与它的对角的和是150°,那么这个角是()度,与他相邻的角是()度如题. 记一次升旗仪式400 什么是爪型趾 证明:两组对角的角平分线平行的四边形为平行四边形 300字作文题目《记一次升旗仪式》的作文有哪些 怎样才能使脚甲趾长得快点我的脚甲给拔了,怎样才能加快脚甲生长呢?还有医生给我贴的棉粘在甲床上,会不会影响新的脚甲生长啊? 伊利运河是哪国的﹖ 简单的填空:一次函数和一元一次函数的关系由于一元一次方程都可以写成( )的形式,所以解一元一次方程可以转化为:当( )时,求( )的值.从图象上看,这相当于已知( ),确定( )的 1、简述园林与绿化的关系. 美国伊利偌斯在什么地方,芝加哥吗 走遍美国有用吗 体育生怎样写保证书 试说明伊利运河对美国社会经济的地理意义? 美术教学的备课过程 体育保证书150字怎么写 伊利运河作用 第28届楚才作文竞赛获奖名单!哪有?到博奥论坛去看,那有完整版的.博奥论坛-竞赛专区-语文-----------------------------------------------------------------------------------第28届楚才作文竞赛获奖名单(小学 体育生回队训练怎么写保证书? 与PCAGCT互补的DNA序列是 最美的棉花糖作文600字左右........越快越好..... 斯洛克时 红球进后 打彩球时 本来打黑球 但把蓝球打中 这该怎么算 集体备课是提高备课质量的重要备课形式.它可集思广益,将个人才智转化为集体优势,共同提高教学质量.但是有没有一种方式,可以省时省力,节约经费,资源共享,利于保存呢? 从五里店西到卢沟桥怎么走 这个字怎么读 互补的定义.书上证明的过程中有一步是"...(互补的定义)."互补的定义具体是什么吗?以前学过,但是我忘了.顺便问下,怎么打出角的符号和所以,因为的那3个点? 斯诺克中打红球时,白球先打中红球,再碰到粉球,再碰到黑球,然后白球落袋(彩球没有落袋),罚几分如题 亿、十亿、百亿、千亿是位数吗? 请解这道题,谢谢了. 28届楚才作文竞赛获奖名单什么时候出来 个十百千万 十万 百万 千万 亿 十亿 百亿 千亿 后面3位是什么啊? 答案要求几千个字.运河申遗将“京杭大运河”扩容为“中国大运河”的意义何在?运河申遗将“京杭大运河”扩容为“中国大运河”的意义何在?给我几千字 不要只敷衍的回答 如图,已知AB=AC,D为AB上一点,DE⊥BC,ED的延长线交CA的延长线于点F,则△ADF是等腰三角形吗?为什么? 英语翻译如题,一定要准确,.等待中.先谢过了. 运河申遗将“京杭大运河”扩容为“中国大运河”的意义何在?如果把长城比做中原王朝防御的盔甲,运河比做生命的血液,结合中国历史谈谈你的理解. 已知AB=AC,D是AB上的一点,DE垂直于BC于E,ED的延长线交CA的延长线于F,那么三角形ADF是等腰三角形吗?为什么? "中外名师"翻译成英文,用在教育类名师名校的用法,直接拿翻译软件类的就免了吧.在线等,着急用.先谢谢啦.感谢大家的参与,这个要作为一本杂志的书名 世界上有哪些运河?与我国的京杭运河有什么不同? 已知AB=AC,D是AB上的一点,DE垂直于BC于E,ED的延长线交CA的延长线于F,那么三角形ADF是等腰三角形吗?有急用 语文阅读课文教学比赛五年级下册上哪篇课文好?阅读课应该怎样上?生字还要讲吗?要是有阅读课文比赛的教学视频就好了,我是新老师,根本摸不着北. 如何加强备课组建设 已知AB=AC,D是AB边上一点,DE⊥BC于点E,ED的延长线交CA的延长线于点F,试说明三角形ADF是等腰三角形 求六年级课文《各具特色的民居》的备课案 如何加强教研组备课组建设 中央气象台发霾黄色预警 京津等局地或阿根廷学者认为克里斯蒂娜连任机会渺茫伊拉克北部摩苏尔发生自杀式汽车炸弹袭印度东北部城市发生连环爆炸5人死亡“双年展专业户”卢昊:城市化进程使多浙台经贸合作平台发展规划首次发布浙商大会马云成热词 专家论创新力挺淘第二届世界浙商大会 杰出浙商获得者热国际财经一周大事预报美被曝曾就监听亚太寻日本协助尼日利亚多地暴发霍乱疫情 已造成百余杭州绕道上海直飞高雄迎“低票价时代”男子辞公务员被认“异类”:压力大不如伊拉克首都系列爆炸致29死88伤美国记者出书曝卡斯特罗曾否认涉肯尼迪伊拉克首都发生多起汽车炸弹爆炸 至少近年典型捂堵拖事件盘点:山西2起事故第九届两岸经贸文化论坛提出19条共同河南连霍高速大桥炸塌事件至今未公布处纽约华裔社区发生命案5人被杀 死者包伊拉克首都发生多起汽车炸弹爆炸 至少同事们都叫他“鲁神仙”春节去哪儿 家门口马上精彩天底下最重要的会定制公交首条线路23日试运营英拉已做好下台准备买回的年糕竟有两个生产日期点击北京孙悟空和九尾狐恋爱 这事吴承恩知道“单独二孩”开放后或将取消头胎准生证《熊出没》,羊危险冯小刚也不怕骂 弄成啥样都会挨骂拒不整改者惩罚无上限网传春晚节目单 你满意吗汉口江滩芦苇又被人为点燃踏访金三角 寻找美斯乐过年大餐 岂能少了舌尖之旅50岁“阔太太”遭遇乳腺癌侵袭杨幂怀孕三个月忙着赚奶粉钱超市摆“夜宴”方便打年货女孩当场翻脸闹分手社区少儿冬令营 孩子们重温老玩具
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘