Javaは簡単なRPC呼び出しを実現する(TCPプロトコルに基づく)

2777 ワード

SayHelloServiceインタフェース
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