Hadoop的RPC实现

之前文章已经介绍过RPC及一个RPC框架Thrift,现在再介绍一下Hadoop的RPC实现。

被调用方(也可称为服务端)的业务代码中必须有一个接口,而业务的具体实现写在 此接口的实现类中(jdk的动态代理必须要有接口的),而通过org.apache.hadoop.ipc.RPC(在hadoop-common-2.2.0.jar包中)的一系列方法来发布服务供调用方调用:

LoginService接口

    public interface LoginService {  
        public static final long versionID = 1L;  
      
        public String login(String username, String password);  
    }  


注意,接口中要指定静态的、final的成员变量versionID,否则到时候客户端调用的时候会报异常。

接口实现类LoginServiceImpl:

    public class LoginServiceImpl implements LoginService {  
      
        public String login(String username, String password) {  
            return username + " logged in successfully";  
        }  
    }  


接口实现类只需重写接口的方法。

启动服务的代码,需要写在某个类的main方法中,任意类,甚至可以是上述接口实现类:

    public static void main(String[] args) throws HadoopIllegalArgumentException, IOException {  
            Builder builder = new RPC.Builder(new Configuration());  
            builder.setBindAddress("192.168.1.6").setPort(10000).setProtocol(LoginService.class)  
                    .setInstance(new LoginServiceImpl());  
            builder.build().start();  
        }  


首先是创建了一个org.apache.hadoop.ipc.RPC的内部类Builder的实例(构造方法Builder(Configuration config),此Configuration类是org.apache.hadoop.conf.Configuration,也在hadoop-common.jar包中,此处只需new出来一个Configuration对象即可),然后用这个实例设置一些必须的属性(socket通信的服务端设置的属性),有ip地址、端口号、协议(这里的协议指的就是接口)、接口实例(即接口实现类对象)。最后,调用Builder实例的build()方法得到org.apache.hadoop.ipc.RPC.Server对象,调动该Server对象的start()方法即启动了服务,或者说是发布了服务。

调用方(也可以称为客户端)也必须有和服务端一样的一个接口,代码一致,且所在包也需得一致(实测如果包名不一致的话,会报org.apache.hadoop.ipc.RpcServerException): Unknown protocol 异常):

LoginService接口:

    public interface LoginService {  
        public static final long versionID = 1L;  
      
        public String login(String username, String password);  
    }  
调用服务代码:
    @Test  
        public void test1() throws IOException {  
            LoginService proxy = RPC.getProxy(LoginService.class, 1L, new InetSocketAddress("192.168.1.6", 10000),  
                    new Configuration());  
            String result = proxy.login("yangmi", "123");  
            System.out.println(result);  
        }  


主要就是利用org.apache.hadoop.ipc.RPC的getProxy(Class<T> protocol,long clientVersion,InetSocketAddress addr, Configuration conf)方法(此方法里的protocol也就是接口,clientVersion也就是接口代码中配置的versionID的值,InetSocketAddress实例可以通过InetSocketAddress(String hostname, int port)构造器new出来。)获得接口对象(其实是个代理对象),然后调用此对象的业务方法的效果就等同于直接调服务端业务方法的效果一样。至此,就完成了Hadoop的RPC。


原文地址:http://blog.csdn.net/koushr/article/details/51391859

猜你喜欢

转载自blog.csdn.net/amaxiaochen/article/details/78620102