之前文章已经介绍过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方法中,任意类,甚至可以是上述接口实现类:
调用方(也可以称为客户端)也必须有和服务端一样的一个接口,代码一致,且所在包也需得一致(实测如果包名不一致的话,会报org.apache.hadoop.ipc.RpcServerException): Unknown protocol 异常):
LoginService接口:
public interface LoginService { public static final long versionID = 1L; public String login(String username, String password); }调用服务代码:
主要就是利用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。