RPC框架的最簡(jiǎn)單實(shí)現(xiàn)

一個(gè)最簡(jiǎn)單的RPC框架實(shí)現(xiàn)包含暴露服務(wù)、引用服務(wù)、Socket通訊三部分。

RPC框架簡(jiǎn)易實(shí)現(xiàn)

public class RpcFramework {

public static void exportService(final Object service, int port) throws Exception {

ServerSocket serverSocket = new ServerSocket(port);

while (true) {

final Socket socket = serverSocket.accept();

new Thread(new Runnable() {

@Override

public void run() {

ObjectInputStream reader = null;

ObjectOutputStream writer = null;

try {

reader = new ObjectInputStream(socket.getInputStream());

String methodName = reader.readUTF();

Class[] argumentsType = (Class[]) reader.readObject();

Object[] arguments = (Object[]) reader.readObject();

Method method = service.getClass().getMethod(methodName, argumentsType);

Object result = method.invoke(service, arguments);

writer = new ObjectOutputStream(socket.getOutputStream());

writer.writeObject(result);

} catch (Exception e) {

if (null != writer) {

try {

writer.writeObject(e);

} catch (IOException e1) {

e1.printStackTrace();

}

}

} finally {

if (null != writer) {

try {

writer.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (null != reader) {

try {

reader.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

}).start();

}

}

public static T referenceService(Class interfaceClass, final String host, final int port) {

return (T) Proxy.newProxyInstance(interfaceClass.getClassLoader(), new Class[]{interfaceClass}, new InvocationHandler() {

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

Socket socket = new Socket(host, port);

ObjectOutputStream writer = null;

ObjectInputStream reader = null;

try {

writer = new ObjectOutputStream(socket.getOutputStream());

writer.writeUTF(method.getName());

writer.writeObject(method.getParameterTypes());

writer.writeObject(args);

reader = new ObjectInputStream(socket.getInputStream());

return reader.readObject();

} finally {

if (null != writer) {

writer.close();

}

if (null != reader) {

reader.close();

}

}

}

});

}

}

接口

public interface HelloService {

String sayHello(String name);

}

public interface ByeService {

String sayBye(String name);

}

接口實(shí)現(xiàn)

public class HelloServiceImpl implements HelloService {

@Override

public String sayHello(String name) {

return name + " say hello";

}

}

public class ByeServiceImpl implements ByeService {

@Override

public String sayBye(String name) {

return name +" bye bye";

}

}

服務(wù)提供方

public class Provider {

public static void main(String[] args) throws Exception {

final HelloService helloService = new HelloServiceImpl();

new Thread(new Runnable() {

@Override

public void run() {

try {

RpcFramework.exportService(helloService, 20880);

} catch (Exception e) {

e.printStackTrace();

}

}

}).start();

final ByeService byeService = new ByeServiceImpl();

new Thread(new Runnable() {

@Override

public void run() {

try {

RpcFramework.exportService(byeService, 20881);

} catch (Exception e) {

e.printStackTrace();

}

}

}).start();

}

}

服務(wù)消費(fèi)方

public class Consumer {

public static void main(String[] args) {

HelloService helloService = RpcFramework.referenceService(HelloService.class, "127.0.0.1", 20880);

System.out.println(helloService.sayHello("tom"));

ByeService byeService = RpcFramework.referenceService(ByeService.class, "127.0.0.1", 20881);

System.out.println(byeService.sayBye("jack"));

}

}

輸出

tom say hello

jack bye bye

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容