7.hadoop RPC框架

一:RPC的百度百科

  RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
有多种 RPC模式和执行。最初由 Sun 公司提出。IETF ONC 宪章重新修订了 Sun 版本,使得 ONC RPC 协议成为 IETF 标准协议。现在使用最普遍的模式和执行是开放式软件基础的分布式计算环境(DCE)。
 
二:课程中谈到的RPC
 
  RPC是hadoop hdfs文件系统交流的底层机制,一种远程调用协议,与WebService有所不同,是集群内部的访问,而不是跨项目的服务。
  hdfs 利用 RPC来管理文件系统,客户端访问namenode,namenode通过RPC来返回相应信息,从而达到沟通的目的。
  
  原理图如下:
  

 

 

 

  
  

三、RPC框架的简单使用

  目的:在本机linux上有一个模拟登陆的程序,在我同事的linux服务器上有一个模拟登陆响应的服务。本机上只有controller层和service接口层。controller层用main方法代替,调用接口。而本机的接口访问同事的服务端,返回信息给我,我并且打印出来。

  本机的代码(client):

  

    package com.xws.rpcService;
    
    public interface RpcService {
        public static final long versionID=100L;
        public String login(String username,String password);
    }

 

package com.xws.rpcService;

import java.io.IOException;
import java.net.InetSocketAddress;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;

public class RpcClientController {
    /**
     * 客户端获取RPC代理访问远程服务器
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        //1.代理接口 2.双边版本号 3.服务器地址 4.conf对象
        RpcService serviceImpl = RPC.getProxy(RpcService.class, 100, new InetSocketAddress("linux-hadoop", 10000),new Configuration());
        String result = serviceImpl.login("wo", "123");
        System.out.println(result);
    }

}

 

  服务端的代码:

  

package com.xws.rpcService;
/**
 * 接口
 * @author root
 *
 */
public interface RpcService {
    public static final long versionID=100L;
    public String login(String username,String password);
}

 

 

package com.xws.rpcService;

import java.util.Date;
/*
 *实现类
 */
public class RpcServiceImpl implements RpcService{
    
    public String login(String username,String password){
        return "login successlly"+new Date().getTime();
    }
    
}

 

 

package com.xws.rpcService;

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;
public class RpcRunner {
    /**
     * 定义一个rpc服务器端,监听RpcService类
     * @param args
     * @throws IOException 
     * @throws HadoopIllegalArgumentException 
     */
    public static void main(String[] args) throws HadoopIllegalArgumentException, IOException {
        //创建一个Rpc builder对象
        Builder builder = new RPC.Builder(new Configuration());
        //builder属性设置
        builder.setBindAddress("linux-hadoop")//设置地址,本机名或者ip
        .setPort(10000)//服务端口
        .setProtocol(RpcService.class)//监听的服务接口
        .setInstance(new RpcServiceImpl());//接口的实现对象
        
        //创建一个service
        Server servier = builder.build();
        servier.start();
    }

}

 

 注意:如果客户端使用主机名来访问远程服务,那么你的本机必须有服务器主机IP和主机名的映射。

  

posted @ 2016-07-22 16:02  博智星  Views(166)  Comments(0)    收藏  举报