我们知道,rpc(远程过程)调用就是两个不在同一主机的进程通过网络进行相互调用通信,区分一个网络进程主要通过端口号,而一个网络连接channel主要是通过 源ip:源端口 + 目标ip:目标端口,所以大部分两个服务进行相互调用过程其实是通过单连接进行。
当服务提供方和调用方之间发生并发请求时,服务方和调用方用同一个单连接进行通信,如何控制调用者线程和网络连接的分配,才能保证数据的有序和完整及正确性,以及通信性能?
鉴于dubbo是高性能的分布式服务框架,不妨我们把目光放到2.7.4版本dubbo的源码上看,它是如何设计它的线程模型。
Dubbo的底层网络通讯可以基于netty,也可以是mina,我们本次分析的是基于netty情况下dubbo单连接通信情况下的线程模型。
我们简单讲下netty4的io线程模型:
如图下图所示,每个连接channel固定和某一个线程绑定,该channel的读写都有绑定的线程进行操作,一个io线程可以绑定多个channel;
因此可知dubbo的两个节点间单连接网络数据读写其实是单线程进行的,既然服务与调用者之前的单连接只有一个线程进行处理网络数据,那么它是则么做到服务的高性请求和响应呢?接下来我们在看看dubbo的一个请求和响应的处理过程。