Java實現簡單的RPC調用(基於TCP協議)

SayHelloService接口
java

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 {
			//關閉資源...
		}
	}
}


調用端  消費者socket

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,能靈活地對協議字段進行定製,減小網絡傳輸字節數,下降網絡開銷,提升性能,實現更大的吞吐量和併發數。可是須要更多地關注底層複雜的細節,實現的代價更高,且因爲所定義協議自身的侷限性,難以獲得平臺廠商和開源社區的支持,較難實現跨平臺的調用。
ide

相關文章
相關標籤/搜索