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

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

(责编/夏梦竹)

AppGlu应用辅助工具:帮助开发者处理善后工作 iOS!你这几个方面该向Android好好学习 小于1%,中国有真正自主的移动操作系统吗? 张小龙专访系列(下):不一样的产品思维 Gartner:截止到2016年公有云市场复合增长为17.7% Appcore:在企业内部部署IaaS平台 B轮融资600万美元 超现实主义!用脑电波控制你的计算机设备 搜狐否认“情理之中”的退市 上市仍是最优选择 六大BaaS产品推荐:移动开发必备的后端云服务 未遵守承诺 微软遭遇欧盟7.31亿美元巨额罚单 PaaS正能量:6人团队,仅1人全职后端 支撑6000万用户 三星:我不抽成,收益100%让开发者拿去! 腾讯开放平台推“送红利计划” 承诺半年内不参与分成 JavaEE快速开发框架Wabacus 4.0发布,开发效率提高五倍以上 市盈率创新高 谷歌为什么会在苹果博弈中暂时胜出 从Rovio遇到危机,看现在应用市场的演变 Windows Azure支持Android应用 面向东亚推广云服务 抛弃DRAM、拥抱闪存,Facebook重做Memcached 夏普三星联姻 电子行业或将多元化发展 从下拉菜单设计细节看Amazon对用户体验的把握 Chartboost美女CEO:40人团队服务3亿移动玩家 Distimo:新晋开发者想让产品得到关注越来越难 OpenFeint绝迹后,开源项目OpenKit继续前进 美FDA通过搜索引擎和社交平台预警药品副作用 挖坟三星“眼球追踪技术”背后的技术团队 为什么开发者热衷在Stack Overflow上查阅API文档? Facebook推新News Feed 欲造就“个性化报纸” 女神程序员的一天:暴力测试social爬虫代码 2013IBM云存储路线图:更快,更简单,更安全 二战大数据故事:数学家、物理学家、概率论击败德国潜艇 软件定义网络服务商Pertino B轮融资2000万 菜鸟求助:关于句柄的问题。请高手多多指教 请问什么是存储过程(在SQL 2000SERVER中)? 1000分的大问题!***************怎么突破内存禁区读写的权限 java学什么?怎么学? java学什么?怎么学? 高分急救:Oracle安装完成后,服务可以启动,数据库不与服务一起启动,要手动启动 如何让启动时不自动进入x windows? 下载问题 如何得到CPU的序列号(编程) 向ActiveX控件是否可以传递数组参数 can i read or copy files in windows OS to linux? 什么错误? 将SYBASE数据库移植到SQL SERVER 过程中遇到的问题。急!help session问题 为什么我的web不能进断点? SO_REUSEADDR的疑问 关于web数据库的问题 怎么解??? 再送100分,求jtable例子! 怎样清除在image上画出的线,矩形(在运行时画上去的)?? 寻找在杭州文三路创业大厦11楼上班的朋友 where can i download simsun, and how can i use it? IIS与Apache一起工作,访问Apache时有什么办法不用指定端口? 是不是微软的一个低级漏洞? 谢谢zheng017给你的win2k superuser password的源程序。 在access2000的开发中,text框中如果只输入了空格,用text1.value取数据返回值却是null,如何能够返回空格呢? 强烈推荐:Robocode! 为了全体中国人!请回答我的问题!现在该如何访问google??????????????? =======请大家帮我介绍几个比较好的,LOTUS做的WEB网站。====== 为什么我在 M$ Win2000 使用钩子拦截键盘鼠标消息就那么困难 请问在datagrid里面如何增加记录??? 打算成立程序员单身者协会,欢迎大家发表意见,欢迎加入, snowy_howe请进来接分 邦定问题 高手指点 请问大家如何实现VB导入导出TXT文件(TAB分隔的数据)到数据库中?请具体一点,最好有例子 如何让一个模块在运行过程中中止运行. 请教如何控制目录返回?急!谢谢! 修改const常量问题 高手请进,关于asp远程读取信息的问题!急 关于VB 中的字符串截取 询问:国内有没有好的搜索网站????............... google不能用了,想用“3个代表”来搜索了 对在csdn灌水乐园混的程序员和非程序员突然有了种敬畏的感觉 如何远程获得对方机器的操作系统的类型? 请问Oracle和DB2 都是用什么写的? 有谁知道pbm_keydown事件返回值的含义? 大侠救命,SQL SERVER 访问问题,给高分 讨厌SOHU的请进来! "Mascot"该如何成为公司的中文名字? 我想学习ARM,现有SAMSUNG的ARM7芯片和CYGWIN(WINDOW下的UNIX),不知还需要些什么?可否给些相关的指点,谢谢! 用西班牙语介绍一下智利!特别是旅游的地方 小船渡河,河宽d=180m,水流速度v1=2.5m/s,(1) 若船在静水中的速度为v2=5m/s,求①欲使船在最短的时间内渡河,船头应朝什么方向,用多长时间,位移是多少.②,若航程最短,船头朝什么方向?用多少时 在矿山露天爆破中,什么是炸药单耗?说一下定义,有计算公式最好~ 用英语介绍一下智利的情况原文是这样的:Do you know anything about Chile?我是初三的,不要太复杂的单词与语法.围绕地理、人文、盛产等大方面说就好了.不能超过初中生的水平阿 电打火机里的产生高压电火花的原理是什么? 有机硅对油漆的破坏作用,有人知道么,会发生什么化学反应啊?有机硅或者含硅的胶对喷涂后的漆面有什么影响或者对漆料有什么影响? 焊接电源是如何分类的?共分几类?焊接电源是不是只是指弧焊电源还是弧焊电源只是焊接电源的一种? 打火机里的火花发生器的原理是什么?如题 煤矿爆破有经验的朋友告诉一下,因为现在井下遇到岩石,需要爆破,但是放了3炮一点效果都没有,我下井看了下感觉眼位不对,角度也不对,但不知道怎么去计算,就当一扇门,上面是拱形的半个圆, 电源电池掉了,正负级的代码符号各是什么?在哪焊接? 神东岩石的抗压强度求份神东矿区的岩石物理力学性质的参数,2-2煤顶板的 求有机物的同分异构体要不要考虑顺反异构,(如果题目没说),有些资料书上都没考虑顺反异构,它们不是同一物质啊?为什么不考虑? 飞镖盘最大多少寸的 盒子里有大小相同的20个红黄两种球,想要摸到红球的可能性是五分之二,盒子里应放 为什麼说:“多水的江南是易碎的玻璃,在哪儿,打不得这样的腰鼓?” 地理等高线专项训练,最好是有答案的, 一根圆柱管道,知道长度L直径D入口水压P1 出口水压P2 能算出水流速度V么? 作者为什么说多水的江南是易碎的玻璃,在那儿,打不起腰鼓 地理等高线是啥意思等高线是啥子东东,讲讲哈 哪些是一类电源 多水的江南是易碎的玻璃,在那儿,打不得这样的腰鼓.这句话运用了那些修辞手法? 地理中的等高线什么高于高的、低于低的,怎么判断? 长城电源有哪些系列 数控铣床G02G03中R代表什么意思,还有和I.J.K的区别. 怎样培养初中生的地理学习兴趣和有关经纬网,等高线,地球运动的相关问题呢? 电源的种类及其特点有哪些? 数控加工中心铣整圆弧时I和J怎么使用 如图,有四个正方体,每个正方体的六个面上的A、B、C、D、E、F六个字母徘列顺序相同F对面的字母是() 1.用长为2根号2的细直杆连接两个小球A、B,质量分别为m和2m,置于一个光滑、半径R的半球面碗内.问:达到平衡时,半球面的球心与B球的边线和竖直方向间夹角的正切为?2.竖直平面内有一圆形力 数控铣圆弧的I J K 怎么计算 如图,有四个正方体,每个正方体的六个面上的A、B、C、D、E、F六个字母徘列顺序相同第一个B对面的字母是(B的对面 A的对面 E的对面 安塞腰鼓为什么多水的江南,打不得这样的腰鼓? a+b+c+d=20 abcd都为正整数,问总共的不同的排列有多少? 中国铜排铜材中铜矿物的特点及分布特征? 安塞腰鼓文中写鼓前静鼓后静安塞腰鼓的打鼓前的静和打鼓后的静各有什么作用 四川地震后重建大概需要多少时间 飞镖的训练靶和比赛靶有什么区别 把一个正方体的六个面分别标上字母A、B、C、D、E、F并展开如图所示,已知:A=x2-4xy+3y2,C=3x2-2xy-y2,B=12(C-A),E=B-2C,若正方体相对的两个面上的多项式的和都相等,求D、F.快呀, 那样壮阔、火热、豪放的安塞腰鼓是黄土高原孕育了这样的力量,可文中为何提到多水的江南,与安塞腰鼓有什 飞镖靶上有1-20个区域,打在靶上的任意一镖,落在5的倍数区域上的可能性是( ) 铜矿在中国分布主要在哪几个城市 在哪个省 总结一下简洁一点 比较直齿轮和斜齿轮在几何尺寸计算上有何不同 推荐几本讲高中自然地理的书,比如等高线,昼长夜长之类的书, 江西铜矿的具体分布、、、 安塞腰鼓是否属于延安武鼓下面是节选自《延安武鼓》中的一段文字,请结合文字内容推断,“安塞腰鼓”是否属于“延安武鼓” 一方水土养一方人.延安武鼓以它的“狂”和“野”展示了黄 rotrac六个字母组合成的单词 世界铜矿分布 斜齿轮的相关计算,有没有高手求指导模数1、齿数22、分度圆D=31.11、齿宽13、法向齿形角a=20度、齿定高系数1、螺旋角=45度、螺旋方向=右旋、变位系数Xn=0、公法线长度W=20.003(-0.08 -0.12)、跨 把 reatmk 这六个字母排列成单词 打火机里面的火花是电流还是电压?电人为什么会麻呢?在一根很长的铁棍或者别的金属的一头打一下,火花到了铁棍,另一头的铁棍的人也感觉到手也麻了,这么长的铁棍,为什么,没有电阻呢? 露天非煤矿山实施中深孔爆破的台阶高度为多少合适? 下面六个字母,符合音序排列的一组是A.LHPSQLB.HLNPQSC.HNLQPSD.HLNQPS 电子打火机里面的火花产生是什么原理?为什么会有那么高的电压? 请教煤矿炮采(长臂采煤法、爆破落煤)怎么提高出煤效率本人在煤矿从事采煤工作,看着炮采工作面工人每天工作很辛苦,请教下各位有什么办法能提高出煤、回料的效率?减小工人劳动量,增 AAABBB 六个字母共有多少种不同的排列方法,请一一列出,如:ABABAB AABBAB 打火机里产生火花的那个东东叫叫什么?原理是什么? 煤矿爆破什么叫自由面 氢氧化钠能与水反应吗? 那些橡胶适合做洗衣机皮碗 油漆能与什么发生化学反应
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘