TIP:
这部分相应的代码在step-3文件夹中(https://github.com/vert-x3/vertx-guide-for-java-devs)
之前的重构是我们从初始构建向前的一大步,我们使用event bus的消息机制抽取了独立可配置的verticles,而且我们也看到可以部署多个verticles实例来更好应对负载和利用cpu内核。
在这个章节,我们将看到怎么设计和使用Vert.x服务,设计服务的主要优势可以面向接口编程,然后把服务暴露出来,我们也可以用代码生成工具来处理event bus的消息机制,来替换我们之前章节介绍的那样来自己手动编写的部分。
我们将会重构代码,使用不同的包路径:
io.vertx.guides.wiki将包含主要的verticle,io.vertx.guides.wiki.database是数据库verticle和service,io.vertx.guides.wiki.http是Http 服务 verticle。
Maven配置修改
第一,我们先把下面两个依赖包加入到我们项目中,尤其我们需要 vertx-service-proxy Apis:
我们需要Vert.x代码生成模块,并且只是编译时依赖(provided
scope)
然后我们需要调整maven-compiler-plugin配置来使用code generation,这是通过一个javac注解的操作:
注意到自动生成的代码在src/main/generate路径下,然后一些集成开发环境比如IntelliJ IDEA 会自动加入到项目的classpath。
当然通过更新maven-clean-plugin来删除这些生成的文件:
TIP:
完整的文档关于Vert.x在http://vertx.io/docs/vertx-service-proxy/java/ 可以看到
数据库服务接口
定义一个服务接口就像定义其他的java接口是一样的,还需要我们包含可以使生成的代码可以工作的规则,和保证在Vert.x其他的交互代码正确。
开始我们定义下面的接口:
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方法,我们定义了简单的实现类和它的构造函数:
Vert.x code generator创建的proxy类带有VertxEBProxy前缀,proxy类的构造方法需要一个Vert.x context对象和event bus地址。
NOTE:
之前的SqlQuery和ErrorCodes是内部类,现在抽取出来,是package-protected类型。
数据库 service implementation
之前的WikiDatabaseVerticle实现直接提供了一个端口,现在最重要的不同是构造方法中支持异步的结果handler(报告初始化输出)和他的服务方法(报告操作成功)。
下面是类的代码:
在proxy代码工作的最后一步:服务所在的包需要package-info.java指出定义的Vert.x模块。
从数据库verticle开放数据库服务
数据库的操作代码多数移到WikiDatabaseServiceImpl中,WikiDatabaseVerticle现在包含两个方法:start方法用来注册服务和一个工具方法来加载SQL语句:
1.在这注册服务
WikiDatabaseServiceVertxEBProxy用来接收event bus来的消息,然后转发到WikiDatabaseServiceImpl。然后就想我们前面的操作一样:消息通过sction header发送调用某个特定的方法,参数被编码成JSON格式。
获取数据库 service proxy
最后的步骤重构Vert.x是修改 HTTP server verticle获取数据库service proxy,并且使用它在handler中取代event bus。
第一,我们需要在verticle开始的时候创建proxy:
1.我们需要确认WikiDatabaseVerticle使用相同的event bus地址
然后,我们需要用数据service的请求替换event bus请求
WikiDatabaseServiceVertxProxyHandler处理转发调用event bus消息。
TIP
Vert.x service 没有直接处理消息,而是被proxys去消费event bus的消息。
原文链接:http://vertx.io/docs/guide-for-java-devs/
我的微信公众号: