Hadoop 中RPC使用

導入包: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);
}
}
相關文章
相關標籤/搜索