在网络通信中,编码器(Encoder)和解码器(Decoder)在 Netty 中扮演着重要的角色。它们主要用于将消息对象在网络传输过程中进行编码和解码,以便在不同节点之间进行有效的数据交换。
①编码器:将应用程序中的数据或消息对象转化为字节流,以便在网络上传输。它将高级的消息对象转换为底层的字节序列,通常使用协议规定的格式进行编码。编码器负责将数据按照特定的格式打包成字节流,以便发送给远程节点。
- RpcEncoder:自定义编码器
②解码器:它的作用和编码器正好相反,它将接收到的字节流解析为应用程序可理解的消息对象。解码器会根据协议规定的格式,从接收到的字节流中解析出有效的数据,并将其转化为高级的消息对象,以便应用程序能够方便地处理和使用这些数据。
- RpcDecoder:自定义解码器
在 Netty 中进行通信时,需要封装请求结果和进行请求结果缓存的原因与 Netty 异步通信的特性有关。Netty 是一个基于 NIO 的网络通信框架,它采用异步事件驱动的方式处理网络操作。这意味着在 Netty 中,网络请求和响应的处理是非阻塞的,请求和响应之间的关系是不同步的,因此需要对结果进行封装和缓存。
①.请求结果- WriteFuture:请求结果接口定义
- SyncWriteFuture:请求结果接口实现
public class SyncWriteFuture implements WriteFuture<Response>{
private CountDownLatch latch = new CountDownLatch(1);
private final long begin = System.currentTimeMillis();
private final String requestId;
private Boolean writeResult;
private Response response;
private boolean isTimeout = false;
private long timeout;
private Throwable cause;
public SyncWriteFuture(String requestId) {
this.requestId = requestId;
}
@Override
public Throwable cause() {
return this.cause;
}
@Override
public void setCause(Throwable cause) {
this.cause = cause;
}
@Override
public boolean isWriteSuccess() {
return writeResult;
}
@Override
public void setWriteResult(boolean result) {
this.writeResult = writeResult;
}
@Override
public String requestId() {
return this.requestId;
}
@Override
public Response response() {
return this.response;
}
@Override
public void setResponse(Response response) {
this.response = response;
latch.countDown();
}
@Override
public boolean isTimeout() {
if (isTimeout) {
return isTimeout;
}
return System.currentTimeMillis() - begin > timeout;
}
@Override
public boolean cancel(boolean mayInterruptIfRunning) {
return true;
}
@Override
public boolean isCancelled() {
return false;
}
@Override
public boolean isDone() {
return false;
}
@Override
public Response get() throws InterruptedException, ExecutionException {
latch.wait();
return this.response;
}
@Override
public Response get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
if (latch.await(timeout, unit)) {
return response;
}
return null;
}
}
说明,这边获取结果,使用 CountDownLatch 进行阻塞等待,当Netty 接受到事件,通过 setResponse 方法使CountDownLatch 取消等待,这样就可以同步等待获取请求结果;同时也支持超时等待机制,可以设置等待超时时间。
②.请求结果缓存由于Netty中网络请求和响应的处理是非阻塞的,因此我们需要将请求结果缓存起来,当Netty异步响应时,可以从缓存中获取请求结果,并将异步获取的返回信息设置到请求结果对象中。
- SyncWriteCache:请求结果缓存