接上一篇:

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

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

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

1.1.4 引入Reactor框架

如果想在代码中集成 Reactor框架,则需要添加如下的 Maven依赖,分别引入 Reactor的核心功能以及用于支持测试的相关工具类。

<dependency>
<groupid>io.projectreactor</groupid>
<cartifactid>reactor-cores/artifactid>
</dependency>
<dependency>
<groupid>io.projectreactor</groupid>
<cartifactid>reactor-tests/artifactid>
<scope>test</scope>
</dependency>

Reactor框架在实现响应式流规范的基础上有其特定的设计思想。本节先介绍 Reactor框架的异步数据序列,然后介绍Flux和Mono这两个核心组件。

1. Reactor异步数据序列

当使用 Reactor开发响应式应用程序时,无论采用何种操作符,都将得到一个如图所示的异步数据序列。

onNext x 0..N [onError |onComplete]

以上公式包含三种不同类型方法的调用,分别处理不同场景下的消息通知。

  • onNext():正常的包含元素的消息通知。

  • onCompleted():序列结束的消息通知,可以没有。

  • onError():序列出错的消息通知,可以没有。

按照响应式流规范,当这些消息通知产生时,异步序列的订阅者中对应的这三个方法将被调用。如果序列没有出错,则 onerror()方法不会被调用;如果不调用 onComplete()方法,就会得到一个无限异步序列。通常,无限异步序列应该只用于测试等特殊场景。

2.Flux组件

Flux代表0至N个元素的异步序列,如下图,序列的三种消息通知都是用于Flux.

以下代码示例展示了在具体项目中使用Fux组件的方法。如果我们了解微服务架构中基于 Hystrix I的服务回退( Fallback)机制,就应该知道代码中的 getordersfallbacko是一个典型的回退函数,我们通过FIux.fromlterableo方法构建了 Flux<Order>对象,作为回退函数的返回值。

关于服务回退机制,将在之后章节中具体介绍

private Flux<order> getordersfallback(){
List<order> fallbacklist = new Arraylist<>();
Order order= new Order();
order.setid("orderinvalidid");
order.setaccountid("Invalidid");
order.setitem("Order list is not available");
order.setcreatetime (new Date();
fallbacklist.add (order);
return Flux.fromiterable (fallbacklist);
}

下面的示例更加容易理解一点,从位于方法名上的@ Getmapping注解可以看出,这是个 Controller中的端点,用于返回一个 Order对象列表。这里返回的 Order列表同样通过Flux< Order>对象进行呈现。

@getmapping("/vl/orders")
public Flux<Order> getorderlist(){
Flux<order> orders= orderservice. getorders();
return orders;
}

3.Mono组件

在 Reactor中,Mono表示包含0个或1个元素的异步序列,如图所示,该序列中同样可以包含与Fux相同的三种类型的消息通知。

请注意,Mono也可以用来表示一个空的异步序列,该序列没有任何元素,仅仅包含序列结束的概念(类似于Java中的 Runnable)。我们可以用Mono<void>代表一个空的异步序列。

与FIux组件一样,通过服务回退来演示Mono组件的用法,示例代码如下。

private Mono<order> getorderfallback(){
Order order = new Order();
order.setid("orderinvalidid");
order.setaccountid("Invalidid");
order.setitem("Order list is not available");
order.setcreatetime(new Date());
return Mono.just(order);
}

这里首构建一个 Order对象,然后通过 Mono.just()方法返回一个Mono对象。

Controller层组件也是一样的,通过d获取Mono<Order>对象的端点示例如下。

@tapping("/vl/orders/{id}")
public Mono<order> getorder(@Pathvariable String id){
Mono<order> order orderservice.getorderbyid(id);
return order;
}

相较Mono,Flux是更通用的一种响应式组件,所以针对FIux的操作要比Mono更丰富。另一方面,FIux和Mono之间可以相互转换。例如,把两个Mono序列合并起来就得到一个Flux序列,而对一个FIux序列进行计数操作,得到的就是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响应式微服务系列教程(第二章) 1.1.3Reactor框架 响应式编程是一种编程模型,本节将介绍这种 ...

  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. C#多线程学习之如何操纵一个线程

    下面我们就动手来创建一个线程,使用Thread类创建线程时,只需提供线程入口即可.(线程入口使程序知道该让这个线程干什么事) 在C#中,线程入口是通过ThreadStart代理(delegate)来提 ...

  2. 针对Nginx日志中出现的漏洞扫描与爬虫的三种措施

    0x001 使用fail2ban工具结合防火墙(iptables | firewalld),将大量404请求的IP地址封了.(详见fail2ban使用说明:https://www.cnblogs.co ...

  3. python的乘法口诀表

    python的乘法口诀表 python的乘法口诀表 用python来写一个脚本,使得这个脚本在运行后自动输出乘法口诀表. pyton的脚本如下: #!/usr/bin/env python #codi ...

  4. Django的性能优化

    Django的性能优化   一,利用标准数据库优化技术 传统数据库优化技术博大精深,不同的数据库有不同的优化技巧,但重心还是有规则的.在这里算是题外话,挑两点通用的说说: 索引,给关键的字段添加索引, ...

  5. halcon视频教程如何学习?怎么样才能踏入机器视觉这个行业?

    本人是工作八年的视觉工程师,主要从事Halcon和Visionpro视觉开发,谈谈个人对视觉学习看法: 1.HALCON是德国MVtec公司开发的一套完善的标准的机器视觉算法包,它节约了产品成本,缩短 ...

  6. Python3数据驱动ddt

    对于同一个方法执行大量数据的程序时,我们可以采用ddt数据驱动的方式,来对数据规范化整理及输出 一.需要使用python的ddt库,ddt,data,unpack方法 1.仅使用ddt和data,代码 ...

  7. C语言编程入门之--第四章C语言基本数据类型

      导读:C语言程序中经常涉及一些数学计算,所以要熟悉其基本的数据类型.数据类型学习起来比较枯燥,不过结合之前的内存概念,以及本节的字节概念,相信数据类型也就不难理解了.本章从二进制的基本概念开始,然 ...

  8. dubbo是如何控制并发数和限流的?

    ExecuteLimitFilter ExecuteLimitFilter ,在服务提供者,通过 的 "executes" 统一配置项开启: 表示每服务的每方法最大可并行执行请求数 ...

  9. Qt Socket 收发图片——图像拆包、组包、粘包处理

    之前给大家分享了一个使用python发图片数据.Qt server接收图片的Demo.之前的Demo用于传输小字节的图片是可以的,但如果是传输大的图片,使用socket无法一次完成发送该怎么办呢?本次 ...

  10. Linux部署项目遇到问题解决

    使用Linux部署web项目,可能会遇到各种各样问题导致服务启动失败,以下是我近期部署项目遇到的问题以及解决方案 一.场景:把war包放入tomcat的webapps文件夹下,然后启动tomcat服务 ...