阅读更多

1顶
0踩

Web前端

原创新闻 如何基于Vert.x实现远程调用?

2015-08-21 16:51 by 副主编 mengyidan1988 评论(0) 有5759人浏览
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模块的贡献者。
来自: CSDN
1
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • Vert.x(vertx) 简明介绍

    Vert.x最大的特点就在于异步(底层基于Netty),通过事件循环(EventLoop)来调起存储在异步任务队列(CallBackQueue)中的任务,大大降低了传统阻塞模型中线程对于操作系统的开销。因此相比较传统的阻塞模型,异步...

  • Vert.x实战 事件总线:Vert.x应用程序的主干

    的分布式事件总线 前一章我们介绍了Vert.x中的verticles。Vert.x应用程序由一个或多个verticles组成,每个verticle构成一个处理异步事件的单元【unit】。通常会根据功能【functional】和技术【technical 】方面的...

  • Vert.x源码解析 - Core

    希望通过本文的解析,让读者了解...Vert.x是一个事件驱动,基于Netty库构建的高性能应用程序框架。实现了所谓的Multi-Reactor模型,能够充分利用多核CPU实现以事件循环为基础的基本编程模型。同时在此基础上构建了.

  • 第一章: Vert.x 异步编程的基础知识

    本书这部分的章节将通过使用Vert.x工具包教你异步编程的基本概念。使用Vert.x思考异步操作绝对是可行的(而且很有趣!),我们将探讨Vert.x应用程序的主要构建块。

  • 27Vert.X框架学习笔记

    文章目录1 Vert.x简明介绍1.1 Vert.x能干什么1.2 Vert.x快速体验1.3 Vert.x的简单介绍1.4 Vert.x的一些优势1.4.1 异步非阻塞1.4.2 Vertx支持多种编程语言1.4.3 不依赖中间件1.4.4 完善的生态1.4.5 为服务而生1.5 ...

  • Vert.x学习笔记-什么是事件总线

    它是对发布-订阅模式的一种实现,可以看作是一个中心化的媒介,能够以标准化的协议在这些组件之间路由事件,负责将事件从发布者传递给订阅者。事件总线可以管理事件的传递、路由和解析,同时也可以处理事件的顺序、...

  • Vert.x(vertx) 实现TCP服务

    对于Java开发人员,想要实现一个http服务,非常简单,写个servlet,打成war包,...要实现一个tcp服务,只能自己动手处理网络和线程问题,这是非常考验编程功底的事情,而且如果团队人员素质不高,项目周期要求较短的...

  • vert.x 微服务_Tim Fox采访有关Vert.x 3(用于JVM的原始React式微服务工具包)

    vert.x 微服务 Vert.x是用于JVM的React性微服务工具包,它提供了异步,可扩展的并发服务开发模型。 它支持多语种语言开发,并具有对JavaScript,Ruby,Groovy,Scala以及Java的一流支持。 InfoQ有机会赶上了Vert.x...

  • Vert.x 4 异步编程 - Futures 和 Promises

    但java程序员,最习惯的是链式调用,我们自然会想,在 Vert.x中有没有跟JavaScript的Promise相类似的机制,可以将lambda表达式转换成链式调用呢? 用Future+ Promise就将参数中的lambda表达式变成返回值,从而实现...

  • Vert.x 技术内幕 | 异步RPC实现原理

    传统的RPC想必大家都不陌生,但是传统的RPC有个缺陷:传统的RPC都是阻塞型的,当调用者远程调用服务时需要阻塞着等待调用结果,这与Vert.x的异步开发模式相违背;而且,传统的RPC未对容错而设计。 因此,Vert.x...

  • Vert.x(vertx) 认证和授权详解(包含认证和授权在Web系统中的使用)

    每个线上系统几乎都是离不开认证和授权的,Vert.x提供了灵活、简单、便捷的认证和授权的支持。...当然,Vert.x也给我们提供了使用JDBC、Shiro、MongoDB、JWT等授权的实现,我们可以直接使用。 Vert.x提供的认证和...

  • 使用Websockets和Vert.x进行实时竞价

    使用Websockets和Vert.x进行实时竞价

  • 第三章: 事件总线:Vert.x 应用程序的支柱

    一个 Vert.x 应用程序由一个或多个 Verticle 组成,每个 Verticle 形成一个处理异步事件的单元。 通常通过功能和技术问题来专门化 Verticle,例如有一个 Verticle 用于公开 HTTP API,而另一个 Verticle 用于处理...

  • Vert.x(vertx)发送 HTTP/HTTPS请求

    在应用系统中,经常会有类似于获取天气、发送短信、处理图像、支付等需求,这些需求实现都非常复杂,或者受到监管的限制,不是任何一个公司都可以做到的。但有些应用为了提升用户的体验,需要用到这些功能,比如...

  • linux运行vertx,vert.x学习(二),使用Router来定义用户访问路径

    JavaWeb学习 (二十一)————基于Servlet+JSP+JavaBean开发模式的用户登录注册 一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户...

  • Vert.x 服务代理 中文版

    当您编写一个 Vert.x 应用程序时,您可能希望在某个地方隔离一个功能,并使其可供应用程序的其余部分使用。 这是服务代理的主要目的。 它允许您在事件总线上公开一个 *service*,因此,任何其他 Vert.x 组件只要知道...

  • 【CSDN软件工程师能力认证学习精选】 Vert.x(vertx) 简明介绍

    CSDN软件工程师能力认证(以下简称C系列认证)是由中国软件开发者网CSDN制定并推出的一个能力认证标准。C系列认证历经近一年的实际线下调研、考察...Vert.x最大的特点就在于异步(底层基于Netty),通过事件循环(Eve.

  • vert.x tcp 服务_Vert.X通过Hoverfly满足服务虚拟化

    vert.x tcp 服务 服务虚拟化是一种用于模拟基于组件的应用程序的依赖关系行为的技术。 Hoverfly是用Go语言编写的服务虚拟化工具,可让您模拟HTTP(S)服务。 它是一个代理,它使用存储的响应来响应HTTP(S)请求...

  • Vert.x!目前最快的 Java 框架

    Vert.x是一个多语言 Web 框架,它支持Java ,Kotlin,Scala,Ruby和Javascript支持的语言之间的共同功能。无论语言如何,Vert.x都在Java虚拟机(JVM)上运行。模块化和轻量级,它面向微服务开发。 Techempower基准...

  • Vert.x实战 异步数据和事件流

    本章包括: 为什么流【streams】... Vert.x中的流涵盖了各种各样的数据源/发生器【source】和接收器【sink】,如表4.1所示: Stream resource Read support Write support TCP sockets YES YES UDP datagrams YES YES ...

Global site tag (gtag.js) - Google Analytics