首页  

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 实例