EventLoop,EventLoopGroup的区别,----学习孙哥&不良人课程,整理学习笔记文章 【https://space.bilibili.com/

131 阅读3分钟
EventLoop
1. 事件(Accept READ WRITE) 循环(死循环)
2. 曾经讲过的worker 
   1. 独立线程
   2. 通过死循环 监控 状态 进行操作 --》 run
      while(true){
         selector.select
         
         SelectionKeys 遍历
      }
   3. Selector
   
EventLoop     worker 线程 select ---> READ WRITE 
              boss   线程 select ---> Accept
              
开发中 如何过的EventLoop 
1. 不会通过构造方法 让程序员创建。
2. 通过EventLoopGroup创建
EventLoopGroup
1. 编程的过程中,开放的编程接口 EventLoopGroup
2. EventLoopGroup 创建EventLoop(一个线程) 多个EventLoop(多个线程)
                  管理EventLoop  
                  
                  EventLoopGroup EventLoop的工厂
NioEventLoop和DefaultEventLoop区别
1. NioEventLoop 是一个线程  IO Write Read 事件监控
2. DefaultEventLooop 就是一个普通的线程,内容工作可以由程序员决定,他不做 IO监控 读写的处理.
​
注意:后续再Netty进行多线程开发,推荐大家优先考虑DefaultEventLoop -->普通线程。
注意:
1. EventLoop是会绑定channel,EventLoop可以支持多个channel访问的。
2. 服务端 进行EventLoop的分工 --->  主从Reactor模式(NIO,Netty...)
3. DefaultEventLoop,辅助NIOEventLoop完成 普通业务操作。
异步

如果没有 阻塞,就会出现 还没有连接就 发送信息(发不出去)

图片.png

1. 多线程编程
异步  和  多线程  之间有什么关系?区别?
​
首先:
1. 异步也是多线程编程..
2. 异步的编程和多线程编程在应用过程中也有区别。
    传统多线程   三个客户端 连接一个服务器   三个客户端是一个平等的关系
    异步  :   一个主线程   中途委托一个线程去做一个任务  ,主线程接着往下执行
            副线程辅助多线程完成工作
            处理过程中:异步 阻塞主线程 完成异步操作
处理过程中 
1. 阻塞 主线程 完成异步操作的配合。
   future.sync();  //阻止当前线程,等待上一步 连接真正建立->运行后的功能
2. 异步处理 (新线程 异步线程完成的)
    future.addListener(new ChannelFutureListener() {
      @Override
      public void operationComplete(ChannelFuture future) throws Exception {
      log1.debug(" add Listerner .....");
      Channel channel = future.channel();
      channel.writeAndFlush("hello suns");
    }
    });
    
只要是异步的操作 只能通过上述的2种方式的一种处理。
在Netty只要涉及到 网络 IO的相关操作 那么Netty都会涉及异步处理。
​
.connect() netty 异步   
.writeAndFlush   异步
.close()         异步 
涉及异步操作,如果后续要使用的话就  要sync
​
Netty为什么 要把 网络 IO的相关操作 做成异步?
异步的好处?
1.提高系统的吞吐量。。。
2.效率上的提高 绝不是 1+1=2
                   1+1 = 1.5

图片.png

引入异步:让 Worker可以服务更多客户端 ,提高效率,提高吞吐量

Netty中异步设计 (内部原理)
JDK   Future
Netty Future
Netty Promise  (用的最多)

图片.png

Channel
1. JDK ServerSocketChannel  SocketChannel
2. Netty原有JDK中channel进行 统一的封装。
   1. 统一channel的编程模型,通过他的封装 不在让客户区分SocketChannel ServerSocketChannel
   2. Netty 一旦封装了Channel,更好的和Netty框架结合起来。 I/0  pipeline ,配置 Channel TCP Socket缓冲区 滑动窗口的大小。。 
1. Netty封装Channel 提供哪些API (方法)
   channel.writeAndFlush("xiaohei"); 
          .write
          
   writeAndFlush 写出数据后 刷新缓冲区 ---》 写出去了
   write不会立即发出去的,存在缓冲区中,手工.flush.
   
   .close() 顾名思义 作用 channel.close() ---> Socket 
    ChannelFuture close = channel.close();//异步化操作 启动一个新的线程
         //其他资源的释放,其他事,close()方法执行完之后,运行后面这些代码
        //main主线程完成
        //close.sync();
​
    close.addListener(new ChannelFutureListener() {
      @Override
      public void operationComplete(ChannelFuture future) throws Exception {
      log.debug("channel.close()执行完后,操作后续的一些工作...");//不行
      }
    });
    
    eventLoopGroup.shutdownGracefully();
​
2. 如何封装的Channel(源码)