zoukankan      html  css  js  c++  java
  • RPC实现的底层原理及应用

    摘要:RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。Hadoop的进程间交互都是通过RPC来进行的,比如Namenode与Datanode之间,Jobtracker与Tasktracker之间等。可以说:Hadoop的运行就是建立在RPC基础之上的。

    1.hadoop下载文件流程

    hadoop下载文件时,先请求NameNode,返回数据块与位置信息,再从DataNode对应位置取数据拼成完整文件。大致流程如下图:

    上图中,可以将Socket程序封装成一个工具框架,可以在任何地方调用,就不用为每个场景单独写程序了。这就是RPC机制。

    2.RPC具体过程

    RPC通信的过程如下:

    如上图,中间部分的细节经过封装,可以不用关心具体实现,服务端启动rpc server,客户端调用rpc get,如此两个业务类之间调用像本地一样,数据的封装用Socket协议直接封装在TCP报文中,效率更高。

    3.程序实现RPC调用

    定义通讯接口,在服务断和客户端进行通讯时必须同时实现这个接口,接口类代码如下:

    package WL.LearnHadoop.rpc;

    public interface LoginServiceInterface { public static final long versionID=1L; public String login(String username,String password); }

    服务端实现接口的类,代码如下:

    package WL.LearnHadoop.rpc;
    
    public class LoginServiceImpl implements LoginServiceInterface{
    	@Override
    	public String login(String username, String password) {
    		System.out.println("recept info:[username]:"+username+"    [password]:"+password);		
    		if(username.equals("test")&&password.equals("123"))	
    		    return "login in:"+username;
    		else 
    		    return "login error:"+ username ;
    	}
    }

    服务端发布服务供客户端调用,代码如下:

    package WL.LearnHadoop.rpc;
    
    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 ServerStart {
       public static void main(String[] args) throws HadoopIllegalArgumentException, IOException {
    	   Configuration conf=new Configuration();
    	   Builder builder= new RPC.Builder(conf);
    	   builder.setInstance(new LoginServiceImpl()).setBindAddress("192.168.10.11").setPort(10000).setProtocol(LoginServiceInterface.class);
    	   Server server=builder.build();
    	   server.start();   
       }
    }
    

    客户端向服务端发送请求并获取响应,代码如下:

    package WL.LearnHadoop.rpc;
    
    import java.io.IOException;
    import java.net.InetSocketAddress;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.ipc.RPC;
    
    public class LoginController {
        
    	public static void main(String[] args) throws IOException {
    		
    		Configuration conf=new Configuration();
    		LoginServiceInterface proxy = RPC.getProxy(LoginServiceInterface.class,1L , new InetSocketAddress("hadoop1",10000), conf);
    		String res=proxy.login("test", "123");
    		System.out.println(res);
    	}
    }
    

    代码中需引入hadoop的相关包,common包即可。将服务端代码打包RPCServer.jar,放到集群节点上,执行命令开启服务:

    java -jar RPCServer.jar
    

    客户端发送请求,这里在windows系统的eclipse启动程序,服务端类中判断用户名为test,密码为123才为成功:  

    请求参数为: test 1234  

      

    可以看到已经收到消息:登录失败。再次发送请求:

    这里看到接收消息,登录成功。服务端接收消息如下:

    在服务端可以看到客户端依次发来的请求。

  • 相关阅读:
    redis(二)高级用法
    redis(一) 安装以及基本数据类型操作
    RabbitMQ(五) -- topics
    JS实时数据运算
    Access数据库中Sum函数返回空值(Null)时如何设置为0
    asp检测数字类型函数
    MVC:从客户端中检测到有潜在危险的 Request.Form 值 的解决方法
    WIN8系统安装软件时提示"扩展属性不一致"的解决方法
    免费的网络扫描器-Advanced IP Scanner
    中国电信大亚DP607光猫破解,设置路由,wifi!关闭远程管理,改连接限制,SN码查询!
  • 原文地址:https://www.cnblogs.com/wonglu/p/5795420.html
Copyright © 2011-2022 走看看