vertx core web 实例
所属分类 vertx
浏览量 293
Vert.x is event driven and non blocking.
This means your app can handle a lot of concurrency using a small number of kernel threads.
Vert.x lets your app scale with minimal hardware.
Vert.x 定位是一个事件驱动的编程框架,
netty是Vert.x底层使用的通讯组件,屏蔽了netty的底层细节,比如ByteBuf、引用计数等
netty中有两个EventLoop,一个BossEventLoop和一个WorkerEventLoop,分别负责负责监听Socket事件和处理对应的请求。
在Vert.x中,这两个EventLoop通过一定的方法都可以获取到。
一般更加关注的是WorkerEventLoop,因为用户自定义的代码跑在这个EventLoop上。
Vert.x对这个EventLoop作了扩展,除了处理服务器IO事件,用户自定义的事件也可以基于Vert.x进行处理。
使用Vert.x构建一个简单的HttpServer
HttpServer server = vertx.createHttpServer();
server.requestHandler(request -> {
HttpServerResponse response = request.response();
response.putHeader("content-type", "text/plain");
response.end("Hello,vertx");
});
server.listen(8000);
http://127.0.0.1:8000/
请求路由 Router
需要引入 vertx-web
import io.vertx.core.Vertx;
import io.vertx.core.VertxOptions;
import io.vertx.core.http.HttpServer;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.Router;
public class HelloWeb {
public static void main(String[]args)throws Exception{
System.out.println("hello vertx web");
Vertx vertx = Vertx.vertx(new VertxOptions().setWorkerPoolSize(21));
HttpServer server = vertx.createHttpServer();
Router router = Router.router(vertx);
router.get("/hello").handler(context ->
context.response().setStatusCode(200)
.putHeader("content-type", "application/json;charset=utf-8")
.putHeader("cache-control", "no-cache")
.end(new JsonObject().put("code", 0).put("time", System.currentTimeMillis()).toBuffer()));
router.get("/hello2").handler(HelloWeb::hello2);
server.requestHandler(router).listen(8000);
}
private static void hello2(RoutingContext context){
context.response().setStatusCode(200)
.putHeader("content-type", "text/plain; charset=utf-8")
.end("hello2");
}
}
http://127.0.0.1:8000/hello
http://127.0.0.1:8000/hello2
https://vertx.io/docs/4.2.7/vertx-web/java/
Vert.x中有一个黄金法则,那就是永远不要阻塞EventLoop!
阻塞的代码会导致EventLoop无法正常响应其它事件,由此可能引发性能问题甚至服务不可用
Vert.x中提供了一种执行阻塞的代码的方法 executeBloking,
Vert.x的Context上关联了一个固定大小的线程池,这个线程池的大小默认是20,
阻塞的任务放到这个这里面去执行就不会阻塞事件循环了
vertx.executeBlocking(promise -> {
// Call some blocking API that takes a significant amount of time to return
String result = someAPI.blockingMethod("hello");
promise.complete(result);
}, res -> {
System.out.println("The result is: " + res.result());
});
executeBlocking是在Vert.x环境中解决阻塞代码问题的一种方法,但并不是银弹。
实际上 Vert.x 并不提倡用这种方式来实现业务逻辑,
因为这种方式会带来线程的上下文切换从而造成性能损失。
Vert.x为了解决这个问题,将原本连续的代码人为设计为一段一段的,
同时这些代码始终跑在同一个线程上,通过这种方式来模拟协程的运行。
Vert.x提供了很多原生组件来达到异步的效果,比如vertx-redis-client,vertx-kafka-client,vertx-mysql-client等,
这些组件并不是简单地基于原本的第三方jar包+executeBlocking包装实现,而是直接从TCP层面实现了原本的协议,同时带来了真正的异步。
上一篇
下一篇
docker和containerd
k8s服务暴露
容器化部署 docker docker-compose k8s
JAVA Void类
vertx promise future
vertx verticle 实例