转载请注明出处:http://blog.csdn.net/l1028386804/article/details/45922715
一、 RPC(remote procedure call)
不同java进程间的对象方法的调用。
一方称作服务端(server),一方称作客户端(client)。
server端提供对象,供客户端调用的,被调用的对象的方法的执行发生在server端。
RPC是hadoop框架运行的基础。
二、通过rpc小例子获得的认识
1.服务端提供的对象必须是一个接口,接口extends VersioinedProtocal
2.客户端能够的对象中的方法必须位于对象的接口中。
三、RPC实例
1、创建MyBiz接口,此接口继承hadoop中的VersionedProtocol接口
package com.lyz.hadoop.rpc; import org.apache.hadoop.ipc.VersionedProtocol; /** * 设置代理对象的返回值必须为接口类型 * 此接口用于接收RPC客户端创建代理对象的返回值 * @author liuyazhuang * */ public interface MyBiz extends VersionedProtocol{ /** * 定义的接口 * @param name * @return */ public String hello(String name); /** * 版本号 */ long VERSION = 1001; }
2、创建MyBiz接口的实现类MyBizImpl
package com.lyz.hadoop.rpc; import java.io.IOException; /** * MyBiz接口的实现类 * @author liuyazhuang * */ public class MyBizImpl implements MyBiz { @Override public long getProtocolVersion(String protocol, long clientVersion) throws IOException { return MyBiz.VERSION; } @Override public String hello(String name){ System.out.println("服务端被调用了"); return "hello "+name; } }
3、创建RPC服务端
package com.lyz.hadoop.rpc; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.ipc.RPC; import org.apache.hadoop.ipc.RPC.Server; /** * RPC服务端 * @author liuyazhuang * */ public class MyServer { public static final String SERVER_ADDRESS = "localhost"; public static final int SERVER_PORT = 12345; public static void main(String[] args) throws Exception { /** * 构造一个rpc server * @param instance:实例中的方法会被客户端调用 * @param bindAddress:绑定的地址用于监听连接 * @param port:绑定的端口用于监听连接 * @param conf:the Configuration to use */ Server server = RPC.getServer(new MyBizImpl(), SERVER_ADDRESS, SERVER_PORT, new Configuration()); server.start(); } }
4、创建RPC客户端
package com.lyz.hadoop.rpc; import java.net.InetSocketAddress; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.ipc.RPC; /** * RPC客户端 * @author liuyazhuang * */ public class MyClient { public static void main(String[] args) throws Exception { MyBiz proxy = (MyBiz) RPC.waitForProxy(MyBiz.class, MyBiz.VERSION, new InetSocketAddress(MyServer.SERVER_ADDRESS, MyServer.SERVER_PORT), new Configuration()); String result = proxy.hello("world"); System.out.println("客户端的调用结果为:"+result); RPC.stopProxy(proxy); } }
5、 注意:下图中1和2位置处的版本号必须相同
时间: 2024-10-11 05:43:09