按照官网的写法会把一堆方法写到一个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