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

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

(责编/夏梦竹)

【CTO讲堂】微服务架构在云端的应用 SDCC 2015创业项目路演火爆征集:寻找中国好项目 被遗忘的设计模式——详解Swift语言中的Null Object Pattern Synaptics发布全新触控及生物识别方案,正式进军车联网 无人机、机器人,英特尔RealSense已扩展至新领域 SDCC 2015中国软件开发者大会盛大开幕 《近匠》逸创云客服创始人叶翔:做好客服产品静待SaaS大爆发时代的到来 【SDCC2015现场】数据库实战论坛:分布式数据库的实践与挑战 SDCC 2015 中国软件开发者大会亮点回顾 《近匠》扬智科技GoWarrior:软硬件全面开源的计算平台 【CTO讲堂】独家直播双十一全网动态?前黑客“劳改”带你玩转大数据 《近匠》好雨云刘凡:提供全方位支持的一站式开发服务云平台 体验过HTC Vive,才知道何谓沉浸感 BDTC 2015:大数据技术精英云集 初版日程公布(表) 深度剖析C++对象池自动回收技术实现 React Native与ExMobi技术路线探索 SDCC 2015前端专场札记:Facebook、百度、腾讯、美团、饿了么等互联网公司的前端实战 芯片巨头为何痴恋开源软件?英特尔Imad Sousou来解密 3D Touch:岂止于Multi-Touch Atlassian亚太区业务经理Paul Conroy:敏捷是开发者的痛点 基于DuiEngine的开源DirectUI图形界面库SOUI 【CTO讲堂】工具类、新闻类、视频类等不同类型App的积分体系该如何搭建? 浏览器的改进应来自用户诉求而非商业诉求 《近匠》Moxtra:可内嵌的一站式移动协同解决方案 互联网时代的无栈开发 SDCC 2015参会感——无法计算的价值 英特尔中国研究院开放日 多个研究项目齐亮相 阿里王晶昱谈淘宝双11分布式数据库实战 为什么移动化对企业级应用如此重要? 移动App图标设计的最佳实践 在Node应用中实施Web认证的四大方法 大虾留步! 根据日期查询数据库的问题(当天结账)急! 请问怎么去打开一个SQL SERVER的数据库,求救 怎样修改注册表? 如何把程序编译为只有一个EXE的文件?(对不起,我的分发光了!) OCP 试题之一 EhLib里TDBGridEh控件的SaveBookmark方法有何作用? 编程不需要创新,我同意 有一个朋友向我要类描述的rose表示的例子,我已经做好了,并上传到下面的网址上 福州的程序员请进................ 如何执行一个*.txt文档中的语句? 怎么在一个button被点击时,播放一段声音呢? OCP 试题之二 怎么用jb5创建一个corba工程? 怎么才能让程序永远在最前面 送分 请问乙肝表面抗原阳性(最最轻的那种,不是小三阳),进外企要不要?作公务员要不要紧?谢谢 怎么样才能处理像VB中的TREEVIEW中的NODECLICK的事件? 我想了解一下国内有多少公司用rose ASP500错误该怎么处理呢?新手请高手赐教!!本人在IIS的根目录下面访问HTM不会出现错误,但是在根目录下面建了虚拟路径有就出现了500错误。为什么? 每一个开发人员都应该拥有的东西 老问题:如何获得鼠标IBEAM的Handle? 用GetCursor()只能获得当前鼠标的Handle. 请问有法律高手在吗?急需要帮助,谢谢。 OCP 试题之三 请问乙肝表面抗原阳性(最最轻的那种,不是小三阳),进外企要不要?作公务员要不要紧 ?谢谢 请教:如何修改ICON? 高分寻求关于vc和mapinfo结合的资料!一定给分!! 怎么我在IE上提供的word文档下载,当点击左键时会打开执行而不能下载, 我公司招聘 做个小调查:做OA用Microsoft的做和用Lotus的做,工资大概各是多少?觉得哪个更难学? 请高手赐教,'ASP 0156 : 80004005' 是什么错误? 在MDI的主窗口CLOSE事件中,返回什么值才能使窗口不会被关闭? 老问题了一直没解决,speechSDK5.1做的程序怎样发布呢? 救命阿?? VC和SQLserver2000可以连么???如何连??????????????? 小弟的“处女作”,请给位捧个场,多提宝贵意见!谢谢! 帮我去见见好吗?http://www.csdn.net/expert/topic/389/389043.shtm 做个小调查:做OA用Microsoft的做和用Lotus的做,工资大概各是多少(最好写明地区)?觉得哪个更难做? 有什么比较好的帮助文件制作软件 chm 或 hlp?那里可以下载? 忍痛送分了,谁知道哪儿有d5开发指南下载,最好是李维的??? 步入设计先锋,专家在线语音交流。你是优秀的平面美术设计师或网页设计师吗?请走进我们的设计联盟。 unix 的安全问题? 分散不出去,因为很简单的问题没人回答出。 小弟的电脑罢工了,还望各路英雄拔九相助!!!!!感激不尽!!(眼泪与鼻涕齐下。。。。) 为什么我在IE的地址栏中一键入www. 就出现了“本程序执行了非法操作”这句话?然后就退出了IE.怎么解决?重装IE也不好用啊! 在Query的SQL中,我想查询一个月内每天某一个小时的记录,如何做? 怎么样可以得到某一组控件的控件数组中,每个控件各能响应的不同的值。用什么判断语句可以实现? 我很烦:两个网卡的问题 (fdogg)继续帮帮吧! 一个安装打包的问题 为什么我在IE的地址栏中一键入www. 就出现了“本程序执行了非法操作”这句话?然后就退出了IE.怎么解决?重装IE也不好用啊! 初一上学期语文第二单元作文材料例文 为什么没有科学家发明热矿泉水,冬天喝冷矿泉水太受不了? 已知m是√13的整数部分,n是√13的小数部分,求m-n/m+n 用方程解..1.一件工作,甲独做20小时完成,乙独做12小时完成,现在先由甲独做4小时,剩下的部分由甲、乙合做完成,完成这项工作甲做了多少小时?2.一项工程,甲单独做20天完成.乙单独做10天完成. 初一下学期语文课内的文言文或者是现代文阅读的题目帮忙找语文课内的文言文或者是现代文阅读的题目要有标准答案 哪里有初一下的语文字词复习主要有注音和字词解释 怎么用matlab画德鲁得公式的图其中公式为:λp=0.16826 λc=8.9342 要求横坐标0.4--1.9 步长0.01 分别画出实部和虚部的图形 初一的语文文言文有哪些 我的孩子开学上初一,想给找个机构补习语文, 用MATLAB编程画二维图,求程序!方程为:x为位移,最后完成的图像应为 1、学了论语十则后,请结合你感受最深的一则谈谈启示.2、请结合论语十则的内容或给你的启示,拟一组不少于五言的对偶句 孩子想补习语文,初一的,请问还点附近哪里的好?特别好的,远些也可以.标题写错了,是“海淀” 矿泉水能否热、凉混着喝? 童趣和论语十则,逐字逐句的翻译,每一个字就算没意思都要说无意, 如果给一个初一的孩子补习语文,他的成绩比较差,应该给他补习哪些内容呢? 矿泉水喝热的好还是冷的好? 运筹学最小元素法中如果有M或0 怎么计算啊初始方案就是产销不平行化成平衡后 会出现M或者0 那怎么计算初始的方案 差额法碰到M的怎么算~ 一下matlab程序错在哪clear allclclamada=0.3;theta=0.7;m=0.4;d=0:0.01:1;r=0:0.01:1;[d,r]=meshgrid(d,r);c=(1-theta+m*(d.^2-r.^2)/2+lamada*(r-d))/2;A2=m.^2*r.^4/(32*(1-theta))+m.^2*d.^4/(32*(1-theta))-m.^2*d.^2*r.^2/(16*(1-theta))-(3-2*theta)*m*la 矿泉水和开水能混着喝吗?为什么 会Matlab请进 帮解决下运筹学的问题minz=1600x1+1600x2+1600x3+1600x4+300x1*x1+300x2*x2+300x3*x3+300x4 *x4-300x1*x2-300x2*x3-300x3*x4-300x4*x1-1433600 st x1>=220 x2>=256 x3>=240 x4>=180 x1.x2.x3.x4都为整数用MATLAB求最优解 我在帮一个刚考完小升中的男孩补习他说他语文差,该给他补小学的呢?还是辅导初一的呢? 用冷矿泉水冲蜂蜜喝,最佳有分. 用matlab解决运筹学中的LP问题用matlab编程,使用单纯形法解决LP问题只需解决max:z=CX,AX≤B,X≥0的情况即可.我不要那么麻烦的,只需要解决上面那种情况就行 matlab中,这个程序错在哪?clc clear alllamada=0.2;theta=0.7;s=0:0.01:1;c=lamada*s+3/2;f=s.^2*lamada.^2/(4*theta)+(1/2)*(-lamada*c/theta+lamada)*s+c.^2/(4*theta)-c/2+theta/8+1/8;plot(s,f,'b');程序提醒f函数错了 初一下册语文测试题帮帮忙! 急求运筹学单纯型法的matlab程序代码!期末了急求运筹学上机实验matlab程序代码,题目是单纯型法,知道的请指教, 看看这个matlab程序错在哪了t=0:0.01:3;k=2;a=-1.5;b=10;f=k*exp((a+i*b)*t);subplot(2,2,1);plot(f,real(f));title('实部');axis([0,3,-2,2]);grid on;subplot(2,2,2);plot(f,imag(f));title('虚部');axis([0,3,-2,2]);grid on;subplot(2,2,3);plot(f,ab 卷通天下初一下册语文人教版期末测试题答案写出下面词语的同义词夹杂——( ) 弥散——( )自失—— ( ) 朦胧—— ( ) matlab和运筹学哪个好 1两盐如果用农夫山泉的矿泉水瓶盖称,大概几瓶盖? 1一辆客车与一辆货车同时从甲乙两地开出,相向而行,客车每小时行120千米,货车每小时行80千米,相遇时客车比火车多行140千米,求相遇时间和甲乙两张的距离.2.客车从甲地开往乙地,速度是55千 .喝矿泉水能补充矿物质吗?★ 当发网 DangFa.com ★ 数学问题关于路程的方程甲乙两人沿着400米跑道从同一个出发点同时联系竞走,甲的速度是125米1分钟 乙的速度是115米1分 第一问:若两人背向练习.几分钟后首次相遇?第二问:若两人同向练习 已知根号7的整数部分是X,小数部分是Y,求y(根号7+y). 一瓶普通矿泉水多少能量出于减肥的目的- -俺衡量下一瓶饮料和一瓶矿泉水的差距问你们多少能量 废话这么多干什么 六年级升初一要补习字,还是英语数学语文? 已知根号7的整数部分是x,小数部分是y,试探求y(根号7+x)的值 加林山矿泉水的热量是多少? 请问我的matlab程序错哪了?n=500:100:2600Te=6.83*10.^(-17)*n.^10-1.09*10.^(-16)*n.^9+7.79*10.^(-17)*n.^8-3.27*10.^(-13)*n.^7+8.95*10.^(-10)*n.^6-1.66*10.^(-6)*n.^5+0.002*n^4-1.86*n^3+1.05*10.^(3)*n.^2-350246.778*n+52019672.056Pe=(6.83*10.^(-17 已知X = 3╱根号7 - 2 ,a 是 X 的整数部分,b 是 X 的小数部分,求a-b╱a+b的值?╱ 是分数线 矿泉水腌萝卜条的热量是多少? 孩子上初一以后,语文成绩直线下降,如何利用暑期补习初一语文? 已知根号7的整数部分是x,小数部分为y,求y•(根号7+x)的值快 初一的语文基础训练17课的答案 已知m是√3的整数部分,n是√13的小数部分,计算(m-n)的值.(用根号表示).orn! 已知x=2+根号7,若x的整数部分是a,x小数部分是b,求xb-a的值 不抄,只是第一课有些题不会, 已知m是√13的整数部分,n是√13的小数部分,计算(m-n)的值 求助matlab编程!算法寻优其中 求最小z值以及取最小值时各变量取值分别为多少 Matlab M文件运行问题我将一段程序命名为try.m,保存在目录E:\Software\Matlab\work文件夹中,在M文件的编辑窗口运行之后就弹出一个对话框:File E:\Software\Matlab\work is not found in the current directory or on the 立刻给我写下来,简洁点 计算机图形学的题:已知起点A(16,-5)和终点B(-4,8),用DDA法在A和B之间生成一段直线 matlab中m文件运行错误,m文件中程序如下:function my13()x0=[1,1,1,1,1,1,1];A=[1,1,1,1,0,0,0;1,1,1,1,1,1,1];b=[5;10];C=[0,0,0,2,1,0.8,1];d=[5];xm=[0,0,0,0,0,0,0];xM=[];[x,y]=fmincon(@ffun,x0,A,b,C,d,xm,xM,@ghun)function y=ffun(x)y=-5*x(1) 两道数学行程问题,要求用方程解答1.某人从A地去B地,如果他以每小时4千米的速度前进,正好在预定的时间内到达,他用这个速度步行了全程的一半后,其余路程搭乘速度为每小时20千米的公共汽 请问matlab中使用遗传算法编程,如何自己定义编码方式染色体分为六位,每位限制在[-10:0.5:10]这40个数当中,看成[0:40]也行,是不是一定要自定编码方式?自定的话怎么写啊 还有如果编码方式custom matlab M文件怎么运行啊, 几道数学行程问题(用方程)1.敌、我相距28千米,得知敌军1小时以前以每小时8千米的速度逃跑,现在我军以每小时14千米的速度追敌军,几小时可以追上敌军?2.甲、乙两架飞机同时从相距750千 人教版初一下册语文第二单元 试卷阅读是主要 经期间可以喝冷的矿泉水吗? matlab编程问题m=3,n=6,r=4;a=m*x^2+n*x;b=r*x+sinx;c=cosx;d=(a+b)*c+a^2;用matlab编程实现:输出x表示d的方程式,并输出d对于x的一阶导数、二阶导数方程式(均用含数字和x的式子表示).
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn