背景

  1. Java线程:由开始的单线程,到通过new Thread()创建的多线程,再到现如今的线程池,Java多线程编程的效率和性能有了很大的提升
  2. Reactor模型:基于事件驱动,适合处理海量I/O事件

    1)  单线程模型,所有的IO操作都在一个NIO线程上完成

    存在性能和可靠性上的问题

    2)  多线程模型,有一组NIO线程处理IO操作

    有一个专门的NIO线程-Acceptor线程用于监听服务端,接收客户端的TCP连接请求;

    有一个NIO线程池,负责消息的读取、发送、编码、解码;

    一个NIO线程能负责N条链路,一条链路只能由一个线程负责(防止发生并发操作问题)

    3)  主从多线程模型

    添加主线程池用于处理客户端的连接请求,一旦链路建立成功(经过握手、认证等过程),就将链路注册到从线程池的IO线程上,由IO线程负责后续的IO操作

Netty线程模型

  1.线程模型分类

    1)  服务端线程模型,类似于Reactor的多线程模型

    2)  客户端线程模型:由客户端创建SocketChannel,发起连接,线程池判断连接结果,如果连接成功,则监听读操作位,否则监听连接操作位,一旦连接成功就监听读操作位

  2.Reactor线程NioEventLoop

    1)  作为服务端Acceptor线程,处理客户端的连接请求

    2)  作为客户端的connector,注册监听连接操作位,判断异步连接结果

    3)  作为IO线程,监听读操作位,负责从SorcketChannel中读取报文

    4)  作为IO线程,监听写操作位,负责向SocketChannel写入报文发送给对方

    5)  作为定时线程,执行定时任务(链路空闲检测,心跳检测)

    6)  作为线程执行器,可以执行普通的任务线程

  3.NioEventLoop设计原理

    1)  串行化设计理念:NioEventLoop线程池中有若干个NioEventLoop线程,每一个NioEventLoop线程串行执行Handler链;每当有一个客户端接入,从线程池中获取一个可用的NioEventLoop线程,当数组到达上限之后,从0开始(负载均衡);每个客户端连接一个线程,这样保证了数据的安全性(避免多个线程同时访问)

    2)  定时任务和时间轮算法:客户端连接超时,链路空闲检测

    Netty的定时任务调度就是基于时间轮调度算法,首先查看任务队列中是否有超时的定时任务或者普通任务,有则执行(按照时间片原则分配运行时间),没有就等待定时任务中延迟最小的任务(即即将第一个超时的任务)的延迟时间,然后将扫描定时任务,将超时的定时任务加入任务队列,在任务执行时,Netty每执行64个定时任务就检测一次是否达到执行时间上限,达到则退出,如果没有执行完就放到下次轮询时再处理。

    3)  Netty是个异步高性能NIO框架,不是业务处理容器,不需要也不应该提供业务容器和业务线程,,只需要提供和管理NIO线程,关于业务层模型由用户自己集成。

Netty结构

PS:图中有一点修正一下,SocketChannel是建立在客户端与服务端之间的,EventLoopGroup线程池中的一个线程与SocketChannel绑定,在服务端后续的线程处理之前,需要从SocketChannel中读取参数,在处理之后,需要向SocketChannel中写入处理结果。

Dubbo通信层(利用Netty)的实现过程

dubbo底层之Netty的更多相关文章

  1. Netty:Reactor Pattern 与 Dubbo 底层传输中的 NettyServer

    首先,我们需要了解Reactor模式的三种线程模型: 1)单线程模型 Reactor 单线程模型,指的是所有的 IO 操作都在同一个 NIO 线程上面完成,NIO 线程的职责如下: 作为 NIO 服务 ...

  2. Dubbo底层采用Socket进行通信详解

    由于Dubbo底层采用Socket进行通信,自己对通信理理论也不是很清楚,所以顺便把通信的知识也学习一下. n  通信理论 计算机与外界的信息交换称为通信.基本的通信方法有并行通信和串行通信两种. 1 ...

  3. ES transport client底层是netty实现,netty本质上是异步方式,但是netty自身可以使用sync或者await(future超时机制)来实现类似同步调用!因此,ES transport client可以同步调用也可以异步(不过底层的socket必然是异步实现)

    ES transport client底层是netty实现,netty本质上是异步方式,但是netty自身可以使用sync或者await(future超时机制)来实现类似同步调用! 因此,ES tra ...

  4. Dubbo底层原理

    dubbo 1. 依赖 spring扫描注入 2. 反射 3. 动态代理 4.Zookeeper 5.netty 服务不在本地,具体实现在远程  可以用Dubbo 基于XML 效率低 传输低  解析低 ...

  5. 看 Netty 在 Dubbo 中如何应用

    目录: dubbo 的 Consumer 消费者如何使用 Netty dubbo 的 Provider 提供者如何使用 Netty 总结 前言 众所周知,国内知名框架 Dubbo 底层使用的是 Net ...

  6. Dubbo源码学习之-通过源码看看dubbo对netty的使用

    前言 前段时间,从头开始将netty源码了解了个大概,但都是原理上理解.刚好博主对dubbo框架了解过一些,这次就以dubbo框架为例,详细看看dubbo这种出色的开源框架是如何使用netty的,又是 ...

  7. Dubbo学习小记

    前言 周一入职的新公司,到了公司第一件事自然是要熟悉新公司使用的各种技术,搭建本地的环境. 熟悉新公司技术的过程中,首先就是Maven,这个前面已经写过文章了,然后就是Dubbo----公司的服务都是 ...

  8. dubbo/dubbox 增加原生thrift及avro支持

    (facebook) thrift / (hadoop) avro / (google) probuf(grpc)是近几年来比较抢眼的高效序列化/rpc框架,dubbo框架虽然有thrift的支持,但 ...

  9. Netty权威指南

    Netty权威指南(异步非阻塞通信领域的经典之作,国内首本深入剖析Netty的著作,全面系统讲解原理.实战和源码,带你完美进阶Netty工程师.) 李林锋 著   ISBN 978-7-121-233 ...

随机推荐

  1. 团队作业——Alpha冲刺 12/12

    团队作业--Alpha冲刺 冲刺任务安排 杨光海天 今日任务:自定义保存界面布局以及交互接口函数的实现 明日任务:总结项目中的问题,为什么没能按照预期推进项目 郭剑南 今日任务:继续解决Python编 ...

  2. Windows2008 Server r2 64位显示桌面图标的方法

    点击桌面左下方的开始菜单,在搜索框中输入“icon”,如下图所示: 点击:显示或隐藏桌面上的通用图标,然后弹出如下图: 应用并确定即可!

  3. windows下一根数据线玩转树莓派zero(w)

    买了个树莓派zero w,想着用一根普通micro数据线达成 供电+ssh+通过usb共享网络+远程桌面 的目标 通过用静态ip免去了用benjour的连接不稳定方法,下面开始细说 需要的硬件: 树莓 ...

  4. 魔法少女【动态规划问题】——NYOJ1204

    个人博客页:https://www.scriptboy.cn/202.html 题目描述: 前些时间虚渊玄的巨献小圆着实火了一把. 在黑长直(小炎)往上爬楼去对抗魔女之夜时,她遇到了一个问题想请你帮忙 ...

  5. Blog Contents

    This page is intently left for contents catalog of my articles. |----------------------------------- ...

  6. Ubuntu 重新安装声卡驱动

    有的时候ubuntu 的声卡不能用,没有声音也不能使用麦克风,所有很困惑,查看声卡驱动的时候不显示声卡的驱动,所有我们要自己安装声卡驱动, 1.下载驱动包这是比较新的声卡驱动,1.0.20 $ wge ...

  7. C++ 怎么让静态变量只初始化一次

    童鞋们在学习C++的时候,往往只是按照书本上的原文去强行记忆各种特性,比方说,静态变量只初始化一次.你心中一定在默念:一定要记住,static只会初始化一次云云,希望自己能够记住.告诉你,你为什么总是 ...

  8. linux_vim

    今天稍微学习以下vim 学习的一些课件: 1. 2. 3. 4. 5.

  9. kettle学习笔记(一)——入门与安装

    一.概述 1.kettle是什么 Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,绿色无需安装,数据抽取高效稳定.中文名称叫水壶,该项目的主程序 ...

  10. 2017-2018 Exp5 MSF基础应用 20155214

    目录 Exp5 MSF基础应用 实验内容 渗透攻击 主要思路 知识点 Exp5 MSF基础应用 本次实验本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路. 主动攻击:m ...