失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Vert.x系列(一)--Vert.x介绍

Vert.x系列(一)--Vert.x介绍

时间:2023-10-30 02:29:54

相关推荐

Vert.x系列(一)--Vert.x介绍

独角兽企业重金招聘Python工程师标准>>>

1.Vert.x 介绍

Vert.x(官网:https://vertx.io/ )基于JVM、轻量级、高性能Java框架。 功能强大,第三方库依赖少的。

它只依赖Netty4以及Jackson。 分布式情况下还要依赖HazelCast这个分布式框架。

包含了一个企业级应用程序所需的所有要求。

2.Vert.x 组件概念

1.Vertx: 框架核心,所有程序共享一个vertx实例: 分为2种:单机vertx() / 分布式:clusteredVertx()。 是大部分功能的基础。 如果要举例的的话,比较像Spring的 ApplicationContext。

代码:

Vertx vertx = Vertx.vertx();

2.Verticle 业务处理单元,所有的自定义类需要继承Verticle或AbstractVerticle。

分为3种:

Standard Verticles 这是最常见和通用的类型-他们总是使用一个 event loop thread(事件循环线程) 执行。

Worker Verticles 用于执行阻塞任务

Multi-threaded worker Verticles 使用来自 worker pool(工作者线程池) 中的线程运行。一个实例可以被多个线程同时执行。(高级特性,不推荐使用) 代码:

public class MyVerticle extends AbstractVerticle {// 业务方法foo(){}public static void main(String[] args) {Vertx vertx = Vertx.vertx();DeploymentOptions options = new DeploymentOptions();vertx.deployVerticle(new MyVerticle(), options);}}

3.EventBus 事件总线。 Verticle 之间的通信靠它。支持点对点send、广播publish 2个模式。

代码:

// Verticle1Object message1 = new Object(); // 要传递的消息vertx.eventBus().send("Address1", message1, ar -> {if (ar.succeeded()) {System.out.println("发送成功");}});// Verticle2vertx.eventBus().consumer("Address1", ar -> {Object message = ar.body();System.out.format("接受成功{}", message); // 获得了上面的Verticle1的消息});// Verticle2 (写法2,不使用lamda表达式)vertx.eventBus().consumer("Address1", new Handler<Message<Object>>() {@Overridepublic void handle(Message<Object> event) {Object message = event.body();System.out.format("接受成功{}", message);}});

4.EventLoop 一个vertx 会有多个event loop,称为event loop group(数量和CPU的核心数有关。) 每部署1个verticle,都会为该verticle绑定1个event loop。一个verticle对应一个event loop,但一个event loop 对应多个verticle. vertx上的事件传递到eventLoop 上,再进行分发。即“邮局”。而EventLoop通过循环事件队列来执行所有的业务逻辑。 Event Loop线程不能被阻塞,否则事件将无法被处理。这个被官方认定为“黄金法则”,不应该打破。框架针对这个要求的自检逻辑。

(EventLoopGroup截图)

(阻塞线程后出现的警告)

3.Vert.x 的 executeBlocking

既然黄金法则不允许被打破,那么代码有需要长时间的逻辑,该怎么办? 方法1:使用 executeBlocking 。方法2:变成work verticle.

举例介绍 executeBlocking

public String someLongTask() {try {Thread.sleep(6000);} catch (InterruptedException e) {e.printStackTrace();}return "好久";}

如果不用executeBlocking:

System.out.println("1:" + new Date());String result = someLongTask();System.out.println("result:" + result);System.out.println("2:" + new Date());

如果使用executeBlocking:

vertx.executeBlocking(future -> {System.out.println("1:" + new Date());String result = someLongTask();plete(result);System.out.println("2:" + new Date());}, res -> {if (res.succeeded()) {System.out.println("result:" + res.result());};});

4. Vert.x的线程安全:

什么是线程安全: 从某个线程开始访问到访问结束的整个过程,如果有一个访问对象被其他线程修改,那么对于当前线程而言就发生了线程安全问题;如果在整个访问过程中,无一对象被其他线程修改,就是线程安全的。

重点是: 1.有多线程。 2.同时操作。

Vert.x怎么保证线程安全: 对于Standard verticles, 针对 Vert.x会保证verticles下的所有Handler会一直在同一个Event Loop线程中执行(即红字). 对于Worker verticles, 实例在一个时间点只会被一个线程来执行,不会在同一个时间有两个线程同时执行一个Worker Verticle实例(也即红字). 对于Multi-threaded worker verticles 不保证。会有多个线程同时执行一个Worker Verticle实例。 个人认为线程安全是Vert.x最好的优点。

如果觉得《Vert.x系列(一)--Vert.x介绍》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。