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

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

(责编/夏梦竹)

再谈VB程序的加密 在 VB 程序中如何设定 Mouse 光标的位置? 在ActiveX DLL工程中慎用App对象-VB资料 在ActiveX控件工程中设置DataField属性-VB资料 在VB中异步执行程序 在VB编程中有效地组织和利用资源 在VB应用程序中巧用DLL 在VB应用程序中使用INI文件的一点体会 在VB中操纵OLE服务器应用程序 在VB中改变显示器的分辨率 在VB中获取和修改计算机名字 在vb中没有指针,怎样才能将数组作为参数。 在VB中如何调用C++Builder创建的DLL 在VB中设置常用的外部设备 在VB中使用枚举变量 在Visual Basic 中使用C++ 类 在WindowsNT网络中广播消息 -VB资料 在可编辑控件中创建一个新的上下文菜单 -VB资料 在软件中设定热键-VB资料 在注册表中添加自己的文件类型-VB资料 在桌面上建立 Internet 快捷键 -VB资料 在桌面上添加程序的快捷方式 -VB资料 VB怎样得到当前的屏幕分辨率? VB怎样关闭Windows VB怎样关闭一个程序 VB怎样使我的程序总处于屏幕最前方?(Always on top) VB怎样延迟一个VB程序? VB怎样在VB中控制WORD VB怎样找到鼠标指针的XY坐标? 增加快捷方式到启动组-VB资料 直接呼叫RUNDLL来关机-VB资料 请问,有没有青岛的朋友 简单问题易得分:在VC用ADO访问数据库(SQL Server)时,如果字段为NULL时该怎样处理。。。。急!急!急!急!急!急! 十分强烈要求讨论微软的编程书 二进制数据(比如图片)如何通过SOAP以XML的形式传输? happyxiu come in 进过局子的讲讲你的遭遇! 有没人对挂广告条赚美元感兴趣? 一起研究研究 光驱不能自动读取怎么办!! 偶辛勤灌水,到底是为了什么? 为了帮助后进青年提高,请水园的mm们来登记一下 请问在SQL SERVER 2000中,以下字段类型有什么区别: 请各位介绍一些FLASH的好书!!!!!我要学! 关于PCMCIA ...欢迎交流指导! 她问我“上个黄色网站让我看看”, 是什么意思????????? 怎么样能提高IE的速度? 你的DELPHI6的帮助有没有这种问题? 请推荐几处下载java编程方面电子书的站点? 请问有没有工具把access中的文字繁简转化一下?? 找一个高人——HC 请教如何使用API中的GetUserName()? 怎样才能买到 外文期刊??? 如何将一屏显示不下的文档打印在一页当中(CHtmlView) 请问《程序员》杂志上的那几本外文期刊怎么买??? 我下载了几个rar文件有*.rar\*.r01\*.r02等等,可是这个网站没有提供合并文件,忘了怎么合并了,谁知道快告诉我。copy *.rar+*.r01不管用 请教在线的高人(在oicq上吗?) 我是白痴!大虾,什么是专家分,怎么得,有捷径吗???????????? 图形化界面问题!控件与窗体不重合! 书上的东西我看不董,是关于PB70与COM/MTS的,COM/MTS是什么,谁能告诉我? 怎么样能解决死机的问题? 跟帖比聊天有意思多了,哈哈 过去了,就不要再提 灌水乐园,我的MUD练功场 StringList 与 String的区别 为什么我的组合筐里只有最后的项,即"交叉线",没有其他的内容? 关于Tmemo 共享软件的开发经验 部件(Crystal Repot)引用错误(crystl32.ocx),请高手指点,,谢谢 无数个问题之123 steps你有oicq吗?壮丁!!!sos 怎样将数字字符转化为数字呀? WIN98下能读的光盘到了WIN2000/NT下居然读不出来! WIN98下能读的光盘到了WIN2000/NT下居然读不出来!(我的光盘是刻录的) 我不想要分(也许我只是个女生) 40分=一网址:那儿有Effective C++ 2e电子书? 如何在菜单中加入下拉框?像delphi的那样. 怎样用vb程序实现监控打印机打印输出情况 大家评出水园最有人气的mm,我给分啊,行动要快啊~~~~~~~~~~~~~~~~~~~~明天晚上7点结贴 编译servlet文件出错!急!!!! 寻觅朋友(用delphi优先) 我希望能认识安徽的程序员~~~~~~~~~~~~~~~联系:6011458(OICQ) 很长时间,我还是觉得这是一个事实! Word2003能打出汉字打不出数字和字母,字母和数字都是显示乱码.怎么办?只在Word上不行.Word2003能打出汉字打不出数字和字母,字母和数字都显示乱码.只在Word上不能,在这里能打得出.例如:12345678 副词修饰每个词性时 的位置多哪些在前哪些在后 形容词和副词要怎么区分?另在,我要怎么识别单词的词性?如名词为n word2003 怎样打汉语拼音我想直到拼音,拼音下面没有中文的那种,当一份测试题(看拼音写生字的那种).可是用Word里的拼音,一把中文删了拼音也没了,怎么弄? 想问一个语法问题,修饰副词的词是什么词性? 英语上名词、动词、形容词、副词、代词、介词、数词 word2003 中如何将汉字垂直翻转?word2003 中,我打了四个大字,我想把这四个字倒着放,也就是上下翻转.怎么样才能做到这种效果啊! 英语中各种词性不同的单词,如形容词、副词等等之间的关系!就是名词、副词等后不跟什么什么,跟什么什么 好人一生平安 英语如何分辨哪些是动词.名词.形容词.副词.数词.代词.冠词.介词.等. 如何在 Word2003 中给汉字加上拼音和声调有没有比较简单、快速的方法? 单词的词性中 a.代表什么?是形容词还是副词?不太明白 a.是 adj.还是 adv.那副词也用这个表示吗?还是怎么表示? 英语语法 英语词性缩写 全部的 “菟”的读音是什么?我在word2003里给汉字注音怎么操作? 哪些单词是副词的形式形容词的词性 英语语法中词性的用法 这个音标怎么读 有哪个汉语和它字发音相似的?[з] aboard副词词性怎么用,副词能修饰名词么 英语语法中v.vt.vi.这种符号分别表示什么词性 word2003里,拼写与语法检查功能没打开,怎么开启? 英语的名词,冠词,代词,数词,形容词,副词,介词,连词,感叹词,动词!的简写比如,名词简写是n 形容词是adj请正确出写!名词,冠词,代词,数词,形容词,副词,介词,连词,感叹词,动词的简写! 初一上英语语法短语句子,关于sth和sb的如:like doing sthwould like to do sth…… 悬赏,谁能给我发word2003?我拼写与语法灰色无法用检查功能我上网查了一下看来只能下个正版的了可是我笔记本网速比较慢谁能给我发个?有最佳我会提升悬赏的 英语之中名词、代词、动词、形容词、冠词、数词、副词、介词、连词、感叹词代表的意义最好说得通俗易懂一点,用于什么类型. 初1英语语法短语句子,关于sth和sb的 全部! word2003如何关闭“自动检查拼写和语法”功能啊?有时候打开几十万字的小说时,word会花很多时间来检查拼写和语法,占用cpu太多.我双击word底部的一个图标之后,有一个“不检查拼写和语法”,但 英语,名词、动词、形容词、副词、数词、代词、介词、连词、冠词、感叹词,怎么变换成其他形式!(要全部的转换形式!英语,形容词、副词、数词、代词、介词、连词、冠词、感叹词,怎么 求英语语法(sb.sth之类的)最好是初一的比如buy sth.for sb.sell sth.to sb.之类的,要汉语 word2003的语法检查功能,能不能检查到英语语法的正误? 将所学英语单词(小学三册书)按词性分类 名词 动词 代词 形容词 副词 连词 介词 其他 不久就要交 初1英语语法短语句子,关于sth和sb的7年级所有的 俺English差 好心人说下 最好是专业的 很懂的格式如下:ask sb to do sth (意思) 怎么我的word2003语法和拼写功能无法使用啊?我的WORD2003 没有语法和拼写的纠错功能,这项功能用不了,用了也是查不出问题,我看人家的都能自动实时标出所写的错误, 英语中除了名词,动词,代词,形容词,副词,连词,介词还有哪些词 really是什么词性 word2003 拼写与语法没有了怎么办WORD2003中检查拼写错误这个功能没有,在“工具”中的“选项”里的“拼写与语法”是灰色的,没办法点击,我该怎么办啊? 英语的名词,副词,形容词,不定代词……这些词性怎么区分?还有一个句子的组成要什么?ly或es结尾的词都是什么词?怎么区分?还有点没弄懂,帮忙总结下(英语最基础的语法) 最近这个单词用形容词词性怎样写? 江苏译林牛津英语8b单词表的Unit 1和8a单词表的Unit 5和Unit 6.帮忙打出来,要英文和中文一起的. 英语词性顺序 比如一句句子 形容词副词名词动词怎么排列 请举例 就是一句正常的句子那形容词和副词之间能修饰吗 比如VERY MUCH 是不是副词放在形容词的前面 h开头的形容词单词(词性是好的) 牛津英语8B单词表 全部单词 有中文含义的 困难的名词,动词,形容词,副词都是什么(difficult),difficulties是什么词性,困难是可数名词吗 really是什么词性,real与really有什么区别 谁有牛津英语8b单词表一定要2006年版的,且是牛津英语的. 汉语“永远”的词性是副词?名词?形容词?求详解.例如:永远的朋友,永远是朋友,直到永远。我本以为它的基本用法是个时间名词,名词做主谓宾定状补我都能理解。哪想到现代汉语词典里 “欣赏”这个词属于什么词性?比如,“我很欣赏你”,或是“欣赏是一门艺术”,抑或是“欣赏你不代表膜拜你”之类,请问,这个词在不同的句式里,算什么词性和什么语? 求牛津英语8a单词表要8A所有的单词,音标和解释都要重要的是U1的哦~ 急!关于succeed的词性、性质(列出名词、副词、过去分词等等)(要详细)以及有相关联“成功”的单词回答好会追加分值~!急需!“详细”是问题前半部分要 后面的可无 “回答”这个词属于什么词性如果在“那女孩的回答给了我一种自信的感觉。”中也是吗? 牛津英语8B单词表 英语词性的用法?在句中的用法?形容词 和副词的用法?介词的用法?等 所谓这个词属于什么词性 牛津高中英语模块5单词表急用 就是高2英语的单词表 牛津版的! 英语中哪些词语是形容词.副词.名词就各举几个很常用的词语就可以了. 看看这个词是什么词性?The young people were still abroad at the dead of night.其中的abroad是什么词性?be still 后面应该跟什么词?形容词还是副词? WORD2003为什么不能打汉字 牛津高中英语模块七 的单词表谁能给我啊第一到第三单元的,单词表, 这个几个单词的名词 副词 形容词 是什么?compete 名词________ ; 名词________magic 形容词________admit 名词________physic 形容词________intelligence 形容词________true 名词________;副词________choose 名词________crea word2003打不出来汉字~急 写论文~ “坚决”除了形容词词性外,有无其它词性,如副词? 几个单词的的名词形容词和副词quiet,rain,happy,quick,luck,还有another,the other的区别最好举例子谢了别那么深奥,什么ADJ给我翻印成汉语 有没有动词形式啊?adj是啥意思啊,还有n another,the other的
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn