直连同步调用

直连同步调用

直连调用不会经过服务发现、服务容错、负载均衡等中间过程,是一种直接与服务端建立连接并发送消息接收响应的一种调用方式。

同步调用适用于非频繁、执行时间不长的调用场景,了解更多

直连同步调用 API

以下是该组件对外提供的同步调用接口,你可以使用该接口进行同步调用。

public interface RemotingInvoker {

    /**
     * 同步调用
     * @param message
     * @param serverInformation
     * @throws RpcException
     */
    MessageResponseBody invoke(Message message, ServerInformation serverInformation) throws RpcException;

    //~
}

参数详解:

  1. message 参数:
参数名类型必选说明
commandenum消息类型,默认值 MESSAGE
namespacestring命名空间,查看详情
msgIdstring标识消息的唯一 id
bodyEncodingstring预留字段
bodybyte[]消息体
  1. serverInformation 参数:
参数名类型必选说明
addressenum服务端地址,例如:127.0.0.1
portint服务端端口,例如:80
onlineTimelong服务端上线时间
statusenum服务端状态
weightint服务端权重

使用示例

以下代码截取自 Open-Job 调度中心,是一个使用同步调用查看执行器上任务执行日志的栗子。

public JobLogResult catLog(Long jobId, String serverId) {
    ServerInformation serverInformation = getServerInformation(serverId);
    Message message = new Message();
    MessageBody messageBody = new MessageBody();
    messageBody.setJobId(jobId);
    messageBody.setCommand(CommandEnum.CAT_LOG.getValue());
    byte[] serializeData = SerializationUtils.serialize(messageBody);
    message.setBody(serializeData);

    MessageResponseBody response = null;
    try {
        response = remotingInvoker.invoke(message, serverInformation);
    } catch (RpcException ex) {
        throw new ServiceException(ex.getMessage());
    }

    if (response.getStatus() != ResponseStatus.SUCCESS) {
        throw new ServiceException(response.getMsg());
    }

    byte[] body = response.getBody();
    ResponseBody responseBody = SerializationUtils.deserialize(body, ResponseBody.class);
    JobLogResult logResult = JSON.parse(responseBody.getData(), JobLogResult.class);
    return logResult;
}