WebFlux做项目碰到的一些问题

之前一直不明白为什么WebFlux 在SpringCloud Gateway用了这么久怎么没有直接用它写服务和单独的项目 直到我自己踩坑以后…

1 数据库

首先 r2bdc 太不成熟 多表查询根本就不完善 需要闭坑 老老实实用阻塞的方式去请求数据库

2 用户请求参数

WebFlux 的 ServerWebExchange 的 getRequest().getHeaders() 获取到的参数有很多是获取不到的 比如 date

还有些其它隐性规则 比如 x_param1 这样不行 必须 x-param1

还有大小写问题 前端传递 XXX 后端获取到 xxx

等使用 SpringMVC 不会碰到的异常

其实就是完全按http协议来 http协议说header忽略大小写 WebFlux获取到的header就全是小写的

3 WebClient

1
2
3
webClient.method(method).uri(url).headers(httpHeaders -> {
httpHeaders.addAll(exchange.getRequest().getHeaders());
});

想把所有的请求头信息全部转发到WebClient 要注意

header 关键字等信息无法转发

我用这个是要实现接口转发 但是 header中的数据 原始接口有个 date参数 WebClient就完全无法转发

只能单独设置为 date: 时间戳

但是用户是上帝 人接口就是不符合http协议规范 传递参数愣是携带的header关键字…

4 报错

我写的项目类似 Apache ShenYu 和 Soul 网关这样的系统

不过我把 管理和集群写成同一个项目

就导致我的项目既有 WebHandle 处理 plugin 又有 DispatcherHandler 处理 MVC

这时我碰到一个问题

前端请求MVC时 参数错误之类的导致 进入 DispatcherHandler 但是 参数对应不上时 会没有任何异常抛出并且没有任何返回

解决方案

1
2
3
4
5
6
return dispatcherHandler.handle(exchange).doOnError(e->{
//handle ServerWebExchange 时单独处理 doOnError 这里直接抛出 全局异常处理就能接收到
//否则 ServerWebInputException NoResourceFoundException MethodNotAllowedException等
//这些在进入Controller之前的异常 全局异常会捕获不到 导致没有任何响应和日志
throw (RuntimeException)e;
});