异步事件驱动开发
web flux
reactive
async
Vert.x异步编程
什么是Vert.x
是一个在JVM平台构建reactive应用的工具箱
- 基于Netty
- 多语言支持
- 多模块支持(数据库、日志、服务发现)
为什么要用Vert.x
Reactive编程模型性
- 函数式
- 异步
- 非阻塞
- web 技术栈
- 适合嵌入式或微服务应用
Vert.x核心概念
- 线程和编程模型
- 异步I/O(async i/o)
- 事件循环 (Event loop)
- 事件总线(Event Bus)
依赖添加
<!-- https://mvnrepository.com/artifact/io.vertx/vertx-core -->
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-core</artifactId>
<version>3.6.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.vertx/vertx-web -->
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-web</artifactId>
<version>3.6.0</version>
</dependency>
示例一:
public class VertxDemo {
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
// vertx.setPeriodic(500,System.out::println);
// vertx.setPeriodic(500,System.out::println);
// vertx.setPeriodic(500,System.out::println);
// Executors.newScheduledThreadPool(1)
// .schedule(() -> System.out.println("sxs"),1000, TimeUnit.MILLISECONDS);
vertxEventBusDemo(vertx);
vertxDemo(vertx);
vertx.close();
}
private static void vertxEventBusDemo(Vertx vertx) {
String address = "test-address";
// 事件订阅
vertx.eventBus().consumer(address,message -> {
Object body = message.body();
System.err.printf("Address: %s -> message: %s\n", address, body);
}).completionHandler(handler ->{
System.err.println("消费完成...");
});
// 事件发布
vertx.eventBus().publish(address, "hello world !");
vertx.eventBus().publish(address, "sxs !");
}
private static void vertxDemo(Vertx vertx){
vertx.deployVerticle(new AbstractVerticle() {
@Override
public void start(Future<Void> startFuture) throws Exception {
System.out.println("start");
startFuture.complete();
}
@Override
public void stop(Future<Void> stopFuture) throws Exception {
System.out.println("stop");
}
});
}
}
web示例二:
public class VertxWebDemo {
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
// 创建Http服务
vertx.createHttpServer().requestHandler(handler ->{
// 请求
String requestMsg = handler.getParam("request");
// 响应
HttpServerResponse response = handler.response();
response.end("hello " + requestMsg);
// 监听端口
}).listen(8080);
}
// 执行结果
// 访问 http://localhost:8080/?request=123
// 页面显示 hello 123
}
Reactor Streams并发编程之Reactor
- 理解Reactor Streams编程
- 了解Reactor基本使用
- 复制了解WebFlux
Reactive Streams 规范
Reactor Streams 框架
WebFlux -> Reactor -> Reactor Streams API
- 如果是CPU密集型,Reactive无济于事
- 1 Thread CPU占满了,其他线程不得不等待
Reactive 编程
是一种异步编程的示范,这种示范与数据流式处理以及变化传播相关联,同时经常被面向对象语言表示,作为一种观察者模式的扩展。
使用多线程的两个典型的场景:
(1)并发,通过并发实现对低速io访问的延迟隐藏,以及防止界面的阻塞。典型场景,多线程下载,后台打印等等。
(2)并行,当系统上有超过1个CPU的时候,通过并行算法让每个处理器执行计算任务的一部分,共同完成计算来提高速度。
多线程编程的缺点:
(1)线程切换是有开销的,这会导致程序运行变慢。
(2)多线程程序必须非常小心地同步代码,否则会引起死锁。
(3)多线程程序极难调试,并且一些bug非常隐蔽,可能你99次运行都是对的,但是有1次是错的。不像单线程程序那么容易暴露问题。