美文网首页互联网科技程序员Java 杂谈
Qzone 微信 Java高级——dubbo源码分析之远程通信

Qzone 微信 Java高级——dubbo源码分析之远程通信

作者: 90299fbffdea | 来源:发表于2018-08-29 20:31 被阅读90次

    Java高级——dubbo源码分析之远程通信 netty 

    dubbo 底层通信选择了 netty 这个 nio 框架做为默认的网络通信框架并且通过自定义协议进行通信。dubbo 支持以下网络通信框架:

    Netty(默认) 

    Mina 

    Grizz ly 

    Netty是什么? 

    ①本质:由JBOSS提供的一个java开源框架(一个jar包)

    ②目的:快速开发高性能、高可靠性的网络服务器和客户端程序

    ③优点:提供异步的、事件驱动的网络应用程序框架和工具

    通俗来说。一个好使的处理socket的框架。

    1.并发高

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

    Java高级——dubbo源码分析之远程通信 netty 

    Java高级——dubbo源码分析之远程通信 netty 

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

    当一个连接建立之后,他有两个步骤要做,第一步是接收完客户端发过来的全部数据,第二步是服务端处理完请求业务之后返回response给客户端。NIO和BIO的区别主要是在第一步。

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

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

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

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

    2.传输快

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

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

    核心组件 

    1.Channel

    数据传输流,与channel相关的概念有以下四个,上一张图让你了解netty里面的Channel。

    Java高级——dubbo源码分析之远程通信 netty 

    2.ByteBuf

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

    3.EventLoop

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

    Java高级——dubbo源码分析之远程通信 netty 

    它们的关系是:

    一个 EventLoopGroup 包含一个或者多个 EventLoop; 

    一个 EventLoop 在它的生命周期内只和一个 Thread 绑定; 

    所有的 EventLoop 处理的 I/O 事件都将在它专门的 Thread 被处理; 

    一个 Channel 在它的生命周期内只注册于一个 EventLoop; 

    一个 EventLoop 可能会被分配一个或者多个 Channel; 

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

    欢迎工作一到五年的Java工程师朋友们加入Java进阶高级架构:828545509

    本群提供免费的学习指导 架构资料 以及免费的解答

    不懂得问题都可以在本群提出来 之后还会有职业生涯规划以及面试指导

    相关文章

      网友评论

        本文标题:Qzone 微信 Java高级——dubbo源码分析之远程通信

        本文链接:https://www.haomeiwen.com/subject/wzpkwftx.html