这篇文章将介绍如何通过 Vert.x 来开发一个 web 应用。
Q:为什么要使用 Vert.x
A:因为 Vert.x 是一个更纯粹的基于 Reactive 模式的框架,在云平台上可以更充分利用容器的资源,基于 Netty 的二次开发,可以更好的利用 Netty 的一些特性。
关于什么是 Vert.x,请参考这篇文章
快速开始
你可以通过脚手架创建一个基础工程,至少需要包括:
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-web</artifactId>
</dependency>
复制代码
扩展
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
复制代码
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
复制代码
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
复制代码
代码
这里将会使用Router
来代替脚手架里面的原生代码,方便更好的管理代码。
HttpServer server = vertx.createHttpServer();
Router router = Router.router(vertx);
router.route().handler(BodyHandler.create());
router.errorHandler(HttpResponseStatus.SERVICE_UNAVAILABLE.code(), ctx -> {
ctx.end("something went to wrong, try it later.");
});
复制代码
router.get("/demos").handler(request -> {
request.json(demos);
});
复制代码
router.post("/demo").handler(request -> {
Demo demo = request.body().asPojo(Demo.class);
if (!demos.containsKey(demo.getKey())) {
demos.put(demo.getKey(), demo);
request.end("record had been added.");
} else {
request.response().setStatusCode(HttpResponseStatus.NOT_ACCEPTABLE.code());
request.end("no record has been added");
}
});
复制代码
router.put("/demo/:key").handler(request -> {
String key = request.pathParam("key");
Demo demo = request.body().asPojo(Demo.class);
if (demos.containsKey(key)) {
demos.put(demo.getKey(), demo);
request.end("record had been updated.");
} else {
request.response().setStatusCode(HttpResponseStatus.NOT_FOUND.code());
request.end("no record exists.");
}
});
复制代码
router.delete("/demo/:key").handler(request -> {
String key = request.pathParam("key");
Demo demo = demos.remove(key);
if (demo != null) {
request.response().setStatusCode(HttpResponseStatus.NO_CONTENT.code());
request.end();
} else {
request.response().setStatusCode(HttpResponseStatus.NOT_FOUND.code());
request.end("no record found.");
}
});
复制代码
启动
./mvnw clean compile exec:java
复制代码
评论