您当前的位置: 首页 >  dubbo

一一哥Sun

暂无认证

  • 3浏览

    0关注

    622博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Day09_11_Dubbo教程之远程通信框架Netty原理分析

一一哥Sun 发布时间:2019-06-12 08:54:09 ,浏览量:3

Dubbo远程通信框架Netty原理分析 一. 概述

Dubbo 底层通信选择了 Netty 这个 NIO 框架来做为默认的网络通信框架,并且通过自定义协议进行通信.dubbo 支持以下网络通信框架:

  • Netty(默认)

  • Mina

  • Grizz ly

二. Netty是什么? 1. Netty简介

Netty是一个由JBOSS提供的非常好用的处理socket通信的Java开元框架.它的目的是为了快速开发高性能、高可靠性的网络服务器和客户端程序.Netty提供异步的、事件驱动的网络应用程序框架和工具.

2. Netty优点

2.1 并发高

Netty是一款基于NIO(Nonblocking I/O,非阻塞IO)开发的网络通信框架,对比于BIO(Blocking I/O,阻塞IO),它的并发性能得到了很大提高.

BIO示意图:

NIO示意图:

对比两张图可以看出,下图中出现了selector,这也正是NIO的单线程处理连接的数量比BIO高出很多的原因.

当一个连接建立之后,它有两个步骤要做:

  • 第一步是接收完客户端发过来的全部请求数;

  • 第二步是服务端处理完请求业务之后返回response给客户端.

NIO和BIO的区别主要是在第一步.

在BIO中,等待客户端发送数据这个过程是阻塞的,这样就造成了一个线程只能处理一个请求的情况,而机器能支持的最大线程数是有限的,这就是为什么BIO不能支持高并发的原因.

而NIO中,当一个Socket建立好之后,Thread并不会阻塞这个Socket,而是将这个请求交给Selector,Selector会不断的遍历所有的Socket,一旦有一个Socket建立完成,它会通知Thread,然后Thread处理完数据再返回给客户端---这个过程是阻塞的,这样就能让一个Thread处理更多的请求了.

BIO与NIO的区别

BIO: 同步阻塞IO,阻塞整个步骤,如果连接少,它的延迟是最低的,因为一个线程只处理一个连接,适用于少连接且延迟低的场景,比如说数据库连接.

NIO: 同步非阻塞IO,阻塞业务处理但不阻塞数据接收,适用于高并发且处理简单的场景,比如聊天软件.

2.2 传输快

Netty的传输快其实也是依赖了NIO的一个特性---零拷贝.我们知道,Java的内存有堆内存、栈内存和字符串常量池等,其中堆内存是占用内存空间最大的一块,也是Java存放对象的地方,一般我们的数据如果需要从IO读取到堆内存,中间需要经过Socket缓冲区,也就是说一个数据会被拷贝两次才能到达它的的终点,如果数据量大,就会造成不必要的资源浪费.

Netty针对这种情况,使用了NIO中的另一大特性---零拷贝,当它需要接收数据的时候,它会在堆内存之外开辟一块内存,数据就直接从IO读到了那块内存中去,在Netty里面通过ByteBuf可以直接对这些数据进行直接操作,从而加快了传输速度.

三. 核心组件 1. Channel

数据传输流,与channel相关的概念有以下四个.

2. ByteBuf

ByteBuf是一个存储字节的容器,最大特点就是使用方便,它既有自己的读索引和写索引,方便你对整段字节缓存进行读写,也支持get/set.

3. EventLoop

EventLoop 是 Netty 的核心概念, Netty 里面的网络编程处理都是基于事件回调.下面的图说明了 Channel、EventLoop、Thread 以及 EventLoopGroup 之间的关系.

它们的关系是:

  • 1️⃣. 一个 EventLoopGroup 包含一个或者多个 EventLoop;

  • 2️⃣. 一个 EventLoop 在它的生命周期内只和一个 Thread 绑定;

  • 3️⃣. 所有 EventLoop 处理的 I/O 事件都将在它专门的 Thread 中被处理;

  • 4️⃣. 一个 Channel 在它的生命周期内只注册于一个 EventLoop;

  • 5️⃣. 一个 EventLoop 可能会被分配一个或者多个 Channel;

Netty 设计为一个操作 I/O 的 Channel 都会由相同的 Thread执行,这样就能够消除线程之间的同步.所以 Netty 内部是通过回调来处理事件的,当一个回调被触发时执行相关的事件.

 

关注
打赏
1665624836
查看更多评论
立即登录/注册

微信扫码登录

0.0375s