最近开始对Reactor的一点迈进,简单说从spring-boot-start-webspring-boot-start-webflux 的一些坑 和一些感想。 springboot 默认的web 还是 tomcat 作为启动,并且tomcat 8开始也采用了Nio模型
spring官网 祭出一张图.

图片左侧异步模型为驱动的Reactive流派 右侧为传统的Web流派

Reactive家族包含 MongoDB Redis webflux 还有几个不认识

Servlet的传统web家族就是我们常用的 Mysql Springmvc Nosql 等

值得一提的就是 在右侧的情况下依然可以使用左侧的东西,但是带来的缺点也就是失去了他原有的特性

根据最新的GA版本,我们的系统调用大部分时间是可以实现完全的非阻塞系统调用的-->关系型数据库(MySQL)除外。因为原来的 Spring 事务管理(Spring Data JPA)都是基于 ThreadLocal 传递事务的,其本质是基于阻塞IO模型,不是异步的。但Reactive是要求异步的,不同线程里面 ThreadLocal 肯定取不到值了。根据最新的进展,好消息是目前的R2DBC项目已经实现postgresql的非阻塞实现,相信在不久的将来,MySQL也会最终加入Reactive Stack的拼图。

听说Postpresql 支持 不知道会不会成为替代者或者说在未来Mysql也会添加Reactive的支持

简单说明一下webflux遇到的坑:

application.yaml中配置server.servlet.context-path=/dev 没效果,思考后想了一下,webflux基于netty,是没有Servlet规范的所以并没有其效果,但是server.context-path=/dev 依然没有效果

在github得到了相关答案https://github.com/spring-projects/spring-boot/issues/10129

原文:

In Spring Framework, there are several ways to deal with context paths:

  • deploying your WebFlux app as a war in a Servlet container and configure the Servlet to a particular context path. Spring Boot does not support WebFlux war deployment.
  • Spring Framework provides a ContextPathCompositeHandler that allows delegating to multiple HttpHandler instances depending on the path. With @EnableWebFlux, you can provide both WebFlux annotation and WebFlux functional handlers and they'll be mapped accordingly.

While we could leverage that last bit and map the whole WebFlux application to a particular context, I don't see the real added value since we don't deploy to war nor map multiple HttpHandler instances. We'd just have everything mapped under one path.

google translate:

在Spring Framework中,有几种方法可以处理上下文路径:

将WebFlux应用程序部署为Servlet容器中的war,并将Servlet配置为特定的上下文路径。 Spring Boot不支持WebFlux战争部署。 Spring Framework提供了一个ContextPathCompositeHandler,它允许根据路径委托多个HttpHandler实例。使用@EnableWebFlux,您可以提供WebFlux注释和WebFlux功能处理程序,并且它们将相应地进行映射。 虽然我们可以利用最后一点并将整个WebFlux应用程序映射到特定上下文,但我没有看到真正的附加值,因为我们没有部署到war,也没有映射多个HttpHandler实例。我们只需将所有内容映射到一条路径下。

暂时先写到这 因为要下班了


续命:

如果他不支持Context-path怎么办 有没有好的办法,于是就有了trim的想法,我还到github提了一个比较zz的issue,也非常感谢他们能回复我的这个问题, https://github.com/spring-projects/spring-boot/issues/17338

It could work, but you have to pay attention to the ordering of filters (especially if one is taking care of security).

他可以这样去使用,但是你需要注意过滤器的顺序,并且在考虑security的情况下,也就是说我们需要注意过滤器链的顺序,常见的spring security ,可能我们需要放在他的之前, 这个问题就算暂时解决了.

我们下次见 拜拜