异步并发编程

异步事件驱动开发

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次是错的。不像单线程程序那么容易暴露问题。

猜你喜欢

转载自blog.csdn.net/shang_xs/article/details/87073150