Netty3服务端流程简介

在学习Dubbo的时候需要学习Netty的流程等,在此做一个简单的入门学习。Dubbo中使用的是Netty3,所以这里说的都是Netty3。

Netty3可以看成是对Reactor的实现,所以先简单看下Reactor模式。

Reactor模式

Reactor模式是基于事件驱动的,有以下几种角色存在:

  • Handle,句柄,用来表示打开的文件,打开的连接等,Java NIO中使用Channel来表示。
  • Synchronous Event Demultiplexer,阻塞的等待发生在句柄上的一个或多个事件,就是监听事件的到来。Java NIO中使用Selector来表示。
  • EventHandler接口,来处理不同的请求事件。
  • Concrete Event Handler,EventHandler实现。
  • Initiation Dispatcher(Reactor),用来管理EventHandler;有事件到来时分发事件到EventHandler上去处理。

Netty中的Reactor模式

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

Netty中各类释义

Channel

Reactor模式中使用Handle来表示打开的连接,也就是事件源,在java nio中使用Channel来抽象事件源,Netty中的Channel是自己的抽象。

ChannelEvent

在Netty中使用ChannelEvent来抽象在事件源中可以产生的各种事件。

ChannelHandler

作用就是Reactor模式中的EventHandler,用来处理事件请求。有两个子接口:

  • ChannelDownstreamHandler,处理从Netty内部流向Socket的事件。
  • ChannelUpstreamHandler,处理从Socket进入Netty内部的事件。

ChannelPipeline

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

NioSelector

对应的是Reactor模式中的Synchronous Event Demultiplexer,Java NIO使用Selector,每个Channel都会把自己注册到Selector上,Selector就可以监听Channel中发生的事件。当有事件发生的时候,会生成ChannelEvent实例,该事件会被发送到Channel对应的ChannelPipeline中,然后交给ChannelHandler处理。

NioSelector有两个实现:

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

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分析完成之后,再做。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • 本文是Netty文集中“Netty 源码解析”系列的文章。主要对Netty的重要流程以及类进行源码解析,以使得我们...
    tomas家的小拨浪鼓阅读 2,445评论 2 8
  • 原文出处http://cmsblogs.com/ 『chenssy』转载请注明原创出处,谢谢! 上篇博客(【死磕N...
    chenssy阅读 2,267评论 0 6
  • 前奏 https://tech.meituan.com/2016/11/04/nio.html 综述 netty通...
    jiangmo阅读 5,782评论 0 13
  • 一心走路 生存的真理是经由深刻地觉知显现出来的,而深刻的觉知则来自一心正念的生活,来自无论做任何事情都要时刻保持的...
    安吉雅子阅读 130评论 0 0
  • 生活总是充满戏剧性。不管你愿意还是不愿意,生活总在不断的发生变化,确切的说是人在发生变化,人要不断的适应这一切,就...
    修罗的修行阅读 195评论 0 0