概括:简单说一下dubbo的工作原理?注册中心挂了可以继续通信吗?说一下一次rpc请求的流程?

dubbo是一个颇具代表性的分布式系统的rpc框架标准,基于dubbo可以构建一整套的微服务架构,但需要大量的自己开发。

dubbo 工作原理

内部架构角度

  • 第一层:service 层,接口层,给服务提供者和消费者来实现的
  • 第二层:config 层,配置层,主要是对 dubbo 进行各种配置的
  • 第三层:proxy 层,服务代理层,无论是 consumer 还是 provider,dubbo 都会给你生成代理,代理之间进行网络通信
  • 第四层:registry 层,服务注册层,负责服务的注册与发现
  • 第五层:cluster 层,集群层,封装多个服务提供者的路由以及负载均衡,将多个实例组合成一个服务
  • 第六层:monitor 层,监控层,对 rpc 接口的调用次数和调用时间进行监控
  • 第七层:protocal 层,远程调用层,封装 rpc 调用
  • 第八层:exchange 层,信息交换层,封装请求响应模式,同步转异步
  • 第九层:transport 层,网络传输层,抽象 mina 和 netty 为统一接口
  • 第十层:serialize 层,数据序列化层

image.png

工作流程角度

  • 第一步:provider向注册中心去注册
  • 第二步:consumer从注册中心订阅服务,注册中心会通知consumer注册好的服务
  • 第三步:consumer调用provider
  • 第四步:consumer和provider都异步通知监控中心

在拆分成多个子系统后,各个系统之间可以通过Dubbo框架来进行调用(springCloud框架原理也类似)

架构上

image.png
此处是一个大概的架构,一些技术细节需要深入学习。
可以从结合dubbo内部分层模型和架构模型来进行学习理解。

消费者

动态代理:proxy 具体实现:jdk动态代理,cglib,javaassit,bytebuf
负载均衡:cluster,负载均衡,故障转移,ribbon
注册中心:Registry, consul、zk、eruka
通信协议:Protocol,filter机制,http,rmi,dubbo等协议
网络通信:Transport,netty、mina
序列化: 封装好的请求如何序列化成二进制数组,通过netty,mina发送出去。

提供者

与消费者类似,使用的机制都很类似。

dubbo的网络通信原理

上面的架构是一个比较大的方面,每一部分其实都涉及很多方面。以网络通信为例,涉及到socket通信方面的知识,更多的可能是端口监听等内容。

image.png
网络通信底层其实是基于serversocket进行通信的,端口与端口之间通过通道进行通信。
Acceptor线程用于接受网络请求事件。
processor线程用于处理请求。
消费者和生产者之间通过socketchannel进行通信。
默认情况下,使用NIO异步通信实现高效高并发。使用hessian序列化协议。(序列化,反序列化)