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

    请求-响应对示例:

  • 相关阅读:
    穷举、迭代、以及while代替for循环的使用
    for循环与for循环嵌套
    day07 数据类型补充
    day06
    day05
    day04
    python2 和 python3 的区别
    day03
    第一周笔记
    day02笔记
  • 原文地址:https://www.cnblogs.com/allenwas3/p/8241341.html
Copyright © 2020-2023  润新知