Skip to content

Commit

Permalink
[v1.0] 增加了一些错误类型和提示
Browse files Browse the repository at this point in the history
  • Loading branch information
CN-GuoZiyang committed Jun 17, 2020
1 parent 8b602c3 commit 0a6d7ec
Show file tree
Hide file tree
Showing 8 changed files with 85 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ public enum ResponseCode {

SUCCESS(200,"调用方法成功"),
FAIL(500,"调用方法失败"),
NOT_FOUND_METHOD(500,"未找到指定方法"),
NOT_FOUND_CLASS(500,"未找到指定类");
METHOD_NOT_FOUND(500,"未找到指定方法"),
CLASS_NOT_FOUND(500,"未找到指定类");

private final int code;
private final String message;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package top.guoziyang.rpc.enumeration;

import lombok.AllArgsConstructor;
import lombok.Getter;

/**
* @author ziyang
*/
@AllArgsConstructor
@Getter
public enum RpcError {

SERVICE_INVOCATION_FAILURE("服务调用出现失败"),
SERVICE_CAN_NOT_BE_NULL("注册的服务不得为空");

private final String message;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package top.guoziyang.rpc.exception;

import top.guoziyang.rpc.enumeration.RpcError;

/**
* @author ziyang
*/
public class RpcException extends RuntimeException {

public RpcException(RpcError error, String detail) {
super(error.getMessage() + ": " + detail);
}

public RpcException(String message, Throwable cause) {
super(message, cause);
}

public RpcException(RpcError error) {
super(error.getMessage());
}

}
17 changes: 15 additions & 2 deletions rpc-core/src/main/java/top/guoziyang/rpc/client/RpcClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import top.guoziyang.rpc.entity.RpcRequest;
import top.guoziyang.rpc.entity.RpcResponse;
import top.guoziyang.rpc.enumeration.ResponseCode;
import top.guoziyang.rpc.enumeration.RpcError;
import top.guoziyang.rpc.exception.RpcException;

import java.io.IOException;
import java.io.ObjectInputStream;
Expand All @@ -23,10 +27,19 @@ public Object sendRequest(RpcRequest rpcRequest, String host, int port) {
ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
objectOutputStream.writeObject(rpcRequest);
objectOutputStream.flush();
return objectInputStream.readObject();
RpcResponse rpcResponse = (RpcResponse) objectInputStream.readObject();
if(rpcResponse == null) {
logger.error("服务调用失败,service:{}", rpcRequest.getInterfaceName());
throw new RpcException(RpcError.SERVICE_INVOCATION_FAILURE, " service:" + rpcRequest.getInterfaceName());
}
if(rpcResponse.getStatusCode() == null || rpcResponse.getStatusCode() != ResponseCode.SUCCESS.getCode()) {
logger.error("调用服务失败, service: {}, response:{}", rpcRequest.getInterfaceName(), rpcResponse);
throw new RpcException(RpcError.SERVICE_INVOCATION_FAILURE, " service:" + rpcRequest.getInterfaceName());
}
return rpcResponse.getData();
} catch (IOException | ClassNotFoundException e) {
logger.error("调用时有错误发生:", e);
return null;
throw new RpcException("服务调用失败: ", e);
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package top.guoziyang.rpc.client;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import top.guoziyang.rpc.entity.RpcRequest;
import top.guoziyang.rpc.entity.RpcResponse;

Expand All @@ -13,6 +15,7 @@
*/
public class RpcClientProxy implements InvocationHandler {

private static final Logger logger = LoggerFactory.getLogger(RpcClientProxy.class);
private String host;
private int port;

Expand All @@ -28,13 +31,14 @@ public <T> T getProxy(Class<T> clazz) {

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
logger.info("调用方法: {}#{}", method.getDeclaringClass().getName(), method.getName());
RpcRequest rpcRequest = RpcRequest.builder()
.interfaceName(method.getDeclaringClass().getName())
.methodName(method.getName())
.parameters(args)
.paramTypes(method.getParameterTypes())
.build();
RpcClient rpcClient = new RpcClient();
return ((RpcResponse) rpcClient.sendRequest(rpcRequest, host, port)).getData();
return rpcClient.sendRequest(rpcRequest, host, port);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import org.slf4j.LoggerFactory;
import top.guoziyang.rpc.entity.RpcRequest;
import top.guoziyang.rpc.entity.RpcResponse;
import top.guoziyang.rpc.enumeration.ResponseCode;

import java.io.IOException;
import java.io.ObjectInputStream;
Expand All @@ -16,14 +17,14 @@
* 实际进行过程调用的工作线程
* @author ziyang
*/
public class WorkerThread implements Runnable {
public class RequestHandler implements Runnable {

private static final Logger logger = LoggerFactory.getLogger(WorkerThread.class);
private static final Logger logger = LoggerFactory.getLogger(RequestHandler.class);

private Socket socket;
private Object service;

public WorkerThread(Socket socket, Object service) {
public RequestHandler(Socket socket, Object service) {
this.socket = socket;
this.service = service;
}
Expand All @@ -33,13 +34,26 @@ public void run() {
try (ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream())) {
RpcRequest rpcRequest = (RpcRequest) objectInputStream.readObject();
Method method = service.getClass().getMethod(rpcRequest.getMethodName(), rpcRequest.getParamTypes());
Object returnObject = method.invoke(service, rpcRequest.getParameters());
Object returnObject = invokeMethod(rpcRequest);
objectOutputStream.writeObject(RpcResponse.success(returnObject));
objectOutputStream.flush();
} catch (IOException | ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
} catch (IOException | ClassNotFoundException | IllegalAccessException | InvocationTargetException e) {
logger.error("调用或发送时有错误发生:", e);
}
}

private Object invokeMethod(RpcRequest rpcRequest) throws IllegalAccessException, InvocationTargetException, ClassNotFoundException {
Class<?> clazz = Class.forName(rpcRequest.getInterfaceName());
if(!clazz.isAssignableFrom(service.getClass())) {
return RpcResponse.fail(ResponseCode.CLASS_NOT_FOUND);
}
Method method;
try {
method = service.getClass().getMethod(rpcRequest.getMethodName(), rpcRequest.getParamTypes());
} catch (NoSuchMethodException e) {
return RpcResponse.fail(ResponseCode.METHOD_NOT_FOUND);
}
return method.invoke(service, rpcRequest.getParameters());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ public void register(Object service, int port) {
logger.info("服务器正在启动...");
Socket socket;
while((socket = serverSocket.accept()) != null) {
logger.info("客户端连接!Ip为:" + socket.getInetAddress());
threadPool.execute(new WorkerThread(socket, service));
logger.info("客户端连接!Ip为:" + socket.getInetAddress() + ":" + socket.getPort());
threadPool.execute(new RequestHandler(socket, service));
}
} catch (IOException e) {
logger.error("连接时有错误发生:", e);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public class HelloServiceImpl implements HelloService {
@Override
public String hello(HelloObject object) {
logger.info("接收到:{}", object.getMessage());
return "这是掉用的返回值,id=" + object.getId();
return "这是调用的返回值,id=" + object.getId();
}

}

0 comments on commit 0a6d7ec

Please sign in to comment.