利用Hadoop提供的RPC API實現簡單的RPC程序
阿新 • • 發佈:2018-03-01
Hadoop RPC Java [toc]
利用Hadoop提供的RPC API實現簡單的RPC程序
在Hadoop中提供了RPC服務的使用API,通過其API地使用,可以非常簡單地構建遠程過程調用程序,下面就給出一個簡單的實例。
項目結構
為了方便操作,所有的代碼都放在本地一個項目中,實際上,完全可以將代碼放在不同的服務器上,這是RPC的概念,這裏就不做過多的介紹。
項目結構如下:
rpc/
├── HelloServiceImpl.java
├── IHelloService.java
├── RPCClientDriver.java
└── RPCServerDriver.java
程序代碼
這裏只是做一個簡單的示例,並且代碼中也給出了非常詳細的註釋,所以直接給出程序代碼。
IHelloService.java
package com.uplooking.bigdata.rpc; import org.apache.hadoop.ipc.VersionedProtocol; /** * 接口 * 要想使用hadoop提供的RPC服務,必須要繼承VersionedProtocol */ public interface IHelloService extends VersionedProtocol { public long versionID = 1L; public String sayHi(String name); public String hearBeat(String beat); }
HelloServiceImpl.java
package com.uplooking.bigdata.rpc; import org.apache.hadoop.ipc.ProtocolSignature; import java.io.IOException; /** * HelloService服務實現類 */ public class HelloServiceImpl implements IHelloService { public String sayHi(String name) { System.out.println("name..." + name); return "Hi, " + name; } public String hearBeat(String beat) { System.out.println("----heartbeat----" + beat); return System.currentTimeMillis() + "--->" + beat; } public long getProtocolVersion(String protocol, long clientVersion) throws IOException { return versionID; } public ProtocolSignature getProtocolSignature(String protocol, long clientVersion, int clientMethodsHash) throws IOException { return new ProtocolSignature(); } }
RPCServerDriver.java
package com.uplooking.bigdata.rpc;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import java.io.IOException;
/**
* RPC服務端程序,啟動並發布服務
*/
public class RPCServerDriver {
public static void main(String[] args) throws IOException {
// 創建RPC的配置
Configuration configuration = new Configuration();
// 構建RPC的builder對象
RPC.Builder builder = new RPC.Builder(configuration);
// 設置RPC Server的信息,返回一個server對象
RPC.Server server = builder.setBindAddress("localhost")
.setPort(4893)
.setProtocol(IHelloService.class)
.setInstance(new HelloServiceImpl())
.build();
// 啟動RPC Server
// 這是一個守護進程,所以main函數不會退出
server.start();
System.out.println("---服務啟動了---");
}
}
RPCClientDriver.java
package com.uplooking.bigdata.rpc;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
/**
* RPC客戶端程序
*/
public class RPCClientDriver {
public static void main(String[] args) throws IOException {
// 構建InetSocketAddress對象
InetSocketAddress address = new InetSocketAddress(InetAddress.getByName("localhost"), 4893);
// 通過RPC.getProxy方法獲得代理對象
/**
* @param protocol 接口的類型對象
* @param clientVersion 版本號
* @param addr 服務端地址
* @param conf 配置信息
*/
IHelloService helloServiceProxy = RPC.getProxy(IHelloService.class, IHelloService.versionID, address, new Configuration());
String result = helloServiceProxy.sayHi("小秋田");
System.out.println(result);
}
}
測試
啟動RPCServerDriver,輸出如下:
---服務啟動了---
啟動RPCClicentDriver,輸出如下:
Hi, 小秋田
此時再查看服務端的輸出:
---服務啟動了---
name...小秋田
這樣的話,通過使用Hadoop提供的RPC API,就實現了一個簡單的RPC程序。
利用Hadoop提供的RPC API實現簡單的RPC程序