公海赌船网址Worker线程就进展处理,Worker线程负责对收取到的连接请求举行处理

Netty是由JBOSS提供的一个java开源框架,本质上也是NIO,是对NIO的包裹,比NIO越发高档,效用越发强大。可以说发展的不二法门是IO->NIO->Netty。

Java Netty (1),javanetty

Netty是由JBOSS提供的一个java开源框架,本质上也是NIO,是对NIO的包装,比NIO越发高档,功用更是有力。可以说发展的门路是IO->NIO->Netty。

ServerBootstrap和ClientBootstrap是Netty中几个相比主要的类,分别用来开展服务器和客户端的伊始化。

服务器:

        // ChannelFactory
        final ChannelFactory channelFactory = new NioServerSocketChannelFactory(  
                // Boss线程池,处理Socket请求
                Executors.newCachedThreadPool(),  
                // Worker线程池,由于使用的是NIO,1个Worker线程可以管理多个Channel
                Executors.newCachedThreadPool()); 
        // ServerBootstrap
        ServerBootstrap bootstrap = new ServerBootstrap(channelFactory);

        ServerPipelineFactory serverPipelineFactory = new ServerPipelineFactory(executionHandler);
        bootstrap.setPipelineFactory(serverPipelineFactory); 

ServerBootstrap实例化时索要一个ServerSocketChannelFactory参数,ServerSocketChannelFactory可以采纳NioServerSocketChannelFactory或者OioServerSocketChannelFactory,NioServerSocketChannelFactory使用的是NIO,OioServerSocketChannelFactory使用的是无独有偶IO。两者都亟待七个线程池,一个Boss线程池,一个Worker线程池。一个Boss线程负责对一个端口的监听,接收到Socket连接请求未来交给一个Worker线程处理,然后自己继续监听。

Worker线程负责对接受到的延续请求举行处理,假如是NIO,一个Worker线程能够拍卖几个Socket或者说Channel,假设是日常IO,Worker线程和Socket或者说Channel是逐一对应的关联。

Channel有音信到达时,Worker线程就进展处理。处理的进度看似于Struts的Filter-chain。每个Channel都有一个ChannelPipeline,ChannelPipeline定义了诸多有各样的Handler,按梯次对收到到的音讯进行拍卖。

多少Handler,比如大气的IO操作,或者多量的读写数据库,会招致对音讯的处理时间过长,长时间并吞Worker线程,那时就须要另一个线程池–Netty自带的ExecutionHandler。ExecutionHandler也是一个Handler,定义在ChannelPipeline里面,它会从友好的线程池里面拿出一个线程,处理写在大团结背后的Handler,从而可以急速释放Worker线程。

ExecutionHandler的实例化:

static ExecutionHandler executionHandler = new ExecutionHandler(new OrderedMemoryAwareThreadPoolExecutor(16, 1048576, 1048576));

Excecutor有二种:MemoryAwareThreadPoolExecutor和OrderedMemoryAwareThreadPoolExecutor,前者有限支撑不会现出内存溢出荒唐,假设伊夫nt太多就会杜绝,后者除了担保不会产出内存溢出错误以外,还担保同一个Channel的伊芙nt依据顺序处理。

http://www.bkjia.com/Javabc/1209376.htmlwww.bkjia.comtruehttp://www.bkjia.com/Javabc/1209376.htmlTechArticleJava Netty (1),javanetty
Netty是由JBOSS提供的一个java开源框架,本质上也是NIO,是对NIO的包裹,比NIO越发高档,功效越来越强硬。可以说发展的路…

在上学Dubbo的时候须求上学Netty的流水线等,在此做一个粗略的入门学习。Dubbo中动用的是Netty3,所以那边说的都是Netty3。

ServerBootstrap和ClientBootstrap是Netty中三个比较根本的类,分别用来拓展服务器和客户端的伊始化。

Netty3可以作为是对Reactor的得以落成,所以先不难看下Reactor形式。

服务器:

Reactor模式

Reactor格局是基于事件驱动的,有以下两种角色存在:

  • Handle,句柄,用来表示打开的文本,打开的连天等,Java
    NIO中使用Channel来表示。
  • Synchronous 伊芙(Eve)nt
    Demultiplexer,阻塞的等候暴发在句柄上的一个或七个事件,就是监听事件的来到。Java
    NIO中应用Selector来代表。
  • 伊芙ntHandler接口,来处理分化的乞求事件。
  • Concrete Event Handler,EventHandler实现。
  • Initiation
    Dispatcher(Reactor),用来管理伊夫ntHandler;有事件来临时分发事件到伊芙(Eve)ntHandler上去处理。
        // ChannelFactory
        final ChannelFactory channelFactory = new NioServerSocketChannelFactory(  
                // Boss线程池,处理Socket请求
                Executors.newCachedThreadPool(),  
                // Worker线程池,由于使用的是NIO,1个Worker线程可以管理多个Channel
                Executors.newCachedThreadPool()); 
        // ServerBootstrap
        ServerBootstrap bootstrap = new ServerBootstrap(channelFactory);

        ServerPipelineFactory serverPipelineFactory = new ServerPipelineFactory(executionHandler);
        bootstrap.setPipelineFactory(serverPipelineFactory); 

Netty中的Reactor模式

Netty中使用了两层Reactor,Main Reactor用于拍卖连接请求,Sub
Reactor用于拍卖请求连接之后的读写请求。

ServerBootstrap实例化时索要一个ServerSocketChannelFactory参数,ServerSocketChannelFactory可以选用NioServerSocketChannelFactory或者OioServerSocketChannelFactory,NioServerSocketChannelFactory使用的是NIO,OioServerSocketChannelFactory使用的是惯常IO。两者都亟待八个线程池,一个Boss线程池,一个Worker线程池。一个Boss线程负责对一个端口的监听,接收到Socket连接请求以后交给一个Worker线程处理,然后自己继续监听。

Netty中各项释义

Worker线程负责对接受到的连天请求举行处理,假设是NIO,一个Worker线程可以处理几个Socket或者说Channel,假设是平日IO,Worker线程和Socket或者说Channel是各种对应的涉及。

Channel

Reactor格局中动用Handle来代表打开的连年,也就是事件源,在java
nio中应用Channel来抽象事件源,Netty中的Channel是友善的空洞。

Channel有音讯到达时,Worker线程就开展拍卖。处理的进度看似于Struts的Filter-chain。每个Channel都有一个ChannelPipeline,ChannelPipeline定义了众多有种种的Handler,按梯次对吸收到的音讯举办拍卖。

ChannelEvent

在Netty中利用Channel伊夫nt来抽象在事变源中可以生出的各类风浪。

稍稍Handler,比如大气的IO操作,或者大量的读写数据库,会导致对音讯的拍卖时间过长,长时间占据Worker线程,这时就须求另一个线程池–Netty自带的ExecutionHandler。ExecutionHandler也是一个Handler,定义在ChannelPipeline里面,它会从自己的线程池里面拿出一个线程,处理写在融洽背后的Handler,从而得以赶紧释放Worker线程。

ChannelHandler

功效就是Reactor方式中的伊夫(Eve)ntHandler,用来处理事件请求。有七个子接口:

  • ChannelDownstreamHandler,处理从Netty内部流向Socket的轩然大波。
  • ChannelUpstreamHandler,处理从Socket进入Netty内部的轩然大波。

ExecutionHandler的实例化:

ChannelPipeline

各类Channel都会有一个ChannelPipeline,用来管理ChannelHandler。ChannelPipeline内部有一个ChannelHandler的双向链表,以Upstream为正方向,Downstream为负方向。

static ExecutionHandler executionHandler = new ExecutionHandler(new OrderedMemoryAwareThreadPoolExecutor(16, 1048576, 1048576));

NioSelector

对应的是Reactor形式中的Synchronous 伊芙(Eve)nt Demultiplexer,Java
NIO使用Selector,每个Channel都会把温馨注册到Selector上,Selector就足以监听Channel中发出的风云。当有事件发生的时候,会生成Channel伊芙(Eve)nt实例,该事件会被发送到Channel对应的ChannelPipeline中,然后提交ChannelHandler处理。

NioSelector有两个落到实处:

  • Boss,是Main Reactor,用来拍卖新连接出席的风浪。
  • Worker,是Sub Reactor,用来处理各种连接的读写事件。

Excecutor有三种:MemoryAwareThreadPoolExecutor和OrderedMemoryAwareThreadPoolExecutor,前者保险不会冒出内存溢出错误,如若伊芙nt太多就会堵塞,后者除了确保不会产出内存溢出荒谬以外,还保障同一个Channel的伊芙(Eve)nt按照顺序处理。

ChannelSink

ChannelSink可以作为Handler最终的一个介乎末尾的万能handler,唯有DownStream包蕴ChannelSink。

服务端例子

public class NettyServerTest {

    private final int port;

    public NettyServerTest(int port){
        this.port = port;
    }

    public void startServer(){
        ChannelFactory channelFactory = new NioServerSocketChannelFactory(Executors.newCachedThreadPool(),Executors.newCachedThreadPool());
        ServerBootstrap serverBootstrap = new ServerBootstrap(channelFactory);

        serverBootstrap.setPipelineFactory(new ChannelPipelineFactory() {
            @Override
            public ChannelPipeline getPipeline() throws Exception {
                return Channels.pipeline(new ServerHandlerTest());
            }
        });

        serverBootstrap.bind(new InetSocketAddress(port));
    }

    public static void main(String[] args) {
        new NettyServerTest(8888).startServer();
    }
}

public class ServerHandlerTest extends SimpleChannelUpstreamHandler {
    @Override
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
        ChannelBuffer channelBuffer = (ChannelBuffer)e.getMessage();
        String msg = channelBuffer.toString(Charset.defaultCharset());
        if(msg != null && !"".equals(msg)){
            System.out.println("服务端接收到消息:" + msg);
            ChannelBuffer sendMsg = ChannelBuffers.dynamicBuffer();
            sendMsg.writeBytes("我是服务器,已经接到消息".getBytes());
            e.getChannel().write(sendMsg);
        }else {
            e.getChannel().write("我是服务器,收到了空消息");
        }
        e.getChannel().close();
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
        e.getCause();
        e.getChannel().close();
    }
}

ChannelFactory首如果用来发出Channel实例和ChannelSink实例。

ChannelPipelineFactory首若是用来具体传输数据的拍卖,是大家自己完结具体内容,一般大家是往里面添加Handler达成。

大致的流程是:

  • 率先应用Boss和Worker多个线程池来初始化一个ChannelFactory。
  • 运用ChannelFactory来开头化一个ServerBootstrap实例。
  • 为ServerBootstrap设置pipelineFactory,那里用来添加种种处理用的Handler。
  • 应用Bind方法绑定并监听。

Handler处理顺序

Handler跟Servlet中的Filter类似,在Netty中,Handler存在于Pipeline中,是一个链状的。

在Netty中留存三种ChannelHandler,一种是ChannelDownstreamHandler,别的一种是ChannelUpstreamHandler,从Socket流向Netty内部的数码通过ChannelUpstreamHandler处理,而从Netty内部流向Socket的多少由ChannelDownstreamHandler处理。

至于具体的辨析和源码分析,等到dubbo分析完结未来,再做。

相关文章