Reactor Netty参考指南目录
原文地址
Reactor Netty提供了易于使用、易于配置的TcpClient
。它隐藏了创建TCP
客户端所需的大部分Netty
的功能,并增加了Reactive Streams
背压。
4.1.连接和断开
要将TCP
客户端连接到给定的端点,您必须创建并且配置一个TcpClient
实例。默认情况下,host
为localhost
,post
为12012
。下面是创建一个TcpClient
的例子:
https://github.com/reactor/reactor-netty/blob/master/reactor-netty-examples/src/main/java/reactor/netty/examples/documentation/tcp/client/create/Application.java
import reactor.netty.Connection; import reactor.netty.tcp.TcpClient; public class Application { public static void main(String[] args) { Connection connection = TcpClient.create() //<1> .connectNow(); //<2> connection.onDispose() .block(); } }
<1> 创建一个
TcpClient
实例用来进行的配置操作。<2> 用阻塞的方式进行连接操作,并且等待它初始化完成。
返回的Connection
对象提供了简单的连接相关的API,包括disposeNow()
,调用这个方法会以阻塞的方式关闭客户端。
4.1.1.Host和Port
想要连接特定的host
和port
,您可以使用以下方式来配置TCP
客户端。示例如下:
https://github.com/reactor/reactor-netty/blob/master/reactor-netty-examples/src/main/java/reactor/netty/examples/documentation/tcp/client/address/Application.java
import reactor.netty.Connection; import reactor.netty.tcp.TcpClient; public class Application { public static void main(String[] args) { Connection connection = TcpClient.create() .host("example.com") //<1> .port(80) //<2> .connectNow(); connection.onDispose() .block(); } }
<1> 配置
TCP
的host<2> 配置
TCP
的port
4.2.预先初始化
默认情况下,TcpClient
初始化资源的操作在需要使用的时候才进行。这意味着初始化加载的时候connect operation
会占用额外的时间:
-
事件循环组
-
主机名解析器
-
native传输库(当使用了native传输的时候)
-
用于安全性的native库(使用了
OpenSsl
的时候)
当您需要预加载这些资源的时候,您可以按照以下方式来配置TcpClient
:
https://github.com/reactor/reactor-netty/blob/master/reactor-netty-examples/src/main/java/reactor/netty/examples/documentation/tcp/client/warmup/Application.java
import reactor.core.publisher.Mono; import reactor.netty.Connection; import reactor.netty.tcp.TcpClient; public class Application { public static void main(String[] args) { TcpClient tcpClient = TcpClient.create() .host("example.com") .port(80) .handle((inbound, outbound) -> outbound.sendString(Mono.just("hello"))); tcpClient.warmup() //<1> .block(); Connection connection = tcpClient.connectNow(); //<2> connection.onDispose() .block(); } }
<1> 初始化和加载事件循环组,主机名解析器,native传输库和用于安全性的native库
<2> 在连接远程节点的时候会进行主机名解析
4.3.写出数据
如果要发送数据到一个已有的端点,您必须添加一个I/O处理器。这个I/O处理器可以通过NettyOutbound
来写出数据。
https://github.com/reactor/reactor-netty/blob/master/reactor-netty-examples/src/main/java/reactor/netty/examples/documentation/tcp/client/send/Application.java
import reactor.core.publisher.Mono; import reactor.netty.Connection; import reactor.netty.tcp.TcpClient; public class Application { public static void main(String[] args) { Connection connection = TcpClient.create() .host("example.com") .port(80) .handle((inbound, outbound) -> outbound.sendString(Mono.just("hello"))) //<1> .connectNow(); connection.onDispose() .block(); } }
<1> 发送
hello
字符串给这个端点。
4.4.消费数据
如果要接收从已有端点发过来的数据,您必须添加一个I/O处理器。这个I/O处理器可以通过NettyInbound
来读取数据。示例如下:
https://github.com/reactor/reactor-netty/blob/master/reactor-netty-examples/src/main/java/reactor/netty/examples/documentation/tcp/client/read/Application.java
import reactor.netty.Connection; import reactor.netty.tcp.TcpClient; public class Application { public static void main(String[] args) { Connection connection = TcpClient.create() .host("example.com") .port(80) .handle((inbound, outbound) -> inbound.receive().then()) //<1> .connectNow(); connection.onDispose() .block(); } }
<1> 接收从已有端点发送过来的数据
4.5.生命周期回调
下面的生命周期回调用参数是提供给您用来扩展TcpClient
的:
Callback | Description |
---|---|
doAfterResolve |
在成功解析远程地址之后调用。 |
doOnChannelInit |
在初始化channel的时候调用。 |
doOnConnect |
当channel将要连接的时候调用。 |
doOnConnected |
当channel已经连接上的时候调用。 |
doOnDisconnected |
当channel断开的时候被调用。 |
doOnResolve |
当远程地址将要被解析的时候被调用。 |
doOnResolveError |
在远程地址解析失败的情况下被调用。 |
下面是使用doOnConnected
和doOnChannelInit
回调的例子&