认识Netty过程

这是我参与更文挑战的第1天,活动详情查看: 更文挑战

什么是Netty?

Netty是JBOSS提供的Java开源的网络应用框架,是异步基于事件驱动,用于开发高性能高可靠性的网络IO程序。

思考介绍中的关键词:

  1. 什么是异步?

  2. 什么是基于事件驱动?

  3. 怎么实现高性能和高可靠性?

为什么需要Netty?

  1. 分布式系统中,各个节点之间需要远程调用,高性能的RPC框架必不可少,netty作为异步高性能的通信框架,作为基础通信组件被使用。
  2. NIO类库和API复杂使用麻烦,很难编写出高质量的NIO程序,开发工作量和难度都很大,比如客户端面临断连重连,网络闪断等,还有出现NIO的EpollBug,导致Selector空轮询,导致CPU100%。而Netty可以快速简单的开发出一个网络应用。

使用场景有哪些?

  1. Elasticsearch,Dubbo框架内部实现,
  2. 游戏行业,大数据行业。

IO模型

要想了解netty,需要先了解网络IO模型,用什么样的通道进行数据的发送和接收,很大程度上决定了程序的通信性能。接下来逐步分析BIO,NIO。提前需要了解的知识点:1 同步与异步 2 阻塞与非阻塞 。

什么是BIO模型?

  1. 同步阻塞,服务器实现模式为一个连接一个线程,会造成线程不必要的浪费;
  2. cmd命令执行Telnet 127.0.0.1 6666 可以连接到代码服务端,每起一个客户端连接就会创建一个线程,客户端连接后阻塞在read上;并发数较大时,需要创建大量线程来处理现象,占用系统资源。如下代码验证


    public static void main(String[] args) throws IOException {
        ExecutorService executorService = Executors.newCachedThreadPool();
        ServerSocket serverSocket = new ServerSocket(6666);
        System.out.println("服务器启动");
        while (true){
            //等待客户端连接
            Socket accept = serverSocket.accept();
            System.out.println("有客户端连接");
            executorService.submit(new Runnable() {
                @Override
                public void run() {
                    handler(accept);
                }
            });
        }


    }

    public static void handler(Socket socket){
        System.out.println("等待客户端操作+"+ Thread.currentThread().getName());
        byte[] bytes = new byte[1024];
        try {
            InputStream inputStream = socket.getInputStream();
            //循环读取客户端发送数据
            while (true){
                System.out.println("客户端连接后,阻塞在这里,一直等待客户端发送");
                int read = inputStream.read(bytes);
                if (read != -1){
                    //字节转字符串
                    System.out.println(new String(bytes,0,read).toString());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {

            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
复制代码

3 画图理解

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享