dubbo系列二、dubbo请求流程记录
1.dubbo请求处理流程
dubbo是个rpc框架,本质就是socket通信,把客户端的请求信息进行编码为二进制,然后通过socket发送数据。服务端接收二进制数据,解码,进行业务逻辑处理。过程涉及较多,记录如下。
1.1. consumer端处理流程
1.远程调用入口是InvokerInvocationHandler
2.根据调用的methodName,从注册表RegistryDirectory.methodInvokerMap缓存获取Invoker集合(服务方)。这些Invoker集合是consumer启动或服务端服务有变动,监听zk节点生成的。
3.使用路由进行过滤,获取过滤后的Invoker集合。默认是路由是MockInvokersSelector,TagRouter
4.使用负载均衡策略,从上步中的Invoker集合选取一个Invoker,后续就会请求这个具体的服务方
5.consumer端filter chain执行。通常dubbo默认[ConsumerContextFilter,FutureFilter,MonitorFilter]。如果是泛化调用filter chain[ConsumerContextFilter,FutureFilter,MonitorFilter,GenericImplFilter]。filter chain作用是在请求前做一些公共处理,通常我们工作中最经常扩展这个
6.Invoker执行调用。执行的是DubboInvoker.invoker(),该Invoker封装了NettyClient,可以进行网络通信
7.netty调用,进行网络编码,然后发送数据
8.使用Future模式进行同步等待,直至获取响应数据或超时
9.DefaultFuture阻塞等待provider响应结果
10.netty遍历selectionkey,read事件,进行解码,接着使用NettyClientHandler读取接收数据
11.使用HeartbeatHandler进行接收处理数据,封装Response为ChannelEventRunnable,交由dubbo线程池异步处理。注意:HeartbeatHandler是网络发送和接收的入口
12.ChannelEventRunnable处理接收事件,根据Response里面的唯一id获取DefaultFuture,把响应数据Response保存到DefaultFuture,同时唤醒DefaultFuture。即唤醒第8步。
13.DefaultFuture阻塞被唤醒,获取到响应结果(响应结果在第12步已经被保存到DefaultFuture),返回业务数据,至此结束。
1.2.provider端处理流程
1.nettyServer接收consumer端请求数据,进行解码
2.dubbo层数据接入入口是HeartbeatHandler,封装请求信息为ChannelEventRunnable,使用dubbo线程池异步处理
3.ChannelEventRunnable处理Request,根据请求数据内的group+interfaceName+version+port从缓存DubbotProtocol.exporterMap获取服务暴露对象DubboExporter,继而获取provider端Invoker对象
4.Invoker执行,先经过filte chain,然后最终调用目标服务执行业务逻辑
5.把业务执行结果封装为Response,使用netty进行网络通信返回数据。
1.3.dubbo请求分析记录-图
画了泳道图和xmind,以后不会再遗忘了
泳道图
xmind图
dubbo请求xmind原图https://gitee.com/yulewo123/mdpicture/blob/master/document/dubbo/dubbo请求流程.xmind
2.dubbo请求核心说明
1.consumer端的注册表RegistryDirectory,集群策略,负载均衡策略
2.filter chain,这个我们常用于扩展
3.dubbo的netty模型,可以直接拆出来作为一个基础框架使用了
后续一一写下文章
dubbo系列二、dubbo请求流程记录的更多相关文章
- [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参
[转]ASP.NET MVC学习系列(二)-WebAPI请求 传参 本文转自:http://www.cnblogs.com/babycool/p/3922738.html ASP.NET MVC学习系 ...
- dubbo系列二:dubbo常用功能总结
准备工作: (1)启动zookeeper作为dubbo的注册中心 (2)新建一个maven的生产者web工程dubbo-provider-web和一个maven的消费者web工程dubbo-consu ...
- dubbo系列二、dubbo+zookeeper+dubboadmin分布式服务框架搭建(windows平台)
一.zookeeper配置中心安装 1.下载安装包,zookeeper-3.4.6.tar.gz 2.解压安装包,修改配置文件 参考zookeeper-3.4.6/conf/zoo_sample.cf ...
- Dubbo学习(二) Dubbo 集群容错模式-负载均衡模式
Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...
- ASP.NET MVC学习系列(二)-WebAPI请求
继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...
- ASP.NET MVC学习系列(二)-WebAPI请求(转)
转自:http://www.cnblogs.com/babycool/p/3922738.html 继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的g ...
- dubbo学习 二 dubbo源码大致查阅
源码的解析在官网都已经写的非常详细,可以参考:http://dubbo.io/Developer+Guide-zh.htm 服务提供者暴露一个服务的详细过程 首先ServiceConfig类拿到对 ...
- ASP.NET MVC学习系列(二)-WebAPI请求 转载https://www.cnblogs.com/babycool/p/3922738.html
继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...
- Elasticsearch 学习二(请求流程).
一.写入数据 1.ES 的任意节点都可以作为协调(Coordinating)节点接受请求(包括新建.索引或者删除请求),每个节点都知道集群中任一文档位置: 2.协调节点会通过 routing 字段计算 ...
随机推荐
- 漫谈IRP
I/O Request Packet(IRP) IRP概述: IRP是由I/O管理器发出的,I/O管理器是用户态与内核态之间的桥梁,当用户态进程发出I/O请求时,I/O管理器就捕获这些请求,将其转换为 ...
- Google Earth Engine 批量点击RUN任务,批量取消正在上传的任务
本文内容参考自: https://blog.csdn.net/qq_21567935/article/details/89061114 https://blog.csdn.net/qq_2156793 ...
- Windows Terminal 终端 SSH连接centos7 linux
1.在Windows Store中安装 Windows Terminal 2.打开Windows Terminal,使用下拉箭头,打开设置. 3.在左侧点击"添加新配置文件",再点 ...
- java 8 启动脚本优化 2
#!/bin/bash #链接文件 source /etc/profile #java虚拟机启动参数 #通过http://xxfox.perfma.com/jvm/check来检查参数的合理性 JAV ...
- tomcat Address already in use: JVM_Bind
运行多个tomcat时,出现tomcat Address already in use: JVM_Bind这个错误,可以按照如下方式解决: 修改F:\tomcat20111101\apache-tom ...
- django——django链接mysql数据库
1.创建项目 django-admin startproject django_mysql 2.创建App python manage.py startapp app1 3.Mysql数据库配置 (1 ...
- vue-组件化编程
1.传统编写方式和组件编写方式的区别 组件方式编写可以很方便的复用和封装某些功能模块/组件的命名最好语义化,方便维护和阅读 编写时,我们可以将某些共用的功能或者样式部分抽象,得到对应的组件,按需要引入 ...
- 【LeetCode】85. Maximal Rectangle 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/maximal- ...
- 【LeetCode】846. Hand of Straights 解题报告(Python & C+)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- Contrastive Generative Adversarial Networks
目录 概 主要内容 代码 Kang M., Park J. Contrastive Generative Adversarial Networks. arXiv preprint arXiv 2006 ...