狐言不胡言

导航

网络编程Netty入门:Netty简介及其特性

Netty的简介

Netty是一个java开源框架,是基于NIO的高性能、高可扩展性的异步事件驱动的网络应用框架,简化了TCP、UDP服务器和客户端的网络编程。
很多开源的项目,底层都使用了Netty,例如Dubbo、Elasticsearch、Facebook等,其他的支持者,请进入https://netty.io/wiki/adopters.html查看。

Netty的特性

设计层面:

  1. 提供了统一的API,支持多种传输类型,阻塞的和非阻塞的
  2. 简单、强大的线程模型
  3. 基于灵活且可扩展的事件模型,可以清晰地分离关注点
  4. 真正的无连接数据报套接字支持

使用层面:

  1. 有非常完善的javadoc文档和丰富的实例代码作为参考
  2. 不需要其他的依赖,JDK5(Netty3.0)或者JDK6(Netty4.0)就足够了

性能层面:

  1. 拥有比JAVA的核心API更高的吞吐量和更低的延迟
  2. 拥有更低的资源消耗
  3. 最小化不必要的内存复制

安全层面:

  1. 完整的SSL/TLS和StartTLS支持

社区层面:

  1. 社区发布快速而且比较频繁,不用担心出现问题,无从解决

Netty的整体结构

图片来自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相关的东西

posted on 2021-04-17 09:48  狐言不胡言  阅读(224)  评论(0编辑  收藏  举报