Dubbo provider Filter链是如何构建的

provider端的Filter链构建是在初始化流程中构建的,我们知道初始化流程肯定会走到方法org.apache.dubbo.remoting.transport.netty4.NettyServer#doOpen中,可以在该方法打个断点,然后启动provider服务,调用栈信息如下:

阅读全文

Dubbo RPC在provider端是如何跑起来的

dubbo RCP请求到达provider后,首先经过数据接收、解码(NettyWokerThread/NioEventLoop),然后传递到RPC后续流程(DubboServerHandler),即filter、service invoke过程,service invoke过程也就是执行真正服务的逻辑,执行完毕后再经过编码作为响应返回给RPC调用者。

阅读全文

dubbo provider是如何启动的

Netty支持多种服务端的server实例,包括mina、netty等,如下所示:

阅读全文

Dubbo连通性讨论

关于dubbo连通性,也就是dubbo各组件之间通信、privider和consumer连接、以及通信方式这些功能点。话不多说,让我们一起揭开dubob连通性的面纱吧。

dubbo架构

在开始之前,先来看一下dubbo整体架构图,有助于从整体把握dubbo框架:

阅读全文

Dubbo线程模型

Dubbo中线程池的应用还是比较广泛的,按照consumer端到provider的RPC的方向来看,consumer端的应用业务线程到netty线程、consuemr端dubbo业务线程池,到provider端的netty boss线程、worker线程和dubbo业务线程池等。这些线程各司其职相互配合,共同完成dubbo RPC服务调用,理解dubbo线程模型对于学习Dubbo原理很有帮助。

阅读全文

Dubbo RPC在consumer端是如何跑起来的

Dubbo作为一款高性能Java RPC框架,RPC是其最重要的流程之一。Dubbo RPC涉及到consumer端和provider端的流程,本文主要分析consumer端的RPC流程实现,包括集群容错、dubbo路由、负载均衡、Filter处理链、DubboInvoker和RPC结果返回等流程。

阅读全文

dubbo的发展历程

Apache Dubbo™ 是一款高性能Java RPC框架。说起dubbo,国内开发者几乎都知道它的大名,既然现在的dubbo很流行,那么让我们回顾下过去的dubbo吧,一起看下dubbo的发展历程:

阅读全文

责任链的2种实现方式

责任链模式是日常开发或者框架中经常被使用的一种设计模式,典型的责任链有2种实现方式,不知道各位小伙伴更pick哪一种呢?下面就一起来比较下这2种实现方式吧~

责任链是什么

责任链是属于行为型模式,在这种模式中,通常每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。责任链模式避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

阅读全文

Linux mmap

mmap系统调用的作用是在调用进程的虚拟地址空间中创建一个新的内存映射。根据内存背后有无实体文件与之关联,映射可以分成以下两种:

  • 文件映射:内存映射区域有实体文件与之关联。mmap系统调用将普通文件的一部分内容直接映射到调用进程的虚拟地址空间。一旦完成映射,就可以通过在相应的内存区域中操作字节来访问文件内容。这种映射也被称为基于文件的映射。

阅读全文

Linux管道

管道是最早出现的进程间通信的手段,在shell中执行命令,经常会将上一个命令的输出作为下一个命令的输入,由多个命令配合完成一件事情。管道的作用是在有亲缘关系的进程之间传递消息,因为共同主先进程调用过pipe函数,打开的管道文件就会在fork之后,被各个后代进程所共享,打开的管道可以由其中一个进程写入数据,然后另一个具有亲属关系的进程读取。

阅读全文

网络数据是如何传递给进程的

在分析网卡数据是如何传递给进程的流程之前,要知道数据是如何从进程写到网卡的,因为只有发起方写数据到网卡然后接收方才能接收到并处理。

发送数据

发送方的发送数据的处理流程大致为:用户空间 -> 内核 -> 网卡 -> 网络。

阅读全文

进程是如何调度的

操作系统运行过程中,CPU都忙于在不同进程(或线程)间执行指令,这就涉及到进程调度,进程调度是到底执行了哪些操作呢?

首先是将当前进程的上下文状态信息予以保护,以便将来能够重新恢复执行,然后将要执行的进程所需的环境准备好,包括设置寄存器、栈指针、状态字等操作。最后跳转到选中的进程,也就是设置或恢复其程序计数器,开始执行进程指令。

阅读全文

从sockert api看网络通信流程

说了网络通信,大家肯定都不会陌生,比如各种分布式系统、大数据框架等等都要涉及到网络通信,由于大多数通信都是基于TCP协议来的,因此本文就以TCP为例,结合socket api来分析Linux下的网络通信流程。

TCP协议是基于IP协议之上的面向流并且可靠传输的通信协议,同时TCP也拥有流量控制和拥塞控制机制。说起TCP,就绕不开的TCP的3次握手和4次挥手,因此先看下握手和挥手流程:

阅读全文

谈一谈TCP的4次挥手

TCP是全双工传输协议,也就是说双方都可进行读写操作,当一方不需要写数据时,会通过发送FIN报文告知对方,我要关闭连接了,对方接受到并返回ACK报文,这就表示一方的连接已经关闭,此时另一方的连接还是OK的,也就是说另一方还是可以继续写数据的,等到另一方也发完数据之后就可以发送FIN报文。

阅读全文

深入理解TCP的3次握手

说起TCP的三次握手,大多数小伙伴多少都听说过一些,因此本文不再赘述三次握手的详细流程,而是重点关注三次握手中半连接队列和全连接队列流程,以及二者队列满了时的处理机制,最后分析下常见的三次握手的问题,这些问题大都也是和半连接队列和全连接队列相关的。

阅读全文

Linux信号

信号是一种异步处理的软中断,内核会发送给进程某些异步事件,这些异步事件可能来自硬件,比如除0或者访问了非法地址;也可能来自其他进程或用户输入,比如ctrl+c。

信号是一种进程间通信机制,信号都有一个对应的默认处理行为,信号触发时,信号处理函数和进程正常的执行流程同时存在,这会给编程带来隐患,如果信号处理函数中调用了不可重入函数的话。信号同其他进程间通信技术(管道、共享内存)相比,传递的信息还是有限的,由于信息较少所以也方便管理,一般在系统管理中使用,比如终止或者恢复进程等。

阅读全文

Linux inode那些事儿

在理解inode之前,先了解下磁盘扇区,磁盘的最小单位,我们都知道,磁盘一个扇区是512个字节。磁盘读写是都是按照块来操作的,一个块一般是4K,也就是连续的8个扇区,以块为单位读写是为了提高性能。

文件数据都储存在”块”中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为”索引节点”。

阅读全文

页面更换算法

操作系统为什么需要页面更换呢,因为物理内存不够,不可能同时加载所需的所有数据页,因此只能加载正在或最近要使用的内存页。页面更换的目标是,尽量替换掉不再使用或者一段时间内不再使用的内存页,要不然会很容易触发缺页中断,该操作代价较大,涉及到从磁盘加载,因此页面更换可不是随便的事情。

阅读全文

磁盘IO

基本概念:

  • IOPS:每秒输入输出量(读写次数)。
  • 吞吐量:单位时间内成功传输的数据量。

阅读全文

操作系统基本概念

内核态与用户态

内核态和用户是程序执行的两个状态,二者执行时的权限不同,内核态可以访问计算机所有资源,因此对于内核态程序的安全性要求较高。

阅读全文