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

    请求-响应对示例:

  • 相关阅读:
    cs硕士妹子找工作经历【阿里人搜等互联网】
    EJB到底是什么,真的那么神秘吗??
    到底EJB是什么
    安全性测试:
    掌握 Promise 的逻辑方法
    VS2019 不能下载的解决办法
    Java8基础系列-Stream
    周期模型(典型的几种):
    软件生存周期及其模型是什么?
    试述软件的概念和特点?软件复用的含义?构件包括哪些?
  • 原文地址:https://www.cnblogs.com/allenwas3/p/8241341.html
Copyright © 2020-2023  润新知