接着之前的:

实战SpringCloud响应式微服务系列教程(第一章)

实战SpringCloud响应式微服务系列教程(第二章)

1.1.3Reactor框架

响应式编程是一种编程模型,本节将介绍这种编程模型的具体实现工具 Project Reactor框架。 Reactor框架也是 Spring5中实现响应式编程采用的默认框架。

Project Reactor: https://projectreactor.io/

1.1.4响应式编程实现技术概述

响应式编程就是利用异步数据流进行编程,本质上就是观察者( Observer)模式的一种表现形式。本节首先讨论实现异步操作的几种常见方式,然后引出响应式编程的主流实现技术。

1.实现异步操作的常见方式

在Java中,为了实现异步非阻塞,一般会采用回调( Callback)和 Future这两种机制,但这两种机制都存在一定局限性。

(1)回调

回调的含义如图所示,即类A的 method A()方法调用类B的 method B()方法,然后类B的 methodB()方法执行完毕后再主动调用类A的 callback()方法。回调体现的是一种双向的调用方式。

可以看到,回调在任务执行过程中不会造成任何阻塞,任务结果一且就绪,回调就会被执行。但我们也应该看到在使用回调机制时,代码会从一个类中的某个方法跳到另一个类中的某个方法,从而造成流程的不连续性。对于单层的异步执行而言,回调很容易使用。

但是对于嵌套的多层异步组合而言,就显得非常笨拙。所以回调很难大规模地组合起来使用,因为很快就会导致代码难以理解和维护,即形成所谓的“回调地狱( Callback Hell)”问题。

(2) Future

可以把 Future模式简单理解为这样一种场景:有一个希望处理的任务,把这个任务提交到 Future, Future就会在一定时间内完成这个任务,而在这段时间内我们可以去做其他事情。

作为 Future模式的实现,Java中的 Future接口只包含如下5个方法

public interface Puture<v>{
boolean cancel (boolean mayinterrupt Ifrunning):
boolean iscancelled
boolean isdone ():
V get() throws Interruptedexception, Executionexception;
V get (long timeout, Timeunit unit)?
throws Interruptedexception, Executionexception, Timeoutexception
}

Future接口中的 cancel方法用于取消任务的执行; iscancelledo方法用于判断任务是否已经取消;两个get()方法会等待任务执行结束并获取结果,区别在于是否可以设置超时时间,最后 isDone()方法判断任务是否已经完成。

Future虽然可以实现获取异步执行结果的需求,但是它没有提供通知机制,我们无法得知 Future什么时候完成。为了获取结果,我们要么使用阻塞的两种get()方法等待 Future结果的返回,这时相当于执行同步操作;

要么使用 isDone方法轮询地判断 Future是否完成,这样会耗费CPU资源。所以, Future适合单层的简单调用,对于嵌套的异步调用而言同样非常笨重,不适合复杂的服务链路构建。

鉴于Future机制存在的缺陷,Java8中引入了 Completablefuture 机制。 Completablefuture在一定程度上弥补了普通 Future的缺点。在异步任务完成后,我们使用任务结果时就不需要等待,可以直接通过 thenaccept()、 thenApply()、 thencompose()等方法将前面异步处理的结果交给另外一个异步事件处理线程来处理。

Completablefuture提供了非常强大的 Future扩展功能,可以帮助我们简化异步编程的复杂性,并且提供了函数式编程的能力,可以通过回调的方式处理计算结果,也支持转换和组合 Completablefuture所提供的各种方法。

对日常开发工作而言,大多数时候我们是在处理简单的任务,这时使用 Completablefuture确实可以满足需求。但是,当系统越来越复杂,或者我们需要处理的任务本身就非常复杂时,Completablefuture对于多个处理过程的组合仍然不够便捷。使用 Completablefuture编排多个Future是可行的,但并不容易。我们会担心写出来的代码是否真的没有问题,而随着时间的推移,这些代码会变得越来越复杂和难以维护。为此,我们需要引入响应式编程的相关技术和框架,这些技术和框架能够支持未来更轻松地维护异步处理代码。

2.响应式编程的主流实现技术

目前,响应式编程的主流实现技术包括 Rxjava、 Akka Streams、Vert.x和 Project Reactor等。

(1)Rxjava

Reactive Extensions(Rx)是一个类库,它集成了异步基于可观察( Observable)序列的事件驱动编程,最早应用于微软的NET平台。而 Rxjava是 Reactive Extensions 的Java实现用于通过使用 Observable/ Flowable序列来构建异步和基于事件的程序库,目前有1x版本和2.x版本两套实现。

Rxjava1.x誕生于响应式流规范之前,虽然可以和响应式流的接口进行转换,但是由于底层实现的原因,使用起来并不是很直观。 Rxjava2在设计和实现时考虑到了与现有规范的整合,按照响应式流规范对接口进行了重写,并把1.x版本中的背压功能单独分离出来。但为了保持与 Rxjava1x的兼容性, Rxjava2在很多地方的使用也并不直观。关于 Rxjava的更多内容,可参考官网(http://reactivex.io/),我们这里不做过多介绍。

(2)Akka Streams

Akka运行在JVM上,是构建高并发、分布式和高弹性的消息驱动应用程序的一个工具件。 Actor是Akka中最核心的概念,它是一个封装了状态和行为的对象,Actor之间可以通过交换消息的方式进行通信。通过 Actor能够简化锁及线程管理,可以非常容易地开发出正确的并发程序和并行系统。

Akka也是响应式流规范的初始成员,而 Akka Streams是以Aka为基础的响应式流的实现,在Akka现有的角色模型之上提供了一种更高层级的抽象,支持背压等响应式机制。

(3) Vertx

Vert. x是 Eclipse基金会下的一个开源的Java工具,是一个异步网络应用开发框架,用来构建高并发、异步、可伸缩、多语言支持的Web应用程序。Vert.x就是为了构建响应式系统而设计的,基于事件驱动架构, Vert x实现了非阻塞的任务处理机制。

verx中包含Vert.x Reactive Streams工具库,该工具库提供了Vver.x上响应式流规范的实现。我们可以通过 Vert x提供的可读流和可写流处理响应式流规范中的发布者和订阅者。

(4) Project Reactor

Spring S中引入了响应式编程机制,而 Spring5中默认集成了 Project Reactor作为该机制的实现框架。 Reactor诞生较晚,可以认为是第二代响应式开发框架。

所以,它是一款完全基于响应式流规范设计和实现的工具库,没有 Rxjava那样的历史包,在使用上更加直观、易懂。但从设计理念和API的表现形式上, Reactor与 Rxjava比较类似,可以说 Reactor基于响应式流规范,但在API方面又尽可能向 Rxjava靠拢。

Flux和Mono是 Reactor中的两个核心组件,Flux代表包含0到n个元素的异步序列,而Mono则表示0个或者一个元素的序列。Reactor框架使我们讨论的重点,下一节我们将从Reactor框架的引入具体讲解Flux和Mono。

实战SpringCloud响应式微服务系列教程(第三章)的更多相关文章

  1. 实战SpringCloud响应式微服务系列教程(第二章)

    接上一篇:实战SpringCloud响应式微服务系列教程(第一章) 1.1.2背压 背压是响应式编程的核心概念,这一节也是我们了解响应式编程的重点. 1.背压的机制 在生产者/消费者模型中,我们意识到 ...

  2. 实战SpringCloud响应式微服务系列教程(第九章)使用Spring WebFlux构建响应式RESTful服务

    本文为实战SpringCloud响应式微服务系列教程第九章,讲解使用Spring WebFlux构建响应式RESTful服务.建议没有之前基础的童鞋,先看之前的章节,章节目录放在文末. 从本节开始我们 ...

  3. 实战SpringCloud响应式微服务系列教程(第一章)

    前言 在当今互联网飞速发展的时代,业务需求不断的更新和产品的迭代给系统开发过程和编程模式也带来巨大挑战,Spring Cloud微服务也随之应用而生,从springboot1.x到springboot ...

  4. 实战SpringCloud响应式微服务系列教程(第四章)

    接上一篇: 实战SpringCloud响应式微服务系列教程(第一章) 实战SpringCloud响应式微服务系列教程(第二章) 实战SpringCloud响应式微服务系列教程(第三章) 1.1.4 引 ...

  5. 实战SpringCloud响应式微服务系列教程(第六章)

    本章节介绍:Flux和Mono操作符 和其他主流的响应式编程一样,Reactor框架的设计目标也是为了简化相应式流的使用方法.为此Reactor框架提供了大量操作符用于操作Flux和Mono对象. 本 ...

  6. 实战SpringCloud响应式微服务系列教程(第七章)

    本章节继续介绍:Flux和Mono操作符(二) 1.条件操作符 Reactor中常用的条件操作符有defaultIfRmpty.skipUntil.skipWhile.takeUntil和takeWh ...

  7. 实战SpringCloud响应式微服务系列教程(第八章)构建响应式RESTful服务

    本文为实战SpringCloud响应式微服务系列教程第八章,讲解构建响应式RESTful服务.建议没有之前基础的童鞋,先看之前的章节,章节目录放在文末. 1.使用springboot2.1.4构建RE ...

  8. 实战SpringCloud响应式微服务系列教程(第十章)响应式RESTful服务完整代码示例

    本文为实战SpringCloud响应式微服务系列教程第十章,本章给出响应式RESTful服务完整代码示例.建议没有之前基础的童鞋,先看之前的章节,章节目录放在文末. 1.搭建响应式RESTful服务. ...

  9. Cobalt Strike系列教程第三章:菜单栏与视图

    通过前两章的学习,我们掌握了Cobalt Strike教程的基础知识,及软件的安装使用. Cobalt Strike系列教程第一章:简介与安装 Cobalt Strike系列教程第二章:Beacon详 ...

随机推荐

  1. MyBatis框架之基本知识介绍

    前身背景: 前身是iBatis,为Apache的一个开源项目.2010年迁移到了Google Code,改名为MyBatis.2013年迁移到Github. MyBatis框架以及ORM MyBati ...

  2. Android学习总结之开发工具AndroidStudio的安装与配置

    安装AndroidStudio 首先下载AndroidStudio的安装包,直接在百度AndroidStudio下载即可,安装过程简单,只需要修改安装路径(不要有空格和中文即可).然后下一步下一步就可 ...

  3. [剑指offer] 10. 旋转数组的最小数字

    题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 思路: 利用dp[i]保存盖2*i的矩形有多少种办法. 通过 ...

  4. 端口,OSI7层模型,TCP的三次握手和四次挥手,进度条

    1.端口: 端口是为了将同一个电脑上的不同程序进行隔离 IP是找电脑,端口是找电脑上的程序 MySQL是一个软件,帮助我们在硬盘上进行文件操作,默认端口是3306 Redis是一个软件,帮助我们在内存 ...

  5. maven打包添加依赖

    <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <versio ...

  6. 程序员的长安十二时辰:Java实现从Google oauth2.0认证调用谷歌内部api

    最近公司在做一个app购买的功能,主要思路就是客户在app上购买套餐以后,Google自动推送消息到Java后端,然后Java后端通过订单的token获取订单信息,保存到数据库. Java后端要获取订 ...

  7. jsp数据交互(二).1

    对象的作用域:   JSP中提供了四种作用域,分别是page作用域,request作用域,session作用域和application作用域. page作用域: page作用域指单一JSP页面的范围, ...

  8. thinkphp phpexcel导出返回乱码

    今天做了一个excel文件导出的功能  可是无论怎么改网上怎么搜答案什么缓冲啊charset=UTF-8'a都不起效 <?phpnamespace app\admin\controller;us ...

  9. 转发后找不到css

    当在jsp中引入css时,如果其相对路径相对于当前jsp文件的,而在一个和这个jsp的路径不一样的servlet中forward这个jsp时,就会发现这个css样式根本没有起作用. 这是因为在serv ...

  10. 第四章-使用本机文件对话框和帮助进程间沟通 | Electron实战

    本章主要内容: 使用Electron的dialog模块实现一个本机打开文件对话框 促进主进程和渲染器进程之间的通信 将功能从主进程暴露给渲染器进程 使用Electron的remote模块从主进程导入功 ...