基於Hadoop的RPC原理實現
阿新 • • 發佈:2018-12-21
上一篇文章簡單的講解了一下RPC的概念和原理
簡單來說就是一臺機器上的應用想呼叫另一臺機器上的函式或者方法,由於不在同一個記憶體空間中,所以不能直接呼叫,要使用RPC協議來呼叫
下邊就來基於Hadoop來實現RPC呼叫
1.加入Hadoop的依賴包
<repositories> <repository> <id>cloudera</id> <url>http://repository.cloudera.com/artifactory/cloudera-repos</url> </repository> </repositories> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.5.0-cdh5.3.6</version> </dependency>
如果是CDH版本的Hadoop,需要加入repository,如果是apache版本的則不需要
2.建立伺服器端
UserServer介面:
package cn.ysjh.drpc;
public interface UserService {
public static final long versionID=8888;
public void addUser(String name,int age);
}
UserServerImpl實現類:
package cn.ysjh.drpc; public class UserServerImpl implements UserService { @Override public void addUser(String name, int age) { System.out.println("姓名:"+name+" "+"年齡"+age); } }
ServerRPC伺服器端程式碼:
package cn.ysjh.drpc; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.ipc.RPC; /* RPC服務 */ public class ServerRPC { public static void main(String[] args) throws Exception{ Configuration configuration = new Configuration(); RPC.Builder builder = new RPC.Builder(configuration); RPC.Server server = builder.setProtocol(UserService.class) .setInstance(new UserServiceImpl()) .setBindAddress("localhost") .setPort(9999) .build(); server.start(); } }
3.實現Client端
package cn.ysjh.drpc;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import java.io.IOException;
import java.net.InetSocketAddress;
/*
客戶端
*/
public class UserClient {
public static void main(String[] args) throws IOException {
Configuration configuration = new Configuration();
long clientVersion=8888;
UserService proxy = RPC.getProxy(UserService.class, clientVersion, new InetSocketAddress("localhost", 9999), configuration);
proxy.addUser("lisi",22);
System.out.println("新增成功");
}
}
4.執行程式碼
先執行伺服器端程式碼,然後執行client端程式碼
只要client端有請求,server端的方法就會被呼叫