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