Vert.x 代码结构最佳实践

按照官网的写法会把一堆方法写到一个Verticle里面,要不就是通过EventBus 进行转发到其他Verticle,也觉得不是很优雅,所以就有这篇文章。

首先先看下整体代码结构图

启动类代码

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值