像之前一样,创建目录结构:
mkdir hello-consumer-microservice-http
cd hello-consumer-microservice-http
mvn io.fabric8:vertx-maven-plugin:1.0.5:setup \
-DprojectGroupId=io.vertx.microservice \
-DprojectArtifactId=hello-consumer-microservice-http \
-Dverticle=io.vertx.book.http.HelloConsumerMicroservice \
-Ddependencies=web,web-client,rx
最后一个命令添加了另一个依赖项:Vert.x web client,一个异步HTTP客户端。我们将使用此客户端调用第一个微服务。该命令还增加了Vert.x版的RxJava的绑定,我们将会在之后使用它。
现在,我们来修改src/main/java/io/vertx/book/http/HelloConsumerMicroservice.java文件。并更新它:
package io.vertx.book.http;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.*;
import io.vertx.ext.web.client.*;
import io.vertx.ext.web.codec.BodyCodec;
public class HelloConsumerMicroservice extends AbstractVerticle {
private WebClient client;
@Override
public void start() {
client = WebClient.create(vertx);
Router router = Router.router(vertx);
router.get("/").handler(this::invokeMyFirstMicroservice);
vertx.createHttpServer()
.requestHandler(router::accept)
.listen(8081);
}
private void invokeMyFirstMicroservice(RoutingContext rc) {
HttpRequest<JsonObject> request = client
.get(8080, "localhost","/vert.x")
.as(BodyCodec.jsonObject());
request.send(ar -> {
if (ar.failed()) {
rc.fail(ar.cause());
} else {
rc.response().end(ar.result().body().encode());
}
});
}
}
在start方法中,我们创建一个WebClient和一个Router。在创建的Router(路由器)上,我们注册一条“/”路由并启动HTTP服务器,将Router对象的accept方法引用传递进去,作为requestHandler。该路由的处理器是一个方法引用(hello)。此方法使用web client调用具有特定路径的第一个微服务(/vert),并将结果写入HTTP响应中。
一旦创建了HTTP请求,我们就调用send发送请求。当响应到达或出现错误时,我们传入的处理程序将被调用。if-else块检查调用是否成功。不要忘记它是一个远程交互,它有很多失败的理由。例如,第一个微服务没有运行。当它成功时,我们将接收到的负载写入到响应中;否则,我们会回复500。