Dubbo provider Filter链是如何构建的
provider端的Filter链构建是在初始化流程中构建的,我们知道初始化流程肯定会走到方法org.apache.dubbo.remoting.transport.netty4.NettyServer#doOpen
中,可以在该方法打个断点,然后启动provider服务,调用栈信息如下:
provider端的Filter链构建是在初始化流程中构建的,我们知道初始化流程肯定会走到方法org.apache.dubbo.remoting.transport.netty4.NettyServer#doOpen
中,可以在该方法打个断点,然后启动provider服务,调用栈信息如下:
dubbo RCP请求到达provider后,首先经过数据接收、解码(NettyWokerThread/NioEventLoop),然后传递到RPC后续流程(DubboServerHandler),即filter、service invoke过程,service invoke过程也就是执行真正服务的逻辑,执行完毕后再经过编码作为响应返回给RPC调用者。
Dubbo中线程池的应用还是比较广泛的,按照consumer端到provider的RPC的方向来看,consumer端的应用业务线程到netty线程、consuemr端dubbo业务线程池,到provider端的netty boss线程、worker线程和dubbo业务线程池等。这些线程各司其职相互配合,共同完成dubbo RPC服务调用,理解dubbo线程模型对于学习Dubbo原理很有帮助。
Dubbo作为一款高性能Java RPC框架,RPC是其最重要的流程之一。Dubbo RPC涉及到consumer端和provider端的流程,本文主要分析consumer端的RPC流程实现,包括集群容错、dubbo路由、负载均衡、Filter处理链、DubboInvoker和RPC结果返回等流程。
Apache Dubbo™ 是一款高性能Java RPC框架。说起dubbo,国内开发者几乎都知道它的大名,既然现在的dubbo很流行,那么让我们回顾下过去的dubbo吧,一起看下dubbo的发展历程:
mmap系统调用的作用是在调用进程的虚拟地址空间中创建一个新的内存映射。根据内存背后有无实体文件与之关联,映射可以分成以下两种:
管道是最早出现的进程间通信的手段,在shell中执行命令,经常会将上一个命令的输出作为下一个命令的输入,由多个命令配合完成一件事情。管道的作用是在有亲缘关系的进程之间传递消息,因为共同主先进程调用过pipe函数,打开的管道文件就会在fork之后,被各个后代进程所共享,打开的管道可以由其中一个进程写入数据,然后另一个具有亲属关系的进程读取。
操作系统运行过程中,CPU都忙于在不同进程(或线程)间执行指令,这就涉及到进程调度,进程调度是到底执行了哪些操作呢?
首先是将当前进程的上下文状态信息予以保护,以便将来能够重新恢复执行,然后将要执行的进程所需的环境准备好,包括设置寄存器、栈指针、状态字等操作。最后跳转到选中的进程,也就是设置或恢复其程序计数器,开始执行进程指令。
说了网络通信,大家肯定都不会陌生,比如各种分布式系统、大数据框架等等都要涉及到网络通信,由于大多数通信都是基于TCP协议来的,因此本文就以TCP为例,结合socket api来分析Linux下的网络通信流程。
TCP协议是基于IP协议之上的面向流并且可靠传输的通信协议,同时TCP也拥有流量控制和拥塞控制机制。说起TCP,就绕不开的TCP的3次握手和4次挥手,因此先看下握手和挥手流程:
TCP是全双工传输协议,也就是说双方都可进行读写操作,当一方不需要写数据时,会通过发送FIN报文告知对方,我要关闭连接了,对方接受到并返回ACK报文,这就表示一方的连接已经关闭,此时另一方的连接还是OK的,也就是说另一方还是可以继续写数据的,等到另一方也发完数据之后就可以发送FIN报文。
说起TCP的三次握手,大多数小伙伴多少都听说过一些,因此本文不再赘述三次握手的详细流程,而是重点关注三次握手中半连接队列和全连接队列流程,以及二者队列满了时的处理机制,最后分析下常见的三次握手的问题,这些问题大都也是和半连接队列和全连接队列相关的。
信号是一种异步处理的软中断,内核会发送给进程某些异步事件,这些异步事件可能来自硬件,比如除0或者访问了非法地址;也可能来自其他进程或用户输入,比如ctrl+c。
信号是一种进程间通信机制,信号都有一个对应的默认处理行为,信号触发时,信号处理函数和进程正常的执行流程同时存在,这会给编程带来隐患,如果信号处理函数中调用了不可重入函数的话。信号同其他进程间通信技术(管道、共享内存)相比,传递的信息还是有限的,由于信息较少所以也方便管理,一般在系统管理中使用,比如终止或者恢复进程等。
在理解inode之前,先了解下磁盘扇区,磁盘的最小单位,我们都知道,磁盘一个扇区是512个字节。磁盘读写是都是按照块来操作的,一个块一般是4K,也就是连续的8个扇区,以块为单位读写是为了提高性能。
文件数据都储存在”块”中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为”索引节点”。
操作系统为什么需要页面更换呢,因为物理内存不够,不可能同时加载所需的所有数据页,因此只能加载正在或最近要使用的内存页。页面更换的目标是,尽量替换掉不再使用或者一段时间内不再使用的内存页,要不然会很容易触发缺页中断,该操作代价较大,涉及到从磁盘加载,因此页面更换可不是随便的事情。