Javaは簡単なRPC呼び出しを実現する(TCPプロトコルに基づく)
2777 ワード
SayHelloServiceインタフェース
SayHelloServiceImpl実装クラス
サービスプロダクション
コールエンド消費者
TCPプロトコルに基づいて実現されるRPCは、プロトコルフィールドを柔軟にカスタマイズし、ネットワーク伝送バイト数を減らし、ネットワークオーバーヘッドを低減し、性能を向上させ、より大きなスループットと同時数を実現することができる.しかし、下位層の複雑な詳細にもっと注目する必要があり、実現のコストが高く、定義されたプロトコル自体の限界のため、プラットフォームメーカーとオープンソースコミュニティのサポートを得ることが難しく、プラットフォーム間での呼び出しを実現することが難しい.
転載先:https://blog.51cto.com/shamrock/1743795
public interface SayHelloService {
public String sayHello(String arg);
}
SayHelloServiceImpl実装クラス
public class SayHelloServiceImpl implements SayHelloService{
@Override
public String sayHello(String arg) {
return "Hello " + arg;
}
}
サービスプロダクション
public class Provider {
public static void main(String[] args) {
try {
ServerSocket server= new ServerSocket(10808);
while (true) {
Socket socket = server.accept();
//
ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream());
String interfaceName = inputStream.readUTF();//
String methodName = inputStream.readUTF();//
Class>[] parameterTypes = (Class>[]) inputStream.readObject();//
Object[] parameters = (Object[]) inputStream.readObject();//
Class serviceInterfaceClass = Class.forName(interfaceName);
// Object service = services.get(interfaceName);
// services Map , interfaceName
Object service = new SayHelloServiceImpl();// new
//
Method method = serviceInterfaceClass.getMethod(methodName, parameterTypes);
Object result = method.invoke(service, parameters);
ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream());
//
outputStream.writeObject(result);
System.out.println("Parameters from comsumer: " + parameters);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
// ...
}
}
}
コールエンド消費者
public class Consumer {
public static void main(String[] args) {
//
String interfaceName = SayHelloService.class.getName();
try {
//
Method method = SayHelloService.class.getMethod("sayHello", java.lang.String.class);
//
Object[] agrs = {"world"};
Socket socket = new Socket("127.0.0.1", 10808);
//
ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream());
outputStream.writeUTF(interfaceName);//
outputStream.writeUTF(method.getName());//
outputStream.writeObject(method.getParameterTypes());
outputStream.writeObject(agrs);
//
ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream());
Object result = inputStream.readObject();
System.out.println("Consumer result:" + result);
} catch (Exception e) {
e.printStackTrace();
}finally{
// ...
}
}
}
TCPプロトコルに基づいて実現されるRPCは、プロトコルフィールドを柔軟にカスタマイズし、ネットワーク伝送バイト数を減らし、ネットワークオーバーヘッドを低減し、性能を向上させ、より大きなスループットと同時数を実現することができる.しかし、下位層の複雑な詳細にもっと注目する必要があり、実現のコストが高く、定義されたプロトコル自体の限界のため、プラットフォームメーカーとオープンソースコミュニティのサポートを得ることが難しく、プラットフォーム間での呼び出しを実現することが難しい.
転載先:https://blog.51cto.com/shamrock/1743795