大数据-RPC框架

RPC框架

RPC,远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,不需要了解底层网络技术的协议。RPC使得程序能够像访问本地系统资源一样,去访问远端系统资源。简单来说,RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的另一个函数或方法(统称为服务)并得到返回的结果

基本的RPC框架主要由客户端客户端存根服务端存根服务器端四个组成

客户端:服务调用方

客户端存根:存放服务端地址信息,将客户端的请求参数数据信息打包成网络信息,再通过网络传输发送给服务端

服务端存根:接受客户端发送过来的请求消息进行解包,然后再调用本地服务进行处理

服务端:服务的真正提供者

在这里插入图片描述
在这里插入图片描述

(1)服务消费者(client客户端)通过调用本地服务的方式调用需要消费的服务

(2)客户端存根(client stub)接收到调用请求后负责将方法、入参等信息序列化(组装)成能够进行网络传输的消息体

(3)客户端存根(client stub)找到远程的服务地址,并且将消息通过网络发送给服务端

(4)服务端存根(server stub)收到消息后进行解码(反序列化操作)

(5)服务端存根(server stub)根据解码结果调用本地的服务进行相关处理

(6)本地服务执行具体业务逻辑并将处理结果返回给服务端存根(server stub)

(7)服务端存根(server stub)将返回结果重新打包成消息(序列化)并通过网络发送至消费方

(8)客户端存根(client stub)接收到消息,并进行解码(反序列化)

(9)服务消费方得到最终结果

RPCProtocol接口

package com.Protocol.util;

import org.apache.hadoop.ipc.VersionedProtocol;

/*
 * @author Administrator
 * @version 1.0
 */
public interface  RPCProtocol extends VersionedProtocol {
    //定义RPC协议的ID
    public static final long versionID = 1L;
    //定义接口方法
    public String helloWorld(String name);
}

MyNameNode类

package com.Server.util;

import com.Protocol.util.RPCProtocol;
import org.apache.hadoop.ipc.ProtocolSignature;

import java.io.IOException;

/*
 * @author Administrator
 * @version 1.0
 */
public class MyNameNode implements RPCProtocol {
    public String helloWorld(String name) {
        return "Hello! " + name;
    }

    public long getProtocolVersion(String s, long l) throws IOException {
        return RPCProtocol.versionID;
    }

    public ProtocolSignature getProtocolSignature(String s, long l, int i) throws IOException {
        return new ProtocolSignature(RPCProtocol.versionID, null);
    }
}

MyRPCServer类

package com.Server.util;

import com.Protocol.util.RPCProtocol;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;

import java.io.IOException;

/*
 * @author Administrator
 * @version 1.0
 */
public class MyRPCServer {
    public static void main(String[] args) throws IOException {
        //构建RPC框架
        RPC.Builder builder = new RPC.Builder(new Configuration());
        //绑定地址
        builder.setBindAddress("localhost");
        //绑定端口
        builder.setPort(8080);
        //绑定协议
        builder.setProtocol(RPCProtocol.class);
        //调用协议的实现类对象
        builder.setInstance(new MyNameNode());
        //创建服务
        RPC.Server server = builder.build();
        //启动服务
        server.start();
    }
}

MyRPCClient类

package com.Client.util;

import com.Protocol.util.RPCProtocol;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;

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

/*
 * @author Administrator
 * @version 1.0
 */
public class MyRPCClient {
    public static void main(String[] args) throws IOException {
        //获取RPC协议调用Server
        RPCProtocol proxy = RPC.getProxy(RPCProtocol.class, RPCProtocol.versionID, new InetSocketAddress("localhost", 8080), new Configuration());
        //发送请求
        String message = proxy.helloWorld("Jabin");
        //输出信息
        System.out.println(message);
    }
}

猜你喜欢

转载自blog.csdn.net/JavaDestiny/article/details/87908379
今日推荐