Hadoop的RPC框架

项目一:作为服务端:
在这里插入图片描述

ClientNamenodeProtocol 这是一个接口,相当于是调用RPC之间的协议

package com.thp.bigdata.protocol;

public interface ClientNamenodeProtocol {
    public static final long versionID = 1L;   // 会读取这个版本号,可以和客户端的不一样, 没有校验
	public String getMetaData(String path);
}

MyNameNode : 是实现类:

package com.thp.bigdata.server;

import com.thp.bigdata.protocol.ClientNamenodeProtocol;

public class MyNameNode implements ClientNamenodeProtocol {
	// 模拟namenode的业务方法之一:查询元数据
	@Override
	public String getMetaData(String path) {
		return path + " 3- {BLK_1,BLK_2} ... ";
	}
}

PublishServiceUtil 服务端的启动程序:

package com.thp.bigdata.start;

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;

import com.thp.bigdata.protocol.ClientNamenodeProtocol;
import com.thp.bigdata.server.MyNameNode;

/**
 * 启动rpc的服务端
 * @author 汤小萌
 *
 */
public class PublishServiceUtil {
	public static void main(String[] args) throws HadoopIllegalArgumentException, IOException {
		Builder builder = new RPC.Builder(new Configuration());
		builder.setBindAddress("localhost")
		.setPort(8888)
		.setProtocol(ClientNamenodeProtocol.class)
		.setInstance(new MyNameNode());
		Server server = builder.build();
		server.start();
		
	}
}

服务端工程:
在这里插入图片描述

ClientNamenodeProtocol 这个接口就是协议,是跟服务端工程的接口完全一致,包名也要一样.
MyHdfsClient 是 客户端启动的程序:

package com.thp.bigdata.client;

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

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;

import com.thp.bigdata.protocol.ClientNamenodeProtocol;

public class MyHdfsClient {
	public static void main(String[] args) throws IOException {
		ClientNamenodeProtocol namenodeProxy = RPC.getProxy(ClientNamenodeProtocol.class, 1L, new InetSocketAddress("localhost",8888), new Configuration());
		System.out.println("==================");
		System.out.println(namenodeProxy.getClass());
		System.out.println("==================");
		String metaData = namenodeProxy.getMetaData("/llp.txt");
		System.out.println("调用RPC返回的数据 : " + metaData);
		
	}
}

返回的namenodeProxy 其实是RPC框架生成的一个代理对象,当客户端需要调用服务端的方法时,服务端会更新实现类生成一个对象然后传输给客户端.

猜你喜欢

转载自blog.csdn.net/qq_38200548/article/details/83240499