導入包:java
理解:rpc是一種「遠程過程調用協議」node
RPC採用客戶機/服務器模式。請求程序就是一個客戶機,而服務提供程序就是一個服務器。首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,而後等待應答信息。在服務器端,進程保持睡眠狀態直到調用信息到達爲止。當一個調用信息到達,服務器得到進程參數,計算結果,發送答覆信息,而後等待下一個調用信息,最後,客戶端調用進程接收答覆信息,得到進程結果,而後調用執行繼續進行。apache
具體使用:方面能夠理解爲,例如一個公司的後臺數據支持此公司多個平臺的使用,若是每一個平臺都寫一套調用邏輯,若是後臺邏輯作調整則每一個平臺都須要涉及;若是把各個平臺訪問後端的操做提早出來,放在服務端,來提供服務,則各個平臺均可以使用;而且對平臺開發也隱藏了後端。後端
開發注意:服務器
rpc服務端和rpc客戶端的通訊協議接口。服務端和客戶端都必須有,且路徑一致網絡
實例以下:socket
一:建兩個項目:oop
客戶端項目:democlient測試
服務器端項目:demonamenodeui
在服務器端和客戶端開發都須要建相同的接口:網絡通訊雙方都要遵循的協議
1>開發路徑一致;--hadoop.rpctest
2>名稱一致。 --DemoNamenodeProtocol.java
服務器端須要一個協議的實現類:例如DemoNamenodeImpl.java;
服務器端還須要把協議的實現發佈到RPC服務上
這裏測試實現:ServerPublisher.java
二:服務端項目實現後,須要 打包 Runnable JAR,並上傳到服務器上,
發佈: java -jar ***.jar
三:服務器端發佈後,則客戶端能夠調用此服務。
代碼實現附上:
---------------------------------------------------------------------start
自定義協議接口:DemoNamenodeProtocol
package hadoop.rpctest; /* * 接口定義網絡通訊雙方共同遵循的約定或協議 */ public interface DemoNamenodeProtocol { //定義通訊上方一致的版本號 public static final long versionID = 1L; //定義通訊雙方能夠調用的方法 public String getMetaData(String filePath); }
--------------------------------------------------------------end
---------------------------------------------------------------------start
服務器端 實現類:DemoNamenodeImpl
package hadoop.rpctest; public class DemoNamenodeImpl implements DemoNamenodeProtocol{ public String getMetaData(String filePath) { return filePath + "-----我給你開玩笑呢" ; } }
--------------------------------------------------------------end
---------------------------------------------------------------------start
服務發佈類:ServerPublisher
package hadoop.rpctest; 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.Builder; import org.apache.hadoop.ipc.RPC.Server; //用於把咱們定義的業務功能發佈爲rpc服務 public class ServerPublisher { public static void main(String[] args) throws HadoopIllegalArgumentException, IOException { // TODO Auto-generated method stub //獲取一個建立rpc服務的builder Builder builder = new RPC.Builder(new Configuration()); //經過Builder與我名定義的業務功能創建關係 //設置服務端服務實例實現的接口--及通訊雙方功能遵循的協議 builder.setProtocol(DemoNamenodeProtocol.class); //設置提供業務服務的具體實例對象 builder.setInstance(new DemoNamenodeImpl()); //設置服務進程所綁定的地址信息 builder.setBindAddress("hadoop02"); //設置服務進程的端口 builder.setPort(10000); //用builder來建立一個服務 (socket服務) Server server = builder.build(); //啓動服務,這樣就能夠被客戶端調用了 server.start(); } }
--------------------------------------------------------------end
客戶端訪問測試:DemoClient
package clienttest; import java.io.IOException; import java.net.InetSocketAddress; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.ipc.RPC; import hadoop.rpctest.DemoNamenodeProtocol; public class DemoClient { public static void main(String[] args) throws IOException { //客戶端訪問rpc服務器代碼實現 InetSocketAddress addr = new InetSocketAddress("hadoop02",10000); DemoNamenodeProtocol demoNamenodeImpl = RPC.getProxy(DemoNamenodeProtocol.class, 1L, addr, new Configuration()); String MetaData = demoNamenodeImpl.getMetaData("獲取RPC服務:hello world"); System.out.println(MetaData); } }