寻求帮助以了解 Micronaut 2 的正确模式。 默认情况下,所有 Controller 方法现在都在 NIO Eventloop 线程上运行。文档警告不要在此线程上执行任何阻塞调用,而是将其卸载到线程池(使用 @ExecuteOn 或 RxJava SubscribeOn)作为阻塞调用的示例,文档讨论了 DB 调用或 JPA 调用。
我有一个场景,我需要调用多个微服务 - 因此涉及多个 IO 调用。我通过定义接口(interface)等来使用声明式客户端。文档说,所有 HttpClient 调用都是在 NIO 事件循环上完成的。但由于这些 Http 调用是阻塞的,直到它们得到响应,我有点困惑 - 我是否需要将它们卸载到单独的 IO 池? HttpClient 使用的 NIO Eventloop 线程不会阻塞直到它执行并获得 http 响应吗?我一直在客户端界面使用常用的返回类型。然后我需要从它们返回 RxJava 类型吗?可能是我想得太多了 - 但当我们必须从 Controller 方法调用其他微服务时,我肯定对正确的模式是什么感到困惑? 任何帮助 - 感激不尽。
最佳答案
The documentation提供了声明式 http 客户端的示例。
@Client("/pets")
public interface PetClient extends PetOperations {
@Override
Single<Pet> save(String name, int age);
}
注意 save 方法的返回类型是 Single
,它是一个非阻塞 react 类型。
如果您在客户端中声明具有阻塞类型的方法,则调用将被阻塞,这不是您想要的:
@Client("/pets")
public interface PetClient extends PetOperations {
@Override
Pet save(String name, int age); //blocking call
}
你应该使用非阻塞类型;在我链接的部分的末尾,有一个与 @Client
兼容的响应类型列表。
关于micronaut - 了解 Micronaut 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63075919/