1,介绍一下netty

 netty封装了Java原生的nio,是一个异步和数据驱动的网络编程框架,

 与tcp:

  1. netty -> Java Runtime Socket (io、nio、nio2) -> OS Socket -> TCP (当然也可以是UDP、SCTP);
  2. 既然连操作系统层的Socket都必须做三次握手(仅对TCP而言),Netty当然无法跳过,只不过它对用户屏蔽了三次握手(当然还有四次挥手)的部分细节。

 异步:read和write方法均是异步方法,用户进程发起一个IO操作然后,立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知(回到函数,channelactive和channelRead

 bio:在bio是阻塞的通信模式。一个用户连接占用一条线程,服务器通过一个Acceptor线程负责监听客户端请求和为每个客户端创建一个新的线程进行链路处理。典型的一请求一应答模式。当连接没有数据,也会阻塞在那里不释放cpu,若客户端数量增多,频繁地创建和销毁线程会给服务器打开很大的压力。(内存(每条线程栈上的基本数据类型,对象引用,方法栈,程序计数器)和cpu上下文切换(cpu寄存器需要把线程重新装入

 nio:netty使用的是封装Java的nio模型,Java API 这是一个繁琐和不容易保证的用法,所以我们一般都使用netty完成nio模型的编程,在netty的多路复用nio模型,工作模式是一个工作线程对应多条连接,用一个轮询器selector不断轮询连接,若连接上有io事件,则可以获得io线程的资源,当连接没有了io请求,线程不用被阻塞,selector会轮询到其他有io请求的连接,这样线程可以被重定向到其他任务上。

 启动过程:服务端监听线程和IO线程分离,创建服务端的时候实例化了2个EventLoopGroup,bossGroup和workGroup,1个EventLoopGroup实际就是一个EventLoop线程组,

  bossGroup线程组实际就是Acceptor线程池,负责处理客户端的TCP连接请求,如果系统只有一个服务端端口需要监听,则建议bossGroup线程组线程数设置为1。服务端Channel创建完成之后,bossGroup将会把channel绑定在一个可用的event loop上(没有的时候创建),相当于注册到eventloop的多路复用器Selector上,用于接收客户端的TCP连接,关系是1:1:1

  如果监听到客户端连接,则创建客户端SocketChannel连接,重新注册到workerGroup的IO线程上。EventLoopGroup从中选择一个I/O线程负责网络消息的读写。选择IO线程之后,将SocketChannel注册到多路复用器上,监听后面的io操作。一个workgroup最多

开cpu数量*2的线程,workgroup:selector:连接 = 1 : n :m

  线程安全:Netty采用了串行化设计理念,从消息的读取、编码以及后续Handler的执行,始终都由IO线程NioEventLoop负责,也就是一个客户端连接始终绑定在他一开始注册的NioEvenLoop,这就意味着整个流程不会进行线程上下文的切换,客户端连接不会在两个两个io线程切换,造成可见性问题(工作线程到主内存拷贝的时候有可见性问题,可以引出jmm),所以数据也不会面临被并发修改的风险

  

  

  复杂和时间不可控业务:在添加 pipeline 中的 handler 时候,添加一个线程池, handler 中的代码不用做任何修改,当selector轮询到它的时候,从上下文中发现有线程池,就用线程池执行耗时任务,不占用当前线程,当耗时任务执行完毕再执行 write 方法的时候,会将任务的结果写入outbound 等待轮询

  channel相关:

  • 每个Channel会绑定一个ChannelPipeline,每个ChannelPipeline会持有一个Channel
  • 每个ChannelHandler对应一个ChannelHandlerContext,ChannelPipeline持有ChannelHandlerContext链表,也就相当于持有ChannelHandler链表
  • ChannelHandlerContext作为上下文,持有ChannelPipeline和它对应ChannelHandler的引用,持有ChannelPipeline相当于间接持有Channel,同时持有它上/下一个ChannelHandlerContext的引用
  • inbound按照顺序,outbound逆序,inbound事件------channel注册事件,读事件,outbound事件-----bind事件write事件
    SimpleChannelInbouundHandler<Object>比channelInboundHandlerAdapter多了添加泛型和自动清空缓冲区

参考

io模型最明白:https://my.oschina.net/zhangph89/blog/967490

比较全面:http://www.infoq.com/cn/articles/netty-threading-model

netty答题的更多相关文章

  1. hbase之createTable完整的netty实现执行流程

    hbase的客户端代码并不想hive一样用java编写,shell调用,而是使用ruby编写. 在admin.rb文件中方法create,其中接受两个参数,其中第二个参数类型为变长参数. 而在crea ...

  2. Netty 学习笔记(1)通信原理

    前言 本文主要从 select 和 epoll 系统调用入手,来打开 Netty 的大门,从认识 Netty 的基础原理 —— I/O 多路复用模型开始.   Netty 的通信原理 Netty 底层 ...

  3. 谈谈如何使用Netty开发实现高性能的RPC服务器

    RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络,从远程计算机程序上请求服务,而不必了解底层网络技术的协议.说的再直白一点,就是客户端在不必知道 ...

  4. 基于netty http协议栈的轻量级流程控制组件的实现

    今儿个是冬至,所谓“冬大过年”,公司也应景五点钟就放大伙儿回家吃饺子喝羊肉汤了,而我本着极高的职业素养依然坚持留在公司(实则因为没饺子吃没羊肉汤喝,只能呆公司吃食堂……).趁着这一个多小时的时间,想跟 ...

  5. 从netty-example分析Netty组件续

    上文我们从netty-example的Discard服务器端示例分析了netty的组件,今天我们从另一个简单的示例Echo客户端分析一下上个示例中没有出现的netty组件. 1. 服务端的连接处理,读 ...

  6. 源码分析netty服务器创建过程vs java nio服务器创建

    1.Java NIO服务端创建 首先,我们通过一个时序图来看下如何创建一个NIO服务端并启动监听,接收多个客户端的连接,进行消息的异步读写. 示例代码(参考文献[2]): import java.io ...

  7. 从netty-example分析Netty组件

    分析netty从源码开始 准备工作: 1.下载源代码:https://github.com/netty/netty.git 我下载的版本为4.1 2. eclipse导入maven工程. netty提 ...

  8. Netty实现高性能RPC服务器优化篇之消息序列化

    在本人写的前一篇文章中,谈及有关如何利用Netty开发实现,高性能RPC服务器的一些设计思路.设计原理,以及具体的实现方案(具体参见:谈谈如何使用Netty开发实现高性能的RPC服务器).在文章的最后 ...

  9. Netty构建分布式消息队列(AvatarMQ)设计指南之架构篇

    目前业界流行的分布式消息队列系统(或者可以叫做消息中间件)种类繁多,比如,基于Erlang的RabbitMQ.基于Java的ActiveMQ/Apache Kafka.基于C/C++的ZeroMQ等等 ...

随机推荐

  1. Leetcode 526

    class Solution { public: int countArrangement(int N) { vector<int> nums; ;i <= N;i++) nums. ...

  2. DATEADD 和 CAST 函数

    where cast(soh.orderdate as date)=cast(dateadd(day,-1,getdate()) as date) 这一代码在sql 2005 不适用,使用conver ...

  3. sql server server 2005任务导入导出功能选项没有的解决方法

         出现这个问题主要原因是安装的sql server是Express版本的,或者已经安装了Express版本之后安装了企业版的.但是SQL图形管理工具仍然是SQL Server Manageme ...

  4. dubbo为consumer创建代理

    ReferenceConfig.init()方法中获取到了最终的代理对象,先观察一下代理对象的视图. 默认使用javassist生成动态类,可配置proxy为jdk,则使用jdk动态代理: <d ...

  5. Centos中彻底删除Mysql(rpm、yum安装的情况)

    [root@data lib]# rpm -qa¦grep mysqlmysql-5.5.25-1.el6.remi.i686mysql-libs-5.5.25-1.el6.remi.i686comp ...

  6. PHP:第四章——PHP数组查找,替换,过滤,判断相关函数

    <pre> <?php //查找,替换,过滤,判断相关函数 header("Content-Type:text/html;charset=utf-8"); /*知 ...

  7. Vue 就地复用策略注意事项

    ---template部分 div el-popover(ref="message", placement="top-start", title="标 ...

  8. 模拟QQ分组

    package com.lixu.fenzu; import java.util.ArrayList; import java.util.HashMap; import android.app.Lis ...

  9. Android Studio 常用快捷键大全

    鉴于使用AndroidStudio进行Android 开发的人越来越多,笔者整理了一些常用的快捷键.方便读者查阅,提高开发效率.

  10. Python3 文件操作(十六)

    一 文件操作 1.介绍 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众 ...