java怎么拦截某个对象
274
2022-11-20
Hadoop之——RPC通信实例
一、 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位置处的版本号必须相同
注意:调用方(也可以称为客户端)也必须有和服务端一样的一个接口,代码一致,且所在包也需得一致(实测如果包名不一致的话,会报org.apache.hadoop.ipc.RpcServerException): Unknown protocol 异常)
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~