如何异步编写http REST服务

时间:2019-05-28 07:33:45

标签: vert.x

在vert.x中建议使用什么方式编写异步请求处理程序?

在此服务中,请求处理通常涉及调用DB,调用外部服务等。但是,我不想阻塞请求处理线程。使用vet.x的推荐方法是什么?在典型的异步处理链中,我将使用请求处理线程将带有请求对象的消息发送到消息总线。另一个处理程序将选择此消息并进行一些处理,例如检查请求参数。然后,该处理程序可以向总线发出新消息,该消息可以由下一个进行远程调用的处理程序接收。该处理程序发出一条带有呼叫结果的新消息,该消息可以由下一个处理程序提取,该处理程序将进行错误检查等。下一个处理程序将负责创建响应并将其发送给客户端。

如何使用vert.x创建类似的管道?

1 个答案:

答案 0 :(得分:0)

包括HttpServer的请求处理程序的所有内容都是异步的,不是吗?

var server = vertx.createHttpServer(HttpServerOptions())
server.requestHandler { req ->
    req.setExpectMultipart(true) // for handling forms
    var totalBuffer = Buffer.buffer()
    req.handler { buff -> b.appendBuffer(buff) }
        .endHandler { // the body has now been fully read
            var formAttributes = request.formAttributes()
            req.response().putHeader("Content-type","text/html");
            req.response().end("Hello HTTP!");
        }
    // the above is so common that Vertx provides: bodyHandler{totalbuff->..}
}.listen(8080, "127.0.0.1", { res -> if(res.succeeded()) ... });

您只需要(最后)在管道的最终处理程序上写在req.response()上即可。

对于类似流的实现(即,不是基于回调的),可以使用Vert.x Rx / ReactiveStreams API。例如,您可以使用Vert.x Web Client进行请求,也可以使用其Rx-fied API