像之前一样,创建目录结构:

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。

results matching ""

    No results matching ""