网络编程Netty入门:Netty简介及其特性
Netty的简介
Netty是一个java开源框架,是基于NIO的高性能、高可扩展性的异步事件驱动的网络应用框架,简化了TCP、UDP服务器和客户端的网络编程。
很多开源的项目,底层都使用了Netty,例如Dubbo、Elasticsearch、Facebook等,其他的支持者,请进入https://netty.io/wiki/adopters.html查看。
Netty的特性
设计层面:
- 提供了统一的API,支持多种传输类型,阻塞的和非阻塞的
- 简单、强大的线程模型
- 基于灵活且可扩展的事件模型,可以清晰地分离关注点
- 真正的无连接数据报套接字支持
使用层面:
- 有非常完善的javadoc文档和丰富的实例代码作为参考
- 不需要其他的依赖,JDK5(Netty3.0)或者JDK6(Netty4.0)就足够了
性能层面:
- 拥有比JAVA的核心API更高的吞吐量和更低的延迟
- 拥有更低的资源消耗
- 最小化不必要的内存复制
安全层面:
- 完整的SSL/TLS和StartTLS支持
社区层面:
- 社区发布快速而且比较频繁,不用担心出现问题,无从解决
Netty的整体结构
1:支持Socket、HTTP等多种传输方式
2:提供了多种协议的编码、解码实现
3:核心部分:事件处理模型、API、BUffer的增强
Netty的核心组件
1:Channel,Netty自己定义了Channel,对其进行了增强
2:EventLoop,由线程驱动的,处理Channel的I/O事件
3:ChannelPipeline,事件处理机制,也叫做职责链
4:ChannelHandler,事件处理器
5:ByteBuf,增强版的缓冲区
6:BootStrap,启动器
Netty的线程模型
//老板线程组
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
//员工线程组
EventLoopGroup workerGroup = new NioEventLoopGroup();
final EchoServerHandler serverHandler = new EchoServerHandler();
try {
ServerBootstrap b = new ServerBootstrap();
//配置启动器
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 100)
.handler(new LoggingHandler(LogLevel.INFO))
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline p = ch.pipeline();
if (sslCtx != null) {
p.addLast(sslCtx.newHandler(ch.alloc()));
}
//p.addLast(new LoggingHandler(LogLevel.INFO));
p.addLast(serverHandler);
}
});
//启动启动器
ChannelFuture f = b.bind(PORT).sync();
//关闭服务
f.channel().closeFuture().sync();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
1:bossGroup就是一个线程,接收客户端连接,然后注册到workerGroup,分配给workerGroup中的线程
2:workerGroup主要是用来处理客户端连接的I/O操作的,里面有多个线程,线程的数量一般默认为CPU核心数*2,每个线程都有一个Selector用来监听客户端事件的发生,Selector会轮询的去看有没有事件
3:workerGroup中每个线程里,都有一个queue队列,当Selector轮询中没有事件,也就是当该线程空闲的时候,会去处理queue中的任务
结束语
本篇内容主要是介绍Netty的一些知识,下一篇会写下EventLoopGroup和Channel相关的东西