TIP:java
这部分相应的代码在step-3文件夹中(https://github.com/vert-x3/vertx-guide-for-java-devs)git
以前的重构是咱们从初始构建向前的一大步,咱们使用event bus的消息机制抽取了独立可配置的verticles,并且咱们也看到能够部署多个verticles实例来更好应对负载和利用cpu内核。github
在这个章节,咱们将看到怎么设计和使用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
而后咱们须要调整maven-compiler-plugin配置来使用code generation,这是经过一个javac注解的操做:ide
注意到自动生成的代码在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类型。
以前的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/
个人微信公众号: