如何在 Vert.x 中运行多个顶点?

dib*_*ger 3 java maven web vert.x

我是 Vert.x 的新手,我想通过 jar 运行多个 Verticle。我有两个文件,一个是 MyFirstVertice.java,它路由路径“/q1/ ”并返回一些东西。第二个是 MySecondVertice.java,它路由路径“/q2/ ”。第二个顶点部署在第一个顶点中。

MyFirstVertice.java

public class MyFirstVerticle extends AbstractVerticle {
@Override
public void start(Future<Void> fut) throws Exception {

    HttpServer server = vertx.createHttpServer();
    Router router = Router.router(vertx);
    router.route("/q1/*").handler(routingContext -> {
        HttpServerRequest request = routingContext.request();
        String Y = request.getParam("key");
        String cipherText = request.getParam("message");

        HttpServerResponse response = routingContext.response();

        response.setChunked(true);
        response.putHeader("content-type", "text/plain");
        response.write(Y + "\n");
        response.write(cipherText + "\n");
        response.end();

        vertx.deployVerticle(new MySecondVerticle(), stringAsyncResult -> {
            System.out.println("Second verticle is deployed successfully.");
        });
    });

    server.requestHandler(router::accept).listen(8080, httpServerAsyncResult -> {
        if (httpServerAsyncResult.succeeded()) {
            fut.complete();
        } else {
            fut.fail(httpServerAsyncResult.cause());
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

}

MySecondVetice.java

public class MySecondVerticle extends AbstractVerticle {
@Override
public void start(Future<Void> fut) throws Exception {

    HttpServer server = vertx.createHttpServer();
    Router router = Router.router(vertx);
    router.route("/q2/*").handler(routingContext -> {
        HttpServerResponse response = routingContext.response();
        response.setChunked(true);
        response.putHeader("content-type", "text/plain");

        response.end("q2");
    });

    server.requestHandler(router::accept).listen(8080, httpServerAsyncResult -> {
        if (httpServerAsyncResult.succeeded()) {
            fut.complete();
        } else {
            fut.fail(httpServerAsyncResult.cause());
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

}

我的 pom.xml

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.3</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <manifestEntries>
                                    <Main-Class>io.vertx.core.Starter</Main-Class>
                                    <Main-Verticle>tutorial.diluo.MyFirstVerticle</Main-Verticle>
                                </manifestEntries>
                            </transformer>
                        </transformers>
                        <artifactSet/>
                        <outputFile>${project.build.directory}/${project.artifactId}-${project.version}-fat.jar</outputFile>
                    </configuration>
                </execution>
            </executions>
        </plugin>
Run Code Online (Sandbox Code Playgroud)

我运行它java -jar xxx-fat.jar

当我在浏览器中输入 localhost:8080/q1/xxx 时,它可以返回所需的内容。但是当我尝试访问 localhost:8080/q2/xxx 时,它显示“找不到资源”。你能告诉我如何部署两个路由不同路径的verticles吗?我知道我可以在同一个verticle中路由不同的pathe,我只想知道如何部署和运行多个verticle。提前致谢!

Wil*_*ill 6

您遇到的问题是两者Verticles都试图绑定到8080您无法做到的同一个端口 ( )。所以第二个Verticle很可能抛出一个BindException并且没有出现。Verticle然后,第一个没有资源,/q2这就是您获得Resource Not Found.

根据 tsegismont 的评论更新:

Vert.x允许多个 Verticles 在称为服务器共享的功能中的同一端口上启动。当发生这种情况时,Vert.x将使用循环策略Verticle依次向每个发送请求。因此,您应该会看到 50% 的请求适用/q1/q2. 但是 - 正如 tsegismont 所指出的,您的浏览器使用persistent connections所以它保持与单个Verticle. 您应该会发现使用 curl 或其他浏览器可能会给您带来更好的结果。无论哪种方式,这可能都不是您想要的。

如果您需要 2 ,您应该考虑一下Verticles。通常,您希望将 aVerticle视为应用程序的入口点 - 它是bootstrapping您的应用程序/微服务的一种方式。

如果您真的需要 2,Verticles那么您将不得不选择单独的端口或在单独的盒子上运行。如果你不这样做,那么只需routes在同一个router.

有关更多信息,请参阅http://vertx.io/docs/vertx-web/java/Vert.x Web