SocketRpcClient.java 2.1 KB
Newer Older
S
shuang.kou 已提交
1
package github.javaguide.transport.socket;
2 3

import github.javaguide.dto.RpcRequest;
4 5
import github.javaguide.dto.RpcResponse;
import github.javaguide.exception.RpcException;
6 7
import github.javaguide.registry.ServiceRegistry;
import github.javaguide.registry.ZkServiceRegistry;
S
shuang.kou 已提交
8
import github.javaguide.transport.ClientTransport;
9
import github.javaguide.utils.checker.RpcMessageChecker;
S
shuang.kou 已提交
10
import lombok.AllArgsConstructor;
11 12 13 14 15 16
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
17
import java.net.InetSocketAddress;
18 19 20
import java.net.Socket;

/**
21 22
 * 基于 Socket 传输 RpcRequest
 *
23 24 25
 * @author shuang.kou
 * @createTime 2020年05月10日 18:40:00
 */
S
shuang.kou 已提交
26
@AllArgsConstructor
S
shuang.kou 已提交
27
public class SocketRpcClient implements ClientTransport {
S
shuang.kou 已提交
28
    private static final Logger logger = LoggerFactory.getLogger(SocketRpcClient.class);
29 30 31 32 33
    private final ServiceRegistry serviceRegistry;

    public SocketRpcClient() {
        this.serviceRegistry = new ZkServiceRegistry();
    }
34

S
shuang.kou 已提交
35 36
    @Override
    public Object sendRpcRequest(RpcRequest rpcRequest) {
37 38 39
        InetSocketAddress inetSocketAddress = serviceRegistry.lookupService(rpcRequest.getInterfaceName());
        try (Socket socket = new Socket()) {
            socket.connect(inetSocketAddress);
40
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
41
            // 通过输出流发送数据到服务端
42 43
            objectOutputStream.writeObject(rpcRequest);
            ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
44
            //从输入流中读取出 RpcResponse
45
            RpcResponse rpcResponse = (RpcResponse) objectInputStream.readObject();
46 47
            //校验 RpcResponse 和 RpcRequest
            RpcMessageChecker.check(rpcResponse, rpcRequest);
48
            return rpcResponse.getData();
49
        } catch (IOException | ClassNotFoundException e) {
S
shuang.kou 已提交
50
            logger.error("occur exception when send sendRpcRequest");
51
            throw new RpcException("调用服务失败:", e);
52 53 54
        }
    }
}