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

如何基于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 注:请将#改为@。)

(责编/夏梦竹)

红包大战!双11过后,微信支付宝的又一个营销游戏 O2O大潮来袭,洗牌将至? 谈谈UI架构设计的演化 Node.js 开源基金会成立,Joyent让出领导权 LinkedIn分布式实时性能跟踪与效率优化实例 DIY机器人不是事!软硬两不误的开发平台RoboCORE 详解OS X和iOS图像处理框架Core Image 快的打车联合创始人兼技术副总裁闻诚:CTO要有“334”能力 阿里巴巴正式加入W3C,成为W3C会员 在Swift中,如何像Objective-C定义可选接口? DARPA:4年内推出具备触觉的机械手 Silver:用Swift编写iOS、Android和.NET应用 Swift没有异常处理,遇到功能性错误怎么办? 基于Python的测试驱动开发实战 不能守株待兔!移动互联网时代:产品找用户 淘汰传统屏幕,虚拟现实新纪元何时开启? 《近匠》SENSORO CTO赵东炜:解密iBeacon生态 我由Angular转向React,为什么? 产品设计中的九个注意事项 昂贵、复杂、不可靠!智能家居产品的尴尬现状 Facebook的CIO都做些什么? 穷游网CTO黄向阳:成果与价值是最好的驱动力 2015移动游戏行业方向标:创业者必须关注的几个领域 基于Python的行为驱动开发实战 面向WP和Android!微软车库发布多款免费应用 GRPC:谷歌发布的首款基于HTTP/2和protobuf的RPC框架 革命,就是现在!——CES 2015行纪 HTML5游戏引擎排行榜 Construct 2最受欢迎 2015手游营销新趋势:电视广告,及其投放逻辑 详解下一代开源混合应用框架Reapp 应用内一键交易!Google公布Android Pay项目 如何在程序部署时授予某文件夹对文件的写访问权? 不能重定向是什么原因? 想用Mediaplaer控件播放某个声音文件若干次,怎么控制? 如何通过窗口句柄来获得窗口所在进程的ID 怎么找到DataGrid中的Table呢? 请问用VB怎么才能把1个数据库里的表全部读入LISTBOX里? JmaiL 发邮件的问题?? 备份还原问题 如何用钩子得到中文啊? interbase的存储过程中如果想返回多条结果应该怎么办? 请问!谁能提供算命、测字等原代码和后台库!!500分相送!!!! 我的用客户端连上ORACLE,怎么我的SQLPULS打开中文全是乱码,执行语句后看不到结果是什么 方案讨论:如何自定义并实现错误与例外Exception处理对象,并建立里统一的ErrorMsg 读数据库错误??急急急,在线等(马上给分) 缓存 到的 是什么定义啊 (斑竹来 告诉我吧) 系统分析师、系统设计师有什么区别? DB2技术讨论(1)如何简单理解表空间的定义 vc的ado数据库连接问题 请问linux的个人版和服务器版到底有什么区别?? DB2技术讨论(2)如何简单理解表模式的定义 int& operator[] (unsigned i); 存储过程问题 DB2技术讨论(3)如何处理索引 马上结:我用ASP和JSP分别写了一个人主页,可是服务器只支持PHP,所以我要写PHP.. 我要构建一个网吧?回答问题者都有分 DB2技术讨论(4)如何处理大量数据的增删 郁闷,没有理由,再散分一百,随便进来聊聊 昨天真的真的受了刺激 怎樣將dbedit控件的事件和它所在的form方法相關起來? 如何实现DOS工作站连接到LINUX服务器 DB2技术讨论(5)如何在建好的数据库中设定数据库和表的维护信息 feeboby(诺曼之路) 请进,刚才IE出现js的问题,帖子结了,但分没加上去,另开新帖,100分送上 如何把两个系统合并为一个系统(两个独立的系统) 如何实现集成?? 请教一个apache2.0加tomcat4.3.x时访问目录控制问题 那里有Zend的反编译软件下啊? 大家给我提建议拉,java项目该如何做?交友 这样的asp.net程序消耗是不是太高? 满分求救: 通过 scope="session" 定义的bean 我想继续在包含页中使用。。 大家给个名字建议吧 BDE问题 那个说我骗你手提电脑的进来!!!!!!! 谁知道啊? 直接写内存的Win32 API? 向高手请教.NET下怎样实现聊天室功能? 请教一个apache2.0加tomcat4.3.x时访问目录控制问题 关于JFC的问题 如何鼠标指到单元格中,把单元格中的文字颜色改变 小弟菜鸟,请教一个小问题 初学者问题:关于Serialize()用法 寻求好的解决方法 新手求助?谁有较好的打印控件,或较好的解次方案? 尿的成分到底有没有氨气啊? 2012的太阳风暴全世界停一下电是不是就能避免电网受损害如题,除非那离子连任何金属都不放过 新加坡人头税?1.听说现在是每人240新币2.这个是由谁交?3.交了会退还吗?我听说好像是中介交吧(不确定)原来是150/人/月 蓝天白云,椰林树影,水清砂白,这是麦兜形容什么的?如题, “饬”什么意思 狷客是什么意思 “不知我之实狷”是什么意思?知道“狷”的意思,也知道“狷”是和“狂”相对的,但是“实狷”是什么意思呢,这句古话的整体意思又是什么呢? 2010年世界保护臭氧层日的主题是什么 谁能给讲下SAT OG 新版 P839 23到29的语法题. 无保饬回是什么意思 什么叫申饬? 女子坚持嫁给残障男友 坚贞真爱感动世策划暗杀曼德拉犯罪团伙获重判 主犯拒日媒:安倍将亲自向中国救人留学生颁发萌猫每天造访商店 望着橱窗里老鼠或鱼奥巴马医改网站安全漏洞细节曝光 内测伊拉克向美国请求军事援助 对抗“基地美一客机紧急迫降阿拉斯加偏远小镇 无年轻人使用手机成瘾 或因社交焦虑渴望英媒:美国窃听盟国收益是否大于成本存波士顿爆炸案后美警方为纽约马拉松投入印尼爆发全国大罢工 抗议租不起房吃不独家|中信证券首度披露为何要收购KV如何管理自己?(《哈佛商业评论》最受5个美国历史上的阴谋论,后来发现全是(内附视频)陈*冠*希坦言㊙ 降服你中汇国创:非农数据强援美指 金银反弹不得不看!细数运用3D打印技术的案例数据可视化是科学,也是艺术我看曹操56岁的麦当娜凭什么再度演绎范思哲广7年电商老兵总结的9条运营经验科学与信仰,互不相属?——从近代化学孤星醉影异风变末世之大剑召唤者最强天才异世之顶峰强者鸿蒙天君传猎魂王天残神道源界之牵情三灵记东方困龙武岭门旅游里格岛旅游天台山旅游崖下库旅游龙湾潭旅游林坑旅游王家皂旅游桃花岛风情园旅游林则徐纪念馆旅游沈从文墓地旅游鲸鱼沟旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘