qwerthhusn
V2EX  ›  Java

Spring Cloud Gateway 中的 Filter 的 filter 方法是不是不适合调用 Blocking 代码?

By qwerthhusn at 2020 年 8 月 7 日 · 3262 次点击

现在写的一个 Filter 有同步调用 Redis 和 Feign 调用其他接口。 听说这样的话是不是会很影响性能,这个应该怎么弄?

5 条回复  •  2020-08-12 19:46:47 +08:00
shaoyijiong
   1
shaoyijiong  
   2020 年 8 月 7 日
spring data redis 底层用的是 Lettuce 支持非阻塞调用 , 可以使用 ReactiveRedisTemplate
接口的话可以使用 WebClient , 或者 https://github.com/OpenFeign/feign-reactive/issues/20
gz911122
   2
gz911122  
   2020 年 8 月 7 日
Feign 可以换用 retrofit 支持异步调用.
反正 Feign 本身就是模仿 retrofit 写的, 俩 api 差不多
qwerthhusn
   3
qwerthhusn  
OP
   2020 年 8 月 8 日
@gz911122 @shaoyijiong
Redis 那里没问题,Spring Data Reactive 可以用。
Feign 的话我能不能通过 Project Reactor 提供的 subscribeOn/publishOn 实现将 feign 的同步代码放到 IO 线程中执行??

我现在还没绕清楚这个 subscribeOn 和 publishOn 是如何进行线程切换的,像 Spring Data Reactive 这个,是不是也是利用的 subscribeOn/publishOn 进行的线程切换,让 eventLoopGroup 不阻塞,然后 IO 操作在 IO 线程完事后,又把逻辑切回到 eventLoopGroup 的。。
gz911122
   4
gz911122  
   2020 年 8 月 10 日
@qwerthhusn
Project Reactor 不清楚,
java 更多的用的是 rxjava 的 subscribeOn
bianjp
   5
bianjp  
   2020 年 8 月 12 日
的确不能在 Filter 中写阻塞的代码,前段刚踩过坑。

Filter 是在 Reactor 的事件循环线程中执行的,默认的事件循环线程数量等于 CPU 核心数: reactor.netty.resources.LoopResources#DEFAULT_IO_WORKER_COUNT

如果所有事件循环线程都被阻塞,后续的请求就只能排队等待,严重拖慢请求响应速度。

阻塞的代码可以使用另外的线程池异步执行: Mono.fromCallable(xxxx).subscribeOn(Schedulers.elastic())
© 2026 V2EX · 62ms · 3.9.8.5