携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情
背景
最近在公司接到一个新项目需要使用 Spring WebFlux 作为新的开发框架。所以在此记录一下关于新的框架的学习与总结。
基础知识
这里推荐几篇非常不错的博文,希望对一些基础知识有初步的了解。
提到异步编程就不得不说同步代表框架 Spring MVC。两者本质上都是 Web 框架,不同点在于底层的网络选型上。简单的来说 Spring MVC 构建于 Servlet API 之上,使用的是同步阻塞式网络模型(每一个网络请求对应开辟一个线程去处理)。 Spring WebFlux 是一个异步非阻塞式的 Web 框架,它能够充分利用多核 CPU 及非阻塞的网络框架去处理大量请求。
Webflux 体验
1. start spring
如图 Maven、代码结构等与正常 Spring-boot 项目无异。默认的启动端口为 8080 ~
唯一的区别就是写接口的时候返回的 Momo
或者 Flux
。
2. 响应式编程 & lambda
第一步我们开启了 Webflux 的大门,但也只是的冰山一角。要想真正写好 Webflux 的代码一定要学习 Reactive Stream 与 Lambda。最终的代码样式如下:
简单的来说将每次请求变成一次流计算,使用 Lambda 的编程模式对流数据加工。
3. 异步客户端
Spring-boot 中常见的 Resttemplate、HttpClient 同步的 HTTP 请求在 WebFlux 的体系下已经不适用了。与之相匹配的是 Reactive WebClient,下图为 WebClient 的示例代码:
4. 使用场景
非常需要注意的是使用 Spring WebFlux 那么整个框架的安全认证层、数据访问层框架都必须使用 Reactive API 使用非阻塞的网络调用。如需要将 JDBC 的数据库驱动改成 R2DBC、Spring-data-redis 修改成 Spring-data-redis-reactive。一句话来说所有涉及网络调用的地方都需要同步变异步。
下面列举几种 WebFlux 适用的场景:
- 网关是非常适合 WebFlux 的场景,有着需要支持高并发的场景,通常只需要做接口的转发以及数据的聚合。能够显著地提升对下游服务转发的吞吐量。例如:Spring Cloud Getway
- 业务流程不复杂,但是追求性能的场景。例如需要在单机实现 C10K 的业务场景
但是 WebFlux 也有很多不适用的场景:
- 项目已经是 SpringMvc 的场景,重构成 WebFlux 项目。涉及到数据库、第三方依赖都需要修改代码。
- 业务较复杂非常依赖第三方 SDK 的场景。涉及到三方的 SDK,如果没有提供异步调用的 SDK,所有的接口调用都需要使用 webClient 重新封装。
- 业务中依赖数据库的事务或 redis 的分布式锁的场景。 传统的事务注解均失效
@Transactional
。