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

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

(责编/夏梦竹)

ListBox项的控制-VB资料 VB 6.0中类聚集关系的实现 VB6编程中如何获取硬盘分区信息 VB的坐标系统综述 VB调用C程序动态链接库的方法 VB对低层硬件的访问控制 VB软件开发中的错误捕获及处理技术 VB中Combo的一种输入检查制约方法的实现 VB中Winsock控制的UDP协议的使用 VB中的时间处理问题 Windows操作平台下CGI的实现 -VB资料 按下某组键(HotKey)便执行某程式-VB资料 把所有的字体名称放到 ComboBox -VB资料 把文件置入到Text或RichText中-VB资料 捕捉 MouseExit 事件 -VB资料 操作过程动态显示 -VB资料 查找月份的最后一天-VB资料 程序启动时,如何自动判断 MDB文件是否损坏并自动修复?-VB资料 读取和修改Windows注册表 -VB资料 对VB的IDE环境的扩展 防止文本控件中的部分滚动-VB资料 关闭正在运行的程序 -VB资料 关机消息的拦截 -VB资料 VB获得、设置鼠标双击间隔时间 VB获取当前系统平台 记载Windows使用的时间-VB资料 加速Visual Basic For Application(VBA) 监视程序的运行情况 -VB资料 交换鼠标按钮 -VB资料 交换鼠标左右键 -VB资料 禁止使用 Alt-Tab 或 Ctrl-Alt-Del -VB资料 在线等待!!!马上给分,我的MFC里没有 mfc42u.lib,谁可以发一份给我? 如何能够得到系统中IE的版本呢 请教高人! 100分 ListView的内容存成Txt文件! 在图中间生成一白色方框,在里面写字,问题是图和方框相交的地方想要温柔平滑漂亮模糊的那种过渡 100分,有谁知道如何让列表视图中的Item在不同的条件下显示不同的图标? PB6.5中,编辑代码的时候,最下边有一状态条能显示光标当前的行号,列号。我不知怎样把它给隐藏了,请问在哪里可以打开? 好长时间没有提问了啊,大家来帮我 请问如何改变字体颜色? CSDN2000 的CD中的哪个INSTALL SHIELD能变成注册版吗? 如何得到打印机纸张的高度和宽度以及缺省打印(在线等待) 如何让GetFileSaveName对话框打开时是指定目录,比如程序当前目录? 怎样用JAVASCIRPT改变表单背景和表单的只读属性?? 我手头有两份ISA服务器详细设置和安全策略的中文说明书(含图解),我想让大家共享,欢迎大家下载! 数据串行化等问题,请高手指点,一直在线恭候高手????????????????????? 高手请进:如何实现象vc里面一样的 关键字着色?在线等待?马上给分 dbchart内如何动态显示数据源的内容 ODBC高手看过来 在 html help workshop 如何做出 what's this 功能 怎样把网卡设为混杂模式? 请各位大侠给分析一下各种数据库格式的优劣?(如MDB、DBF等等) 请问这个论坛的 CSDN论坛助手.Net(0.21)哪里有下载? 新手提问:关于使用CSocket,为什么我跟服务器建立连接后马上就断开呢 ★★请教AVI文件的API函数★★(关于将位图存成avi时写入的一点问题:急问)(150) 求救!救急!各位仁兄帮帮忙!! 【急】如何处理一组RadioButtonList呢? 签名活动:目前csdn里面发现很多作弊者,反对作弊者进来签名! 哪有中文MSDN下载?先谢谢 请帮忙看一下这个setfilter应怎样写? (这个问题,不会没有人不知道!)关于vfp6统计图的问题`~急呀`~救命呀`~~~回答者都给分`~~ 打印预览窗口的显示问题 vb中的trim在c# 中如何表达 数据库 我为中国队加油,看看我的为中国队加油首页! 关于FLASH的??<在线等待> 请教各位大虾!!!急,我的分数全部送出!!! 高手们怎么样才能在窗体上引入FLASH动画呀????? 好烦啊!oracle 7.3.4数据导到oracle9i的字符集问题 每当我最困难的时候,我就想起了csdn,50分奉送!!!!!图像问题 QuickReport设置的问题 如何打印源代码! 那位大虾知道ACTIVEX命名的由来 请问什么错误,在brinkster测试通过,但是放在另外的站点,却不行了。 中国必胜 mfc 中的类型是怎么定义出来的(比如 dword,LPTSTR 等) 救急!!关于表单中文件域的使用。 奇怪的问题!!!!! 请问什么是contentPane? 用Delphi作网页用IE浏览不行 求助:AfxBeginThread的编译问题! 用C裸写聊天软件,谁能? 三聚氰胺中含氮元素质量? 某温度下,wg某物质在足量的氧气中充分燃烧,某燃烧产物立即与过量的Na2O2反应,固体质量增加w g在1.H22.CO3.CO和H2的混合气体4.HCHO5.CH3COOH6.HOCH2CH2OH中符合题意的是 地球上什么元素最多呢? 三聚氰胺碳氮元素质量分数谢 为什么氢氧燃料电池,工作一段时间后,电解液中KOH的物质的量浓度怎么变化 地球中元素含量仅次于氧的是硅,而为什么人体中元素含量仅次于氧的是碳?既然碳和硅的化学性质很接近,为什么人体中没有大量的硅呢? 三聚氰胺中氮元素的含量比碳元素含量高? 氢氧燃料电池以H2为还原剂,O 为氧化剂,电极为多孔镍,电解液为30%的KOH溶液,下列有关说法正确的是:1`1 负极反应为4OH ̄-4e ̄= O2↑+2H2O2 负极反应为H2+2OH ̄ -2e ̄=2H2O3 工作时正极区的PH升高, 地球含有的元素哪种最多? 三聚氰胺中氮元素的质量分数( ). 某种氢氧燃料电池的电解液为KOH溶液,那么“用该电池点解CuCl2溶液,产生2.24L的Cl2%……高二化学题(问对某种氢氧燃料电池的电解液为KOH溶液,那么“用该电池点解CuCl2溶液,产生2.24L的Cl2(标况 加入CO2为什么能促进水的电离? 氢氧化钙和氯化铵混合加热制取氨气,生成氯化钙.可是干燥氨气不是不能用氯化钙吗?他们能发生络和反应.那生成的产物不反映吗 浴室防雾玻璃的原理为什么这浴室防雾玻璃能够不让镜面起雾呢?是不是有什么物理上的知识? 怎么可以二氧化碳中的碳和氧气分别提出来?可以用H2SO4来电离吗? 氯化铵和氢氧化钙混合加热得到氨气,水和氯化钙,可氨气不会和水反应吗为什么会这些生成物?有反应规律吗? 在窗户玻璃上涂抹洗洁精能防止上雾(霜)吗?什么原理呢? 高中化学:把co2通入水中会对水的电离有什么影响?请具体分析 谢谢 向一定质量的碳酸钙中加入100g稀盐酸,反应一段时间后,生成二氧化碳2.24L,求参加反应的碳酸钙的质量?(标准情况下,二氧化碳密度为1.977g/L)假如用含碳酸钙85%的石灰石来制取,计算需石灰石 重庆合川哪里可以充氦气的?我想给气球充气,不知道合川哪里有气球充气服务的? 爱是什么?爱是一种毒药吗? 初中化学题中混合物反应最后剩下什么的这类问题怎样解!就是如同这种—将氧化铜和铁粉的混合物加到一定量的盐酸中,搅拌反应后,过滤后再加入少量铁粉,无任何现象.则下列正确的 A滤渣中 为什么用碳元素质量的1/12做分子?科学家为什么不用其他元素? 如果,不知道毒品罂粟花是毒品,你是还会爱上它的美丽? 当物质的量为amol的氢气和一氧化碳的混合气体完全燃烧时,消耗了0.5amol氧气则混合气体中,H2和CO的物质的量之比为? 在排水集气法中,如果在水中用玻璃片盖住集气瓶,再拿出来,那不是把水槽里的水都带出来了吗? 爱好比毒药,为什么还食之如髓这是为什么呢? 初中化学推断题混合物分离以工业废水中含有泥沙,硫酸亚铁,银离子.进行如图操作第二步加入了( )分离方法( )第三步加入了( )反应物是谁和谁?第三步得到的不是纯银,因为( ) 用排水法收集气体,当水排完时,水槽中的水为何不进入集气瓶我是觉得如果假设集气瓶口有1个面,它上面受到集气瓶内气体对它的压力,下受到一段水(就是集气瓶侵入水中,那一段深度的水对 碳酸钙与什么反应生成氧化钙 20g碳酸钙放入100g稀盐酸中恰好完全反应,求(1)生二氧化碳质量(2)原100g稀盐酸中溶质质量分数. 你们知道南方的房子和北方的房子有什么区别!为什么不同!就比如北方是平房房.南方是瓦房! 碳酸钙与什么发生反应生成氧化钙 碳和碳酸钙的混合物在空气中受强热后,碳酸钙完全分解,碳完全氧化.如果生成的二氧化碳总质量等于原混合物的总质量,则混合物中碳与碳酸钙的质量比是多少? 黄绿色单质气体是什么? 为什么甲醇的氧氢键上的氢比碳氢键上的氢更活泼? 碳和碳酸钙的混合物在空气中受强热后,碳酸钙完全分解,碳完全氧化,如果生成的二氧化碳的总质量等于原混合 常温下是黄绿色的气体单质是? 美丽的英文单词c开头的整句话是这样的...hang zhou is a beautiful(美丽的)c—— 地球上原始大气的成分与现在的大气成分有什么明显的不同? 氧化钙和什么反应可以生成碳酸钙? 卫生间会不会产生沼气?卫生间里老有一股怪味,不是臭鸡蛋味,会不会是粪便产生的沼气,有这种可能吗?卫生间没有窗户,只有一个排风扇,马桶不太好,大便老堵,老得清理 地球上原始大气的成分与现在的大气成分有啥不同 燃烧50克碳酸钙能生成多少克氧化钙? 现有ABCD四种金属片.1把AB用导线连接后同时浸入稀硫酸溶液中、A上有气泡产生.2把CD用导线连接后同时浸入 乙醇分子中碳元素和氢元素,氧元素物质的量之比是 选取计算的量.假如:Fe和Hcl反应.1.Fe 过量.2.Hcl过量.计算Hcl的质量分数用那组来计算?假设反应时的稀盐酸质量算出来了,然后求质量分数应该带入哪个? 金属裸导线框abcd放在水平光滑的金属导轨上,在磁场中向右运动A.○G表的指针发生偏转 B.○G1表的指针发生偏转 C.○G1表的指针不发生偏转 D.○G表的指针不发生偏转 为什么选AB?请详细讲 求分别以“L”I”L“Y”开头的贬义词L的需要俩 初中化学——-为什么有些物质要过量添加同题 把abcd四块金属片浸入稀硫酸中,用导线两两相连组成原电池,ab连接时,a为负极,cd相连时,电流由d到c,ac相连时,c极上产生大量气泡,bd相连时,b上有大量气泡.活动性由强到弱?Abacd Babcd Cdcba Dacbd我不 以“自”开头的贬义词越快越多追分越多 形容[陷入回忆的想象]叫做什么词(什么想?勾起了回忆 但很模糊 又加有想象的感觉有这么个形容词吗? 急,在线等.氧化钙与什么反应生成碳酸钙RT.必须准确.与水反应生成氢氧化钙,哥哥.是与二氧化碳吗? g开头的贬义词g,o,d,我都要. 如何将混溶的乙醇和甲醛分离? 地球中含量最多的元素是什么 17.碳和碳酸钙的混合物在空气中加强热充分反应后,若生成的CO2的质量与原混合物的质量相等,求原混合物中 Wg某物质在氧气中完全燃烧,所得产物跟足量NA2O2完全反应若NA2O2质量增加Wg,则下列不能满足上述结果的是CH3COOH H2 HCOOH CO 地球上含量最多的元素是什么
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘