TIP:java
这部分相应的代码在step-2文件夹中(https://github.com/vert-x3/vertx-guide-for-java-devs)git
在前面的章节咱们可运行的wiki应用,然而,它的实现有如下几个问题:github
1.HTTP请求处理和数据库访问代码交错写在同一个方法里。数据库
2.许多配置信息(端口信息,JDBC driver)都硬编码的写在代码里。服务器
架构与技术选型:微信
在这章主要事重构代码,使verticles独立,可复用:架构
咱们将部署2个verticles处理HTTP请求,和一个verticles封装数据库持久层。这两个verticles并非直接互联,而是在event bus约定名称和消息格式,这提供了一个简单而有效的解耦。负载均衡
传递给event bus的消息格式化为JSON的形式,而Vert.X支持灵活的序列化方案,符合event bus的要求或很是具体的contexts。使用JSON格式是一个明智的选择,另外一个优点它是一种语言无关的文本格式,能够很理想的用不一样语言实现来传递信息。框架
HTTP服务verticle异步
1.咱们定义常数verticle配置参数:HTTP端口号和定义在event bus中的name,用来能够和数据库verticle传递信息。
2.AbstractVerticle#config()容许访问verticle提供的配置,第二个参数是一个默认值,不用提特殊的配置。
3.配置值不能是字符串对象,能够是整数,布尔值,复杂的JSON数据。
类的其他部分大可能是一个HTTP代码提取,与之前的相比,数据库代码被event bus的消息代替。这里是indexhandler编码方法:
1.vertx实例提供了链接event bus的方法,咱们能够发送一个消息到database vertice队列。
2.Delivery选项容许咱们定义 headers, payload编码和超时。
3.成功会返回一个有效数据。
如你所看的,event bus消息包含一个消息体,还有就是消息会期待一个回复。在事件没有回应的时候,这里就没有一个handler去处理了。
咱们把payloads编码成JSON对象,咱们指定database verticle经过消息的header处理叫作action。
router handlers的其他代码能够看到event-bus拉取和存储数据:
使用是JDBC链接数据库,须要驱动和配置信息,在前面是硬编码的。
配置SQL
改变以前在代码中硬编码的SQL语句,咱们能够把这个语句放到一个配置文件中。
查询的时候能够从配置文件中加载,若是什么都没有提供则获取一个默认的资源,这样作的前瞻性是咱们可使用这个verticle加载不一样的驱动和不一样的SQL语法。
原来的verticle类包含须要定义的配置字段:
SQL查询能够放到一个配置文件,默认咱们放一个HSQLDB的
下面的WikiDatabaseVerticle代码加载SQL语句,并放到一个map中
咱们使用SqlQuery枚举来代替后面的string常量,下面是verticle的start方法实现:
1.这里,咱们打破了Vert.x避免阻塞APIs的重要原则,可是这也没有异步的APIs用来访问路径下面的资源,选择是有限的。咱们可使用executeBlocking方法将阻塞的I/O操做从even loop中唤醒为工做线程,可是由于数据比较小,因此看不错明显的差别。
2.这是一个使用SQL查询的例子。
3.consumer方法注册一个event bus 目的地handler
event bus message handler 是下面的onMessage方法:
咱们定义了一个ErrorCodes枚举来处理错误,用来返回给message sender。再者,Message中的fail方法提供一个简短的error描述,最初的message sender能够获取一个异步的AsyncResult的失败信息。
减小JDBC客户端样板代码
到目前为止,咱们已经看到了完整的交互来执行SQL查询:
1.获取链接
2.执行请求
3.释放链接
这致使了代码中,须要须要为每个异步操做发生错误处理,以下:
从Vert.x 3.5.0开始,JDBC客户端如今支持获取链接执行一次SQL操做,而后内部释放,下面咱们能够简短代码:
这样对于一个链接执行单一的操做是颇有用的,从性能的角度考虑,复用链接执行一连串的SQL操做是明智的。
剩下的代码包含一个私有方法onMessage,用来处理传入的消息:
咱们有一个MainVerticle方法,但不是包含全部的业务逻辑在初始迭代,它的惟一目的是启动应用和部署其余verticles。
其中的代码包含部署一个WikiDatabaseVerticle和两个HttpServerVerticle实例:
1.部署一个verticle是一个异步的操做,因此咱们须要一个Future,当部署成功的时候,其中的String会返回一个惟一标识。
2.一种选择是建立一个verticle实例,而后把它传递给deploy方法,completer会返回一个handler。
3.序列的组成容许一个个一次执行异步操做,当初始化的future成功返回,启动回调函数。
4.咱们也能够经过类名,来部署verticle,对于其余依赖JVM的语言,也能够经过module/script的名称来部署。
5.DeploymentOption类容许定义实例的个数。
6.返回一个Future,它的完成将触发一系列的操做完成。
7.咱们定义一个handler最终来执行MainVerticle启动future。
聪明的读者可能想知道咱们如何部署代码的HTTP服务器在同一个TCP端口的两次,缺没有抛出错误,由于既然这个TCP端口已经在使用,许多其余的框架须要选择其余端口号,有一个HTTP代理端口之间实现负载均衡,而使用Vert.x可让不一样的verticles共享相同的TCP端口号,新来的链接会以循环的方式分发给接受线程。
原文连接:http://vertx.io/docs/guide-for-java-devs/
个人微信公众号: