1. 程式人生 > >RPC遠端過程呼叫原理及模擬RPC的Demo

RPC遠端過程呼叫原理及模擬RPC的Demo

什麼是 RPC

由於各服務部署在不同機器,服務間的呼叫免不了網路通訊過程,服務消費方每呼叫一個服務都要寫一坨網路通訊相關的程式碼,不僅複雜而且極易出錯。

如果有一種方式能讓我們像呼叫本地服務一樣呼叫遠端服務,而讓呼叫者對網路通訊這些細節透明,那麼將大大提高生產力,比如服務消費方在執行helloWorldService.sayHello(“test”)時,實質上呼叫的是遠端的服務。這種方式其實就是RPC(Remote Procedure Call Protocol),在各大網際網路公司中被廣泛使用,如阿里巴巴的hsf、dubbo(開源)、Facebook的thrift(開源)、Google grpc(開源)、Twitter的finagle(開源)等。

RPC 是遠端過程呼叫(Remote Procedure Call)的縮寫形式,Birrell 和 Nelson 在 1984 發表於 ACM Transactions on Computer Systems 的論文《Implementing remote procedure calls》對 RPC 做了經典的詮釋。RPC 是指計算機 A 上的程序,呼叫另外一臺計算機 B 上的程序,其中 A 上的呼叫程序被掛起,而 B 上的被呼叫程序開始執行,當值返回給 A 時,A 程序繼續執行。呼叫方可以通過使用引數將資訊傳送給被呼叫方,而後可以通過傳回的結果得到資訊。而這一過程,對於開發人員來說是透明的。

模擬RPC

API介面

package com.xueqing.demo.test.rpc;

public interface Barty {

	public static final long versionID = 10010;
	
	public String sayHi(String name);
}

RPCServer

package com.xueqing.demo.test.rpc;

import java.io.IOException;

import org.apache.hadoop.HadoopIllegalArgumentException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.RPC.Server;

public class RPCServer implements Barty{

	public static void main(String[] args) throws HadoopIllegalArgumentException, IOException {
		Server server = new RPC.Builder(new Configuration())
			.setInstance(new RPCServer())
			.setBindAddress("192.168.8.100")
			.setPort(9527)
			.setProtocol(Barty.class)
			.build();
		server.start();

	}

	public String sayHi(String name) {
		// TODO Auto-generated method stub
		return "HI~" + name;
	}

}

RPCClient

package com.xueqing.demo.test.rpc;

import java.io.IOException;
import java.net.InetSocketAddress;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;

public class RPCClient {

	public static void main(String[] args) throws IOException {
		Barty proxy = RPC.getProxy(Barty.class, 10010,
				new InetSocketAddress("192.168.8.100", 9527), new Configuration());
		String sayHi = proxy.sayHi("tomcat");
		System.out.println(sayHi);
		
	}

}