dubbo中的请求和响应是如何关联起来的呢?

每一个请求和响应共用同一个id。

public class DefaultFuture implements ResponseFuture {
// invoke id.
private final long id;
private final Request request;
private volatile Response response;
}

consumer创建请求的调用栈:

public class Request {
private static final AtomicLong INVOKE_ID = new AtomicLong(0);
private final long mId; public Request() {
mId = newId();
} public long getId() {
return mId;
}
private static long newId() {
// getAndIncrement()增长到MAX_VALUE时,再增长会变为MIN_VALUE,负数也可以做为ID
return INVOKE_ID.getAndIncrement();
}
}

provider 创建响应:

//HeaderExchangeHandler类
Response handleRequest(ExchangeChannel channel, Request req) throws RemotingException {
//使用请求的id,作为响应的id
Response res = new Response(req.getId(), req.getVersion());
if (req.isBroken()) {
Object data = req.getData(); String msg;
if (data == null) msg = null;
else if (data instanceof Throwable) msg = StringUtils.toString((Throwable) data);
else msg = data.toString();
res.setErrorMessage("Fail to decode request due to: " + msg);
res.setStatus(Response.BAD_REQUEST); return res;
}
// find handler by message class.
Object msg = req.getData();
try {
// handle data.
Object result = handler.reply(channel, msg);
res.setStatus(Response.OK);
res.setResult(result);
} catch (Throwable e) {
res.setStatus(Response.SERVICE_ERROR);
res.setErrorMessage(StringUtils.toString(e));
}
return res;
}

dubbo的响应:

//省略其他代码
public class Response {
public static final String HEARTBEAT_EVENT = null;
public static final String READONLY_EVENT = "R";
public static final byte OK = 20;
public static final byte CLIENT_TIMEOUT = 30;
public static final byte SERVER_TIMEOUT = 31;
public static final byte BAD_REQUEST = 40;
public static final byte BAD_RESPONSE = 50;
public static final byte SERVICE_NOT_FOUND = 60;
public static final byte SERVICE_ERROR = 70;
public static final byte SERVER_ERROR = 80;
public static final byte CLIENT_ERROR = 90;
private long mId = 0;
private String mVersion;
//响应的状态
private byte mStatus = OK;
private boolean mEvent = false;
private String mErrorMsg;
// 真实类型是 RpcResult,存放provider返回的结果值或异常
private Object mResult;
} public class RpcResult implements Result, Serializable {
private static final long serialVersionUID = -6925924956850004727L;
//存放返回值。如果接口声明为void,则result为null
private Object result;
//异常
private Throwable exception;
public RpcResult(){ }
}

请求-响应对示例:

dubbo的请求、响应对的更多相关文章

  1. 你想建设一个能承受500万PV/每天的网站吗?服务器每秒要处理多少个请求才能应对?

    你想建设一个能承受500万PV/每天的网站吗?服务器每秒要处理多少个请求才能应对? 你想建设一个能承受500万PV/每天的网站吗? 500万PV是什么概念?服务器每秒要处理多少个请求才能应对?如果计算 ...

  2. 假如想要建设一个能承受500万PV/每天的网站,服务器每秒要处理多少个请求才能应对?

    假如想要建设一个能承受500万PV/每天的网站,服务器每秒要处理多少个请求才能应对?如何计算? 1.PV是什么:PV是page view的简写.PV是指页面的访问次数,每打开或刷新一次页面,就算做一个 ...

  3. zk请求和响应对

    zk的请求和响应是通过id对应上的: 请求头(RequestHeader)和响应头(ReplyHeader)共用一个xid,它的本质是ClientCnxn类中的一个计数器. 1. 首先看客户端: Pa ...

  4. 懂得三境界-使用dubbo时请求超过问题

    引子 刚才下班回家路上,无意中听到大街上放的歌,歌词有这么一句:"毡房外又有驼铃声声响起,我知道那一定不是你".这一句我似乎听懂了歌者的魂牵梦绕和绝望,如果在十年前我大概只能感受出 ...

  5. 8.DRF请求响应和api_view

    一.请求对象(Request objects)   DRF引入了一个扩展Django常规HttpRequest对象的Request对象,并提供了更灵活的请求解析能力 Request对象的核心功能是re ...

  6. 使用PHP实现请求响应和MySql访问

    在iOS开发当中经常需要使用来自后台的数据,所以使用一种很简便的写后台的方法. 首先,安装XAMPP,这是一个集成好的阿帕奇+MySQL环境,点击按钮即可开启服务,不需要进行任何环境配置. 然后,开启 ...

  7. 再看Ajax

    再回顾Ajax相关的内容,再次梳理学习还是很有必要的,尤其是实际的开发中,ajax更是必不可少,仔细学习以便避免不必要的错误. 文章导读: --1.使用XMLHttpRequest---------- ...

  8. 第十六章:脚本化HTTP

    写在本章内容前: 第十五章:事件处理 涉及到到较多的文字篇幅,介于个人精力问题,暂不更新.主要包含的内容有事件类型.注册事件处理程序.事件处理程序的调用.文档加载事件.鼠标事件.鼠标滚轮事件.拖放事件 ...

  9. Ajax技术详解

    Ajax技术:Ajax描述了一种主要使用脚本(JS)操纵HTTP的web应用架构,它的主要特点是使用脚本操纵HTTP和web服务器进行数据交换,不会导致页面重载.Ajax的核心是JS的XMLHttpR ...

随机推荐

  1. Non-resolvable parent POM

    今天导入公司项目,maven聚合项目,但是项目目录结构不正确,内层的项目的parent不是外层项目,这个......有点无语,结果导入直接报错.同事说,我们导入是好好的啊,原来他们用的是eclipse ...

  2. c++性能之对象与指针性能比较、以及java与c++性能对比实测

    为了更加直观的比较,好吧,我们选择以对象的初始化并add到list为例子. 首先,定义object如下: #include <string> #pragma once using name ...

  3. 20145105 《Java程序设计》第6周学习总结

    20145105 <Java程序设计>第6周学习总结 教材学习内容总结 第十章 输入/输出 一.InputStream与OutputStream (一)串流设计的概念 输入串流代表对象:j ...

  4. USB Compound Device,USB复合设备 ; USB Composite Device,USB组合设备【转】

    本文转载自:https://blog.csdn.net/autumn20080101/article/details/52776863 科普下USB复合设备和USB组合设备的区别. 关键字 Commu ...

  5. Autotools使用流程【转】

    本文转载自:http://blog.csdn.net/scucj/article/details/6079052 手工写Makefile是一件很有趣的事情,对于比较大型的项目,如果有工具可以代劳,自然 ...

  6. 如何创建自己的python包

    写过python的人都知道python最方便也最牛的地方就是它有无数的第三方lib可以直接拿来使用,可以让编写代码变的更容易. 长用的安装第三方lib的方法有easy_install和pip,这两个的 ...

  7. HDU 2544 最短路(Dijkstra)

    https://vjudge.net/problem/HDU-2544 题意: 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<=10000),N表示成都的大街上有几个 ...

  8. POJ 1018 Communication System(DP)

    http://poj.org/problem?id=1018 题意: 某公司要建立一套通信系统,该通信系统需要n种设备,而每种设备分别可以有m1.m2.m3.....mn个厂家提供生产,而每个厂家生产 ...

  9. MongoDB(课时4 数据增加)

    3.4 数据操作(重点) 只要是数据库就绝对离不开最核心的功能:CRUD(增加Create.读取查询Retrieve.更新Update.删除Delete),除了增加之外,其他都很麻烦,最麻烦的是修改. ...

  10. Socket入门之前的知识点

    Socket难点 数据粘包 心跳维持 数据丢包 性能问题 7层网络模型-OSI 基础层:物理层(Physical).数据链路层(Datalink).网络层(Network) 传输层(Transport ...