本文共 3343 字,大约阅读时间需要 11 分钟。
[toc]
在Hadoop中提供了RPC服务的使用API,通过其API地使用,可以非常简单地构建远程过程调用程序,下面就给出一个简单的实例。
为了方便操作,所有的代码都放在本地一个项目中,实际上,完全可以将代码放在不同的服务器上,这是RPC的概念,这里就不做过多的介绍。
项目结构如下:rpc/├── HelloServiceImpl.java├── IHelloService.java├── RPCClientDriver.java└── RPCServerDriver.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);}
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(); }}
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("---服务启动了---"); }}
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程序。
转载于:https://blog.51cto.com/xpleaf/2074362