V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qwerthhusn
V2EX  ›  Java

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

  •  
  •   qwerthhusn · 2020-08-07 16:41:31 +08:00 · 2429 次点击
    这是一个创建于 1570 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    5 条回复    2020-08-12 19:46:47 +08:00
    shaoyijiong
        1
    shaoyijiong  
       2020-08-07 17:23:37 +08:00
    spring data redis 底层用的是 Lettuce 支持非阻塞调用 , 可以使用 ReactiveRedisTemplate
    接口的话可以使用 WebClient , 或者 https://github.com/OpenFeign/feign-reactive/issues/20
    gz911122
        2
    gz911122  
       2020-08-07 17:53:56 +08:00
    Feign 可以换用 retrofit 支持异步调用.
    反正 Feign 本身就是模仿 retrofit 写的, 俩 api 差不多
    qwerthhusn
        3
    qwerthhusn  
    OP
       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
        4
    gz911122  
       2020-08-10 11:18:50 +08:00
    @qwerthhusn
    Project Reactor 不清楚,
    java 更多的用的是 rxjava 的 subscribeOn
    bianjp
        5
    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())
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2508 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 15:43 · PVG 23:43 · LAX 07:43 · JFK 10:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.