RPC遠端過程呼叫原理及模擬RPC的Demo
阿新 • • 發佈:2019-02-07
什麼是 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);
}
}