Vert.x Guide重构Vert.x服务 译<五>

TIP:

这部分相应的代码在step-3文件夹中(https://github.com/vert-x3/vertx-guide-for-java-devs)

之前的重构是我们从初始构建向前的一大步,我们使用event bus的消息机制抽取了独立可配置的verticles,而且我们也看到可以部署多个verticles实例来更好应对负载和利用cpu内核。

在这个章节,我们将看到怎么设计和使用Vert.x服务,设计服务的主要优势可以面向接口编程,然后把服务暴露出来,我们也可以用代码生成工具来处理event bus的消息机制,来替换我们之前章节介绍的那样来自己手动编写的部分。

我们将会重构代码,使用不同的包路径:

110102_Ngke_2277632.png

io.vertx.guides.wiki将包含主要的verticle,io.vertx.guides.wiki.database是数据库verticle和service,io.vertx.guides.wiki.http是Http 服务 verticle。

Maven配置修改

第一,我们先把下面两个依赖包加入到我们项目中,尤其我们需要 vertx-service-proxy Apis:

110536_HSfA_2277632.png

我们需要Vert.x代码生成模块,并且只是编译时依赖(provided scope)

111206_DlcY_2277632.png

然后我们需要调整maven-compiler-plugin配置来使用code generation,这是通过一个javac注解的操作:

111508_eh73_2277632.png

注意到自动生成的代码在src/main/generate路径下,然后一些集成开发环境比如IntelliJ IDEA 会自动加入到项目的classpath。

当然通过更新maven-clean-plugin来删除这些生成的文件:

111818_rF6t_2277632.png

TIP:

完整的文档关于Vert.x在http://vertx.io/docs/vertx-service-proxy/java/ 可以看到

 

数据库服务接口

定义一个服务接口就像定义其他的java接口是一样的,还需要我们包含可以使生成的代码可以工作的规则,和保证在Vert.x其他的交互代码正确。

开始我们定义下面的接口:

112145_MaTt_2277632.png

    1.ProxyGen注解用来触发自动生成服务的客户端连接代理。

    2.Fluent注解是可选的,但是允许Fluent接口可以返回服务的实例,这对代码生成是非常有用的当服务被其他的JVM语言消费的时候。

   3.参数类型可以是String,java基础数据类型,JSON类型或者数组,任何枚举类型或者java.util collection (List / Set / Map) 。使用任意java类的方法是把它作为Vert.x数据对象,使用@DataObject注解,最后使用其他类型的就是服务应用类型。

    4.既然服务提供异步的结果,服务方法的最后一个参数需要是Handler<AsyncResult<T>>,使用泛型T来适配任何自动的生成的代码类型。

创建服务的实例和在event bus 的client代理的好的实践是提供static方法,我们定义了简单的实现类和它的构造函数:

113741_dNhJ_2277632.png

 Vert.x code generator创建的proxy类带有VertxEBProxy前缀,proxy类的构造方法需要一个Vert.x context对象和event bus地址。

123401_RejI_2277632.png

NOTE:

之前的SqlQuery和ErrorCodes是内部类,现在抽取出来,是package-protected类型。

 

数据库 service implementation

之前的WikiDatabaseVerticle实现直接提供了一个端口,现在最重要的不同是构造方法中支持异步的结果handler(报告初始化输出)和他的服务方法(报告操作成功)。

下面是类的代码:

123900_pRFe_2277632.png

123920_zOFw_2277632.png

123937_MEYN_2277632.png

在proxy代码工作的最后一步:服务所在的包需要package-info.java指出定义的Vert.x模块。

124410_j0G1_2277632.png

 

从数据库verticle开放数据库服务

数据库的操作代码多数移到WikiDatabaseServiceImpl中,WikiDatabaseVerticle现在包含两个方法:start方法用来注册服务和一个工具方法来加载SQL语句:

124702_Xanq_2277632.png

124716_piMj_2277632.png

    1.在这注册服务

WikiDatabaseServiceVertxEBProxy用来接收event bus来的消息,然后转发到WikiDatabaseServiceImpl。然后就想我们前面的操作一样:消息通过sction header发送调用某个特定的方法,参数被编码成JSON格式。

 

获取数据库 service proxy

最后的步骤重构Vert.x是修改 HTTP server verticle获取数据库service proxy,并且使用它在handler中取代event bus。

第一,我们需要在verticle开始的时候创建proxy:

125338_i9jE_2277632.png

    1.我们需要确认WikiDatabaseVerticle使用相同的event bus地址

然后,我们需要用数据service的请求替换event bus请求

125535_G9Kg_2277632.png

125551_Iehj_2277632.png

WikiDatabaseServiceVertxProxyHandler处理转发调用event bus消息。

TIP

Vert.x service 没有直接处理消息,而是被proxys去消费event bus的消息。

 

 

原文链接:http://vertx.io/docs/guide-for-java-devs/

103728_2T6n_2277632.png

我的微信公众号:

223108_3TsV_2277632.png

转载于:https://my.oschina.net/u/2277632/blog/1580629

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值