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

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

(责编/夏梦竹)

fadeOut(speed,callback)-JQuery API fadeTo(speed,opacity,callback)-JQuery API hide(speed,callback)-JQuery API hide()-JQuery API show(speed,callback)-JQuery API show()-JQuery API slideDown(speed,callback)-JQuery API slideToggle(speed,callback)-JQuery API slideUp(speed, callback)-JQuery API toggle()-JQuery API Javascript-JQuery API $.browser-JQuery API $.each(obj, fn)-JQuery API $.extend(target,prop1,propN)-JQuery API $.grep(array,fn,inv)-JQuery API $.map(array, fn)-JQuery API $.merge(first,second)-JQuery API $.trim(str)-JQuery API Ajax-JQuery API $.ajax(properties)-JQuery API $.ajaxSetup(settings)-JQuery API $.ajaxTimeout(time)-JQuery API $.get(url, params, callback)-JQuery API $.getIfModified(url, params, callback)-JQuery API $.getJSON(url, params, callback)-JQuery API $.getScript(url, callback)-JQuery API $.post(url, params, callback)-JQuery API ajaxComplete(callback)-JQuery API ajaxError(callback)-JQuery API ajaxSend(callback)-JQuery API ajaxStart(callback)-JQuery API c#里如何使用shbrowseforfolder?那位兄弟给个例子 如何实现MAC和IP绑定。 帮帮我啊,老大们我真的很急谢了 session问题?????? 报表输出问题 你愿意吗? 关于PB中做VFP的ODBC的一个问题 我为什么不能提问? 在PASCAL语言中的"集合"概念,转化到C语言中,该怎么实现? 帮我看一下这个程序. 谁人发个QB的编辑器给我? 如何改变应用程序的图标 网吧管理 帮我看一下这个程序. 谁看谁头疼的问题!你除外! 请问JDK和J2SDK有什么区别? win98 转 win2000出现的问题,急,再线等候! 停止函数执行 请问如何在鼠标点击xx button 的时候获得 JtextField 中的文本输入--有重分送 我不能关机了!救救我哟~~给你分! tomcat4.0.1无法启动的问题 SoS!俺用fireworks做了一套菜单,但是应用于框架结构中时,只显示菜单所在框架的部分菜单。也就是说菜单显示不完整,如何能够让菜单跨越 刚装了REDHAT 7.2,不知道网络怎么设置 报表打印,望各位指点..... 是不是我这里设错了? 菜鸟有问题,Win2k的定时关机程序 关于天数累加的问题 webbrowser控件问题? 421连续进纸标准,打印问题,难啊,难 有个小问题难住偶了! 请教 bdf 文件的格式 在JPrint中如何设置页面的打印范围(不使用打印机的默认打印范围),找不到例子,那位能够给个实例。。。 开发jsp需要什么环境和安装软件,目前版本为多少? 在PASCAL语言中的"集合"概念,如何转化成C语言表示 怎么回事。formshow 不能写太多sql语句么〉?,怎么不显示?大家快帮看看,急死了 自动累加的问题?(100)我只能给这么多了 哪里可以下载powerbuilder7.0 网页自动累加的问题(100) help 求肋!! 有关SUN WORKSTATION OPENBOOT的问题 请问一下vb6和.NET 请问,如何用flash 做一个网页“访问量统计”计数器? 请问在win98繁体下开发的pb源程序,在简体win98下怎样转过来?急,请帮忙! 手提电脑,没有软驱,现有一外置USB软驱,但是找不到光盘驱动, 谁有用vb开发组件的详细文档资料或教程 关闭窗口的问题!! 欢迎有志向的VB程序员加入到我的团队!!! 大家做Web Service的时候,是使用SqlDataAdapter这类控件 ,还是自己写SQL语句访问,还是自己写数据访问中间件(e.g:dll),那个在生产环境 webbrowser问题 hello 请问我的servlet程序应该放在哪里?我使用tomcat 现在发现有一类题非常不会...就是棒磁场中运动,但是又不给出磁感应强度B跟棒的长度L,有时侯会给运动的位移但有时侯连位移都没有.而且有时侯还有摩擦...然后求电量,求最大速度,之类的那 卫星要飞出地球,受到向心力和重力两个力都指向地球,为什么物体能飞出(诺卫星与地球同步,那他们是什么力平衡了) 宽容是一种润滑剂,可以消除人与人之间的摩擦.仿句 高中物理几个问题实验室中单摆的周期不会被以下哪个因素所影响: A. 实验室海拔高度 B.重力加速度 C.绳长 D.实验室中的震动 E.运动物体的质量 全反射若要发生,两个透明介质的折射率应 a2图纸在CAD上作图 边框尺寸是多少 仿写句子:生活中离不开宽容.宽容是人与人之间的润滑剂,有了它,人们之间才变得和睦;生活中离不开宽容.宽容是人与人之间的润滑剂,有了它,人们之间才变得和睦;宽容是_______________.宽容 3/4,1/2,1/3,( ),4/27,( )这道题怎么填的? 卫星绕地球转的向心加速度与g为什么不想等,不是说万有引力提供向心力,而万有引力等于重力? 汽车过拱桥时 当速度等于根号gr时 小车为什么做平抛运功 等于根号gr时 不是恰好重力作为向心力吗 那为什么做平抛运动 英语翻译他说英国将不会再有意式面条了 布场用62平方分米的布做长方形毛巾如果每块毛巾的面积是600平方厘米这块布至少做 关于向心力的问题,为何汽车行驶在圆形拱桥上,向心力Fa=重力Fg-支持力Fn 都是向心力方向的问不清楚,按道理说应该向圆心,如果这样,下面这两道题就看不懂了.由于家庭不富裕,献上区区15分,我 CAD图中4-M6-6H是什么意思啊,他所标注的是一个圆的直径. 一块毛巾的面积约为4( ) 汽车通过拱桥顶部时,向心力只由重力提供,对吗? cad机械制图中的M16-6H是什么意思? 一条毛巾长5分之3米,宽比长短3分之2,这条毛巾的面积是多少平方米? 一条船的载重量是520吨,货舱货容量是2000立方米.现在装运甲、乙两种货物,甲种货物每吨体积是2立方米,乙种货物每吨体积是8立方米,请你测算一下,这两种货物各装多少吨,才能最大限度利用这 cAD图中2-M3-6H后面有一横和一个向下的箭头是什么意思 1.填上合适的面积单位(1)小方桌的面积约61() (2)手巾的面积约600() (3)红领巾的面积约8()2.看谁说的对.小英说:“边长为1厘米的正方形面积一定是1平方厘米.小丽说:“面积为 一艘轮船的载重量为500T,容积为2000立方米,现有甲乙两种货物要装,甲货物每吨体积7立方米,乙货物每吨2立方米,求怎样混装这两种货物,才能最好的利用这艘船的体积和载重量立方米,乙货物每 关于CAD导图选择“文件”--“打印机管理器”(有些版本叫“绘图仪管理器”)--选择“添加打印机向导”--然后什么都不要选,一路“下一步”,最后点“完成”.然后打印机名称中会多一个名 豆浆如果不配面包之类的可以吸收么? 一艘轮船货舱容积为2000立方米,可载重500吨,现有甲、乙两种货物待装,已知甲种货物每吨的体积为7立方米,乙种货物每吨体积为2立方米,两种货物各应装多少吨最合理?要以元一次方程 快 在cad制图中怎样把圆分成十二等分请上仙说详细一点 若地球是正球体,重力方向与向心力分向是怎样的 世界最早的邮票"黑便士"是哪个国家发行的 CAD中如何在圆周方向上均布画圆例如在法兰圆周上均布12个螺栓孔怎么画,用阵列命令吗,怎么使用 地球表面上重力等于向心力就是在地球表面上(除了赤道和两极),万有引力分出了两个力:重力和向心力.我想问下是不是在计算时这两个分力——重力和向心力相等,甚至等于引力(也就是 为什么1=0.999. 20只兔子换两只山羊,9只山羊换九头猪,8头猪可换两头牛,那么6头牛可换多少只兔子? 地球上的物体受的向心力和重力有什么区别,请各位说说一些具有代表性的地方的受力情况代表性的地方:赤道上,需要的向心力最大,方向与万有引力的方向相同.重力最小,指向地球质心这时候 为什么1=0.999.求证明! 20只兔子可换2只山羊,9只山羊可换9头猪,8头猪可换2头牛,那么6牛可换多少只兔子 一本书封面的面积是300( )填面积单位 食品添加剂中有一种叫做起酥剂的东西,听说应用于手抓饼、油饼、油条等面食里,以及其食品作用原理、对人体副作用 如果20只兔子可以换2只羊,9只羊可以换9头猪,8头猪可以换2头牛,那么用5头牛可以换多少只兔子? 在比例尺是1;3000平面图上,量得礼堂长7厘米,宽4厘米,这个礼堂是实际面积是 卡通饺子要怎么画?我对着照片画,怎么画都像包子…球高手指点或者直接上卡通图供参考,最好能有角度形状不同的例子我是说.那些饺子要被女主角吃掉的.怎么可以笑呢.主题是吃饺子的MM但 CAD 画图时尺寸标注时的字号大小怎么改用CAD画图时,标注尺寸的时候,尺寸显示的字号很小,怎么改大呢 邮票上的字母T表示什么意思? 饺子能不能和面条一起煮?先放饺子还是先放面条?饺子是北方饺子不是云吞或馄饨噢 公众场合英文标志图案 能否帮我找一些来 急用 邮票上的字母T是什么意思? 澳大利亚国际发展署的英文全称和英文缩写分别是什么? 写出下列场所的标志用语.初一英语导学练下江苏P57 1.crossroad---- . 请问邮票右下角有一个“T”是什么意思? 中日韩加澳洲四国三个字母的英文缩写各是啥? 选择合适的单位名称填空.米 分米 厘米 平方米 平方分米 平方厘米 1.教室面积约4选择合适的单位名称填空.米 分米 厘米 平方米 平方分米 平方厘米 1.教室面积约48(),长(),宽().2.一本 邮票底下的T是什么意思 LGGP993的重力感应是什么功能? CAD中画图明明写好的长度,最后标注怎么不对我输入指定的长度,可是画完后,用标注出来的数字总是差点,是什么原因呢? 质量相等的棉花与铁,( )的体积小. 手机的重力感应功能主要用来实现什么应用呢 问下一粒纽扣的面积约是几平方厘米 一艘载重460吨的船,容积是1000立方米,现有甲种货物450立方米,乙种货物350吨,而甲种货物每吨体积为2.5立方米,乙种货物每立方米0.5吨,问是否都能装上船,如果不能,请你说明理由,并求出为了最大 这种烧饼的做法最好详细一些. 一汽船在静水中的速度为v,设水流的速度为v/2,汽船先顺流而下再逆流而上,在两码头间往返一次所需时间与同汽船在静水中往返于这两个码头一次苏需时间之比为A5:4B4:3C1:1D3:4 CAD比例画图时,图上标的尺寸,是实际尺寸还是图上尺寸啊?例如,我想画100mm的东西,用1:10比例,要在CAD上画10mm,标注时标100mm还是10mm啊? "相同体积"的铁和棉花,哪个重?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘