欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-07 11:01:46
接上一篇: 实战SpringCloud响应式微服务系列教程(第一章) 实战SpringCloud响应式微服务系列教程(第二章) 实战SpringCloud响应式微服务系列教程(第三章) 1.1.4 引入Reactor框架 如果想在代码中集成 Reactor框架,则需要添加如下的 Maven依赖,分别 ......

接上一篇:

实战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开发响应式应用程序时,无论采用何种操作符,都将得到一个如图所示的异步数据序列。

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

onnext x 0..n [onerror |oncomplete]

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

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

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

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

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

2.flux组件

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

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

以下代码示例展示了在具体项目中使用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>代表一个空的异步序列。

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

与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对象。