在看SpringCloud
网关的技术选型时,绕不开zuul这个组建,但是为什么我们选用gateway
的网关,一是因为gateway
是Spring
的全家桶项目,另外一个重要原因,也是zuul是基于servlet实现的换言之还是同步阻塞式。
非阻塞带来的好处不言而喻,高效利用线程资源进而提高吞吐量,基于此Spring
率先拿出针对于web
的杀手锏,就是webflux
。而Gateway
本身就是基于webflux
基础之上实现的,帮助我们构建一套高效的微服务网关。
springcloud-gateway
是基于netty运行的环境,在servlet容器环境或者把它构建为war包运行的话是不允许的,因此在项目当中没有必要添加spring-boot-starter-web
包。
Reactive Streams
是规范,Reactor
实现了 Reactive Streams
【响应式编程】。
WebFlux
以 Reactor
为基础,实现 Web
领域的反应式编程框架
反应式编程可以理解为事件模式或者是订阅者模式,我们如何去实现事件模式【guava的EventBus
就是一个例子】。
Spring Boot
应用程序可以用命令风格(如传统Spring WebMVC
)或函数风格(如Spring WebFlux
)
服务器端,WebFlux
支持两种不同的编程模型
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();
}
Java 8
的 lambda 表达式的函数式编程模型org.springframework.web.reactive.function.server.HandlerFunction
来表示,HandlerFunction
是一个函数式接口,其中只有一个方法 Mono handle(ServerRequest request)
,因此可以用 labmda
表达式来实现该接口,接口 ServerRequest
表示的是一个 HTTP
请求。通过该接口可以获取到请求的相关信息,如请求路径、HTTP
头、查询参数和请求内容等。方法 handle 的返回值是一个 Mono
对象。接口 ServerResponse
用来表示 HTTP 响应。ServerResponse
中包含了很多静态方法来创建不同 HTTP 状态码的响应对象目前 Spring Boot 不支持在一个应用中同时使用两种不同的编程模式
这两种编程模型只是在代码编写方式上存在不同。它们运行在同样的反应式底层架构之上,因此在运行时是相同的。
WebFlux
需要底层提供运行时的支持,WebFlux 可以运行在支持 Servlet 3.1 非阻塞 IO API 的 Servlet
容器上,或是其他异步运行时环境,如 Netty
和 Undertow
。
Tomcat7.x是Servlet3.0,Tomcat8.x是Servlet3.1。
1.Spring WebFlux
是异步,非阻塞的。
2.WebFlux
有Mono
,Flux
两种集合类型。
3.Mono
是0->1集合类型,比如Mono。
4.Flux
是1->n集合类型,比如Flux
5.Mono,Flux
都是异步处理的,而集合对象基本上是同步的。
1.Web Flux
的效率(qps)比Web MVC
高。
2.Web Flux
的编程难度高,维护成本高,对于切面等不好编写。
Reactor
是JVM
的完全非阻塞反应式编程基础,具有高效的需求管理(以管理“背压”的形式)。它直接与Java 8功能的API,特别是整合CompletableFuture
,Stream
和 Duration
。它提供了可组合的异步序列API Flux
(用于多个元素)和Mono
(用于[0 | 1]元素),广泛地实现了Reactive Extensions
规范。这段的重点是和Java8
结合利用lambda
表达式简洁的优点。
实现Publisher
并返回0或1个元素;
实现Publisher
并返回N个元素。