# Part-1 Netty concepts and architecture
[[toc]]
## Netty—asynchronous and event-driven
```txt
New or non-blocking?
NIO 最初是 New InputOutput 的首字母缩写词,但 Java API 已经存在了足够长的时间,它不再是新的了。大多数用户现在认为 NIO 表示非阻塞 IO,而阻塞 IO 是 OIO 或旧的输入输出。您可能还会遇到对普通 IO 的引用
```
## Netty core components
### Channels
```txt
目前,将 Channel 视为传入(入站)和传出(出站)数据的载体。因此,它可以打开或关闭,连接
或断开连接。
```
### Callbacks
```txt
回调只是一个方法,对它的引用已提供给另一个方法。这使得后者能够在适当的时候调用前者。
```
```java{3,4}
public class ConnectHandler extends ChannelInboundHandlerAdapter {
@Override
//channelActive(ChannelHandlerContext) is called when
//a new connection is established.
public void channelActive(ChannelHandlerContext ctx)throws Exception {
System.out.println(
"Client " + ctx.channel().remoteAddress() + " connected");
}
}
}
```
### Futures
```txt
Future 提供了另一种在操作完成时通知应用程序的方法。该对象充当异步操作结果的占位符;
```
```java{5,6}
Channel channel = ...;
// Does not block
ChannelFuture future=channel.connect(
new InetSocketAddress("192.168.0.1",25));
//Registers a ChannelFutureListener to be notified
//once the operation completes
future.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) {
if (future.isSuccess()){
ByteBuf buffer = Unpooled.copiedBuffer(
"Hello",Charset.defaultCharset());
ChannelFuture wf = future.channel()
.writeAndFlush(buffer);
....
} else {
Throwable cause = future.cause();
cause.printStackTrace();
}
}
});
```
```txt
如果您认为 ChannelFutureListener 是回调的更精细版本,那么您是对的。实际上,回调和 Futures 是相辅相成的机制;它们结合起来构成了 Netty 本身的关键构建块之一。
```
### Events and handlers
```txt
Netty 是一个网络框架,因此事件根据它们与入站或出站数据流的相关性进行分类。可能由入站数据或
相关状态更改触发的事件包括
1. 活动或非活动连接
2. 数据读取
3. 用户事件
4. 错误事件
一个出站事件是一个操作的结果,它将在未来触发一个动作,它可能是
1. 打开或关闭与远程对等点的连接
2. 将数据写入或刷新到套接字
```
```txt
每个事件都可以分派给处理程序类的用户实现方法。这是将事件驱动范例直接转换为应用程序构建块的一
个很好的例子。图 1.3 显示了一个事件如何被这样的事件处理程序链处理。
```

### Putting it all together
让我们汇集我们所讨论内容的全局视图。
#### FUTURES, CALLBACKS, AND HANDLERS
```txt
Netty 的异步编程模型建立在 Futures 和回调的概念之上,将事件分派到更深层次的处理程序方法。
综合起来,这些元素提供了一个处理环境,允许您的应用程序逻辑独立于网络操作的任何关注而发展。
这是 Netty 设计方法的一个关键目标。即时拦截操作和转换入站或出站数据只需要您提供回调或使用
操作返回的futures。这使得链接操作变得简单高效,并促进了可重用的通用代码的编写
```
#### SELECTORS, EVENTS, AND EVENT LOOPS
```txt
Netty 通过触发事件将 Selector 从应用程序中抽象出来,消除了否则需要的所有手写调度代码。在
幕后,一个 EventLoop 被分配给每个 Channel 以处理所有事件,包括
1. 有趣事件的注册
2. 将事件分派给 ChannelHandlers
3. 计划进一步的action
EventLoop 本身仅由一个线程驱动,该线程处理一个 Channel 的所有 IO 事件,并且在 EventLoop
的生命周期内不会发生变化。这种简单而强大的设计消除了您对 ChannelHandler 中同步的任何担忧,
因此您可以专注于提供正确的逻辑,以便在有有趣的数据要处理时执行。正如我们将在详细探索 Netty
的线程模型时看到的那样,API 简单紧凑。
```
评论