按照官網的寫法會把一堆方法寫到一個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