Vert.x 程式碼結構最佳實踐

sweetmain發表於2018-06-20

按照官網的寫法會把一堆方法寫到一個Verticle裡面,要不就是通過EventBus 進行轉發到其他Verticle,也覺得不是很優雅,所以就有這篇文章。

首先先看下整體程式碼結構圖

image.png

啟動類程式碼

StartVerticle

public class StartVerticle extends AbstractVerticle implements RouterVerticle {

  public static void main(String[] args) throws IOException {
    Vertx.vertx().deployVerticle(new StartVerticle(), new DeploymentOptions()
        .setConfig(new JsonObject(new String(Files.readAllBytes(Paths.get("config.json"))))
    ));
  }

  @Override
  public void start() throws Exception {
    super.start();
    JsonArray verticles = config().getJsonArray("verticles");

    List<Future> futures = verticles.stream()
        .map(name -> Future.<String>future(r ->
            vertx.deployVerticle(name.toString(), new DeploymentOptions().setConfig(config()), r))
        ).collect(Collectors.toList());

    CompositeFuture.all(futures).setHandler(res -> {
      Router router = Router.router(vertx);
      routers.forEach(r -> router.route(r.getHttpMethod(), r.getApi()).handler(r.getHandler()));
      System.out.println(routers.size());
      vertx.createHttpServer().requestHandler(router::accept).listen(config().getInteger("port"), server -> {
        if (server.succeeded()) {
          System.out.println("server ok");
        } else {
          server.cause().printStackTrace();
        }
      });
    });
  }
}
複製程式碼

啟動類裡實現了一個介面,其實這個介面只有一個變數,沒有方法

RouterVerticle

public interface RouterVerticle {
  List<ApiHandler> routers = new ArrayList<>();
}
複製程式碼

接下來再看每個業務相關的Verticle如何寫

BookVerticle

public class BookVerticle extends AbstractVerticle implements RouterVerticle {

  private SQLClient sqlClient;

  @Override
  public void start() throws Exception {
    super.start();
    JsonObject mysqlConfig = new JsonObject().put("host", "127.0.0.1")
        .put("port", 3306).put("maxPollSize", 10)
        .put("username", "root").put("password", "xxx")
        .put("database", "vertx");

    sqlClient = MySQLClient.createShared(vertx, mysqlConfig);
    routers.addAll(Arrays.asList(
        new ApiHandler(HttpMethod.GET, "/b1", res -> {
          sqlClient.query("select * from user", r -> {
            if (r.succeeded()) {
              res.response().end(r.result().getRows().toString());
            } else {
              res.response().end(r.cause().getMessage());
            }
          });
        }),
        new ApiHandler(HttpMethod.GET, "/b2", res -> {
          System.out.println(vertx.toString());
          res.response().end("b2 ok");
        })
    ));
  }
}
複製程式碼

還有一個最核心的config.json檔案,沒有它,這些和業務相關的Verticle 是不能部署成功的

config.json

{
  "port" : 8080,
  "verticles" : [
    "com.sweet.web.BookVerticle",
    "com.sweet.web.UserVerticle",
    "com.sweet.web.PhoneVerticle"
  ]
}
複製程式碼

這樣配置好後,就大功告成了。試試瀏覽器訪問吧~,以後如果還有其他業務,只要在寫一個 Verticle並實現RouterVerticle介面,然後在config.json裡新增上該類的路徑。

原始碼 https://gitee.com/gnu/vertx-start

相關文章