• dubbo的请求、响应对


    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(){ }
    }

    请求-响应对示例:

  • 相关阅读:
    js回调函数
    axios如何先请求A接口然后在请求B接口
    蓝桥杯省赛 区间移位(二分+玄学贪心)
    P1403 [AHOI2005]约数研究(筛法)
    P1029 最大公约数和最小公倍数问题(数论水题)
    洛谷P1147连续自然数和(前缀和)
    洛谷P1017进制转换(进制转换/取模)
    洛谷P1088火星人(stl/全排列)
    Codeforces Round #625 (Div. 2, based on Technocup 2020 Final Round) D. Navigation System(最短路)
    Codeforces Round #625 (Div. 2, based on Technocup 2020 Final Round) C. Remove Adjacent(贪心+暴力)
  • 原文地址:https://www.cnblogs.com/allenwas3/p/8241341.html
Copyright © 2020-2023  润新知