简单的手写RPC
基本流程
实现代码
1. 创建Rpc Client
public class RpcClient {
public static void main ( String[ ] args) {
User user = ( User) getProxy ( User. class ) ;
Object result= user. findbyId ( 19 L) ;
System. out. println ( result) ;
}
static class RpcHandler implements InvocationHandler {
String interfaceInfoName;
public RpcHandler ( String interfaceInfoName) {
this . interfaceInfoName = interfaceInfoName;
}
public Object invoke ( Object proxy, Method method, Object[ ] args) throws Throwable {
Socket socket= new Socket ( "127.0.0.1" , 2020 ) ;
OutputStream outputStream= socket. getOutputStream ( ) ;
ObjectOutputStream objectOutputStream= new ObjectOutputStream ( outputStream) ;
InputStream inputStream= socket. getInputStream ( ) ;
ObjectInputStream objectInputStream= new ObjectInputStream ( inputStream) ;
objectOutputStream. writeUTF ( interfaceInfoName) ;
objectOutputStream. writeUTF ( method. getName ( ) ) ;
objectOutputStream. writeObject ( method. getParameterTypes ( ) ) ;
objectOutputStream. writeObject ( args) ;
Object result= objectInputStream. readObject ( ) ;
return result;
}
}
public static Object getProxy ( Class interfaceInfo ) {
return Proxy. newProxyInstance (
interfaceInfo. getClassLoader ( ) ,
new Class [ ] { interfaceInfo} ,
new RpcHandler ( interfaceInfo. getName ( ) ) ) ;
}
}
2. 创建Rpc Server
public class RpcServer {
public static void main ( String[ ] args) throws Exception {
ServerSocket serverSocket= new ServerSocket ( 2020 ) ;
System. out. println ( "start" ) ;
while ( true ) {
Socket socket= serverSocket. accept ( ) ;
ObjectInputStream objectInputStream= new ObjectInputStream ( socket. getInputStream ( ) ) ;
ObjectOutputStream objectOutputStream= new ObjectOutputStream ( socket. getOutputStream ( ) ) ;
String interfaceName= objectInputStream. readUTF ( ) ;
String MethodName= objectInputStream. readUTF ( ) ;
Class[ ] ParameterType= ( Class[ ] ) objectInputStream. readObject ( ) ;
Object[ ] Args= ( Object[ ] ) objectInputStream. readObject ( ) ;
System. out. println ( interfaceName) ;
Class impelClass = UserImpl. class ;
Object object= impelClass. newInstance ( ) ;
Method method = impelClass. getMethod ( MethodName, ParameterType) ;
Object result= method. invoke ( object, Args) ;
objectOutputStream. writeObject ( result) ;
objectInputStream. close ( ) ;
objectOutputStream. close ( ) ;
}
}
}
最后结果
RPC Client控制台
RPC Server控制台