SpringCloud Gateway中的Spring WebFlux技术点

一、前言

在看SpringCloud网关的技术选型时,绕不开zuul这个组建,但是为什么我们选用gateway的网关,一是因为gatewaySpring的全家桶项目,另外一个重要原因,也是zuul是基于servlet实现的换言之还是同步阻塞式。
非阻塞带来的好处不言而喻,高效利用线程资源进而提高吞吐量,基于此Spring率先拿出针对于web的杀手锏,就是webflux。而Gateway本身就是基于webflux基础之上实现的,帮助我们构建一套高效的微服务网关。

1.1 基础环境

springcloud-gateway是基于netty运行的环境,在servlet容器环境或者把它构建为war包运行的话是不允许的,因此在项目当中没有必要添加spring-boot-starter-web包。

1.2 WebFlux与Reactive Stream的关系

Reactive Streams是规范,Reactor实现了 Reactive Streams【响应式编程】。
WebFluxReactor为基础,实现 Web领域的反应式编程框架
反应式编程可以理解为事件模式或者是订阅者模式,我们如何去实现事件模式【guava的EventBus就是一个例子】。

1.3 SpringBoot生态支持

Spring Boot应用程序可以用命令风格(如传统Spring WebMVC)或函数风格(如Spring WebFlux

1.4 编程方式与容器支持

服务器端,WebFlux支持两种不同的编程模型

  1. Spring MVC 中使用的基于 Java 注解的方式
@RestController
public class BasicController {
    @GetMapping("/hello_world")
    public Mono<String> sayHelloWorld() {
        return Mono.just("Hello World");
    }
}
@GetMapping("")
public Flux<User> list() {
	return this.userService.list();
}
  1. 基于 Java 8lambda 表达式的函数式编程模型
    在函数式编程模型中,每个请求是由一个函数来处理的, 通过接口org.springframework.web.reactive.function.server.HandlerFunction来表示,HandlerFunction是一个函数式接口,其中只有一个方法 Mono<T extends ServerResponse> handle(ServerRequest request),因此可以用 labmda表达式来实现该接口,接口 ServerRequest表示的是一个 HTTP请求。通过该接口可以获取到请求的相关信息,如请求路径、HTTP头、查询参数和请求内容等。方法 handle 的返回值是一个 Mono<T extends ServerResponse>对象。接口 ServerResponse用来表示 HTTP 响应。ServerResponse中包含了很多静态方法来创建不同 HTTP 状态码的响应对象

目前 Spring Boot 不支持在一个应用中同时使用两种不同的编程模式

这两种编程模型只是在代码编写方式上存在不同。它们运行在同样的反应式底层架构之上,因此在运行时是相同的。

WebFlux需要底层提供运行时的支持,WebFlux 可以运行在支持 Servlet 3.1 非阻塞 IO API 的 Servlet容器上,或是其他异步运行时环境,如 NettyUndertow

Tomcat7.x是Servlet3.0,Tomcat8.x是Servlet3.1。

二、技术特点

1.Spring WebFlux是异步,非阻塞的。

2.WebFluxMonoFlux两种集合类型。

3.Mono是0->1集合类型,比如Mono。

4.Flux是1->n集合类型,比如Flux

5.Mono,Flux都是异步处理的,而集合对象基本上是同步的。

Web Flux(Netty)跟Web MVC(Servlet)优缺点?

1.Web Flux的效率(qps)比Web MVC高。

2.Web Flux的编程难度高,维护成本高,对于切面等不好编写。

核心组件

ReactorJVM的完全非阻塞反应式编程基础,具有高效的需求管理(以管理“背压”的形式)。它直接与Java 8功能的API,特别是整合CompletableFutureStreamDuration。它提供了可组合的异步序列API Flux(用于多个元素)和Mono(用于[0 | 1]元素),广泛地实现了Reactive Extensions规范。这段的重点是和Java8结合利用lambda表达式简洁的优点。

1.Mono

实现Publisher并返回0或1个元素;

2.Flux

实现Publisher并返回N个元素。

发布了17 篇原创文章 · 获赞 4 · 访问量 3381

猜你喜欢

转载自blog.csdn.net/u013553309/article/details/104834384