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

2020-08-07 16:41:31 +08:00
 qwerthhusn

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

2426 次点击
所在节点    Java
5 条回复
shaoyijiong
2020-08-07 17:23:37 +08:00
spring data redis 底层用的是 Lettuce 支持非阻塞调用 , 可以使用 ReactiveRedisTemplate
接口的话可以使用 WebClient , 或者 https://github.com/OpenFeign/feign-reactive/issues/20
gz911122
2020-08-07 17:53:56 +08:00
Feign 可以换用 retrofit 支持异步调用.
反正 Feign 本身就是模仿 retrofit 写的, 俩 api 差不多
qwerthhusn
2020-08-08 10:24:35 +08:00
@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
2020-08-10 11:18:50 +08:00
@qwerthhusn
Project Reactor 不清楚,
java 更多的用的是 rxjava 的 subscribeOn
bianjp
2020-08-12 19:46:47 +08:00
的确不能在 Filter 中写阻塞的代码,前段刚踩过坑。

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

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/696511

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX