故此先轻易看下Reactor情势,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的Event依据顺序管理。

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 伊芙nt
    德姆ultiplexer,阻塞的等候爆发在句柄上的多个或七个事件,正是监听事件的赶到。Java
    NIO中运用Selector来表示。
  • 伊芙ntHandler接口,来管理分化的伸手事件。
  • Concrete Event Handler,EventHandler实现。
  • Initiation
    Dispatcher(Reactor),用来处理EventHandler;有事件来有时分发事件到EventHandler上去管理。
        // 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中动用ChannelEvent来抽象在事变源中能够生出的各个风波。

有个别Handler,举例大气的IO操作,大概大量的读写数据库,会促成对音信的拍卖时间过长,短时间占用Worker线程,那时就要求另二个线程池–Netty自带的ExecutionHandler。ExecutionHandler也是一个Handler,定义在ChannelPipeline里面,它会从本身的线程池里面拿出三个线程,管理写在温馨前面包车型大巴Handler,进而得以尽快释放Worker线程。

ChannelHandler

职能正是Reactor格局中的EventHandler,用来处总管件乞求。有多少个子接口:

  • 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 Event 德姆ultiplexer,Java
NIO使用Selector,每一个Channel都会把温馨注册到Selector上,Selector就可以监听Channel中爆发的事件。当有事件产生的时候,会生成ChannelEvent实例,该事件会被发送到Channel对应的ChannelPipeline中,然后交由ChannelHandler管理。

NioSelector有四个落到实处:

  • Boss,是Main Reactor,用来管理新连接加入的事件。
  • Worker,是Sub Reactor,用来管理各种连接的读写事件。

Excecutor有二种:MemoryAwareThreadPoolExecutor和OrderedMemoryAwareThreadPoolExecutor,前者保险不会出现内部存款和储蓄器溢出荒谬,即使伊夫nt太多就能够堵塞,前面一个除了确认保障不会冒出内部存款和储蓄器溢出荒唐以外,还担保同壹个Channel的Event依据顺序处理。

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分析完结未来,再做。

相关文章