Hadoop-rpc呼叫案例,服務端,客戶端程式碼案例
1. Hadoop-rpc框架
在hadoop中提供了一個rpc框架,通過這個rpc框架可以編寫一個rpc服務端程式,然後釋出出去供客戶端呼叫。
1.1.服務端程式碼
其中服務端(example-hadoop-rpc-server),其中程式碼結果如下:
程式碼說明:
ClientNamenodeProtocal | 介面定義 |
NameNode | 介面的實現 |
ServerPublisher | 用於釋出服務的類 |
若寫服務端程式碼,需要一個服務端的介面,其中介面如下:
package cn.toto.rpc.protocal; public interface ClientNamenodeProtocal { //為了保證客戶端和服務端的版本是一致的,如果沒有定義將報錯 public static final long versionID = 1L; public String getMetaData(String path); } |
介面的實現類是:
package cn.toto.rpc.server; import cn.toto.rpc.protocal.ClientNamenodeProtocal; public class NameNode implements ClientNamenodeProtocal { @Override public String getMetaData(String path) { return path + " 2 {BLK1,BLK2} {BLK1:min1,mini2} {BLK2:mini4,mini5}"; } } |
用於釋出的介面類:
package cn.toto.rpc.server; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.ipc.RPC; import import org.apache.hadoop.ipc.RPC.Server; import cn.toto.rpc.protocal.ClientNamenodeProtocal; public class ServerPublisher { public static void main(String[] args) throws Exception, IOException { Builder builder = new RPC.Builder(new Configuration()); //暴露的僅僅是ClientNamenodeProtocal.class中的new NameNode()實現的方法 builder.setBindAddress("localhost").setPort(8787) .setProtocol(ClientNamenodeProtocal.class) .setInstance(new NameNode()); //構建一個Server,並且啟動一下 Server server = builder.build(); server.start(); } } |
1.2.客戶端
寫完客戶端後,可以開始寫客戶端呼叫進行測試了。
客戶端的程式碼如下:
程式碼說明:
ClientNamenodeProtocal | 和服務端一樣的介面 |
HdfsClient | 用於呼叫的客戶端程式碼 |
介面程式碼如下:
package cn.toto.rpc.protocal; public interface ClientNamenodeProtocal { //為了保證客戶端和服務端的版本是一致的,如果沒有定義將報錯 public static final long versionID = 1L; public String getMetaData(String path); } |
客戶端程式碼:
package cn.toto.rpc.client; import java.io.IOException; import java.net.InetSocketAddress; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.ipc.RPC; import cn.toto.rpc.protocal.ClientNamenodeProtocal; public class HdfsClient { /** * 在使用這個之前,需要先啟動服務端 */ public static void main(String[] args) throws IOException { //通過這種方式獲取到一個遠端呼叫物件 ClientNamenodeProtocal nameNode = RPC.getProxy(ClientNamenodeProtocal.class, 1L, new InetSocketAddress("localhost",8787), new Configuration()); //呼叫服務端的介面,看看返回的結果 String metaData = nameNode.getMetaData("/a.doc"); System.out.println(metaData); } } |
輸出的結果: