java 在使用Reactor Netty的Spring5的Web客户端中,“传输”的真正含义是什么

lx0bsm1f  于 2023-01-04  发布在  Java
关注(0)|答案(1)|浏览(135)

我使用Spring 5 Webclient和Reactor netty来发出HTTP API POST请求,代码如下所示:

HttpClient httpClient = HttpClient.create()
                .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)
                .option(ChannelOption.SO_KEEPALIVE, true)
                .option(EpollChannelOption.TCP_KEEPIDLE, 300)
                .option(EpollChannelOption.TCP_KEEPINTVL, 60)
                .option(EpollChannelOption.TCP_KEEPCNT, 8)
                .doOnConnected(
                        connection ->
                                connection
                                        .addHandler(
                                                new ReadTimeoutHandler(1000,
                                                        TimeUnit.SECONDS))
                                        .addHandler(
                                                new WriteTimeoutHandler(1000)));

WebClient.builder()
                .baseUrl("//some url")
                .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                .defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
                .clientConnector(new ReactorClientHttpConnector(httpClient))
                .build();

我试图设置TCP配置,如TCP_KEEPIDLE, TCP_KEEPINTERVAL等,因此在项目React器文档中阅读到了相同的内容。
文件说(我在总结):

//The options below are available only when NIO transport (Java 11) is used
    .option(NioChannelOption.of(ExtendedSocketOptions.TCP_KEEPIDLE), 300)
    .option(NioChannelOption.of(ExtendedSocketOptions.TCP_KEEPINTERVAL), 60)
    .option(NioChannelOption.of(ExtendedSocketOptions.TCP_KEEPCOUNT), 8);

//The options below are available only when Epoll transport is used
    .option(EpollChannelOption.TCP_KEEPIDLE, 300)        
    .option(EpollChannelOption.TCP_KEEPINTVL, 60)        
    .option(EpollChannelOption.TCP_KEEPCNT, 8);

我不明白NIOEpoll****transport之间的区别,或者更具体地说,transport到底是什么?我知道OSI堆栈的传输层和其他层,但不明白这里使用的传输层是什么。如果能解释一下,我将不胜感激。

fd3cxomn

fd3cxomn1#

传输术语来自Netty。您可以在Manning Live book: Netty in Action中找到关于它的解释
流经网络的数据始终具有相同的类型:这些字节如何移动主要取决于我们所说的网络传输,这个概念帮助我们抽象出数据传输的底层机制,用户不关心细节;他们只想确定他们的字节被可靠地发送和接收。
如果您有使用Java进行网络编程的经验,您可能会在某个时候发现您需要支持的并发连接比预期的要多得多。如果您随后尝试从阻塞传输切换到非阻塞传输,则可能会遇到问题,因为这两个网络API非常不同。
然而,Netty在它的所有传输实现上都有一个通用的API,这使得这种转换比直接使用JDK要简单得多。生成的代码不会受到实现细节的影响,也不需要对整个代码库进行大量的重构。简而言之,你可以把时间花在做一些有成效的事情上。
为了回答您的问题,在Netty中,您可以在一个公共API下使用不同的传输实现,该API或多或少地对应于OSI模型的传输层。

相关问题