[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程序。