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);
}
}