RPC调用远程服务

来源:互联网 发布:nginx配置文件server 编辑:程序博客网 时间:2024/05/16 17:30

RPC(Remote Procedure Call Protocol,远程过程调用协议),可以使本机像调用本地类一样调用远程服务,只需要提供一个接口给调用端,就可以使用RPC工具类拿到远程服务代理,进而调用远程服务(发布的RPC服务)。关于RPC的具体介绍可以参见知乎上的回答(https://www.zhihu.com/question/25536695),本文仅介绍怎么使用Hadoop中的RPC工具类来实现RPC的远程过程调用。

以下是远端代码:

package sempp.lsl.hadoop.rpc;/** * Remote interface 远程服务接口设计 * @author lsl */public interface LoginServiceInterface {    public static final long versionID=1L;    public String login(String userName,String passWord);}

package sempp.lsl.hadoop.rpc;public class LoginServiceImpl implements LoginServiceInterface {/** * Remote Procedure 远程服务接口的具体实现 */public String login(String userName, String passWord) {return userName +" login success";}}

package sempp.lsl.hadoop.rpc;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.ipc.RPC;import org.apache.hadoop.ipc.RPC.Builder;import org.apache.hadoop.ipc.Server;/** * Starter of RPC service  服务启动 * @author lsl */public class Starter {public static void main(String args[]) throws Exception{//The host sempplsl-01 has published a web service on port 1600Builder builder=new RPC.Builder(new Configuration());builder.setBindAddress("sempplsl-01").setPort(1600).setProtocol(LoginServiceInterface.class).setInstance(new LoginServiceImpl());Server server=builder.build();server.start();}}

----------End----------

以下是本地代码:

package sempp.lsl.hadoop.rpc;/** * 仅需要将远程接口类拷贝到本地,具体实现还是在远程 * @author lsl */public interface LoginServiceInterface {public static final long versionID=1L; public String login(String userName,String passWord);}
package sempp.lsl.hadoop.rpc;import java.io.IOException;import java.net.InetSocketAddress;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.ipc.RPC;/** * 调用远程服务 * @author lsl */public class LoginController {public static void main(String[] args) throws IOException {// LoginServiceInterface 所在包应当与服务器端所在包 包名一致 否则会报错//拿到RPC代理   代理的为主机sempplsl-01 上1600端口发布的RPC服务,可以利用这种代理机制将具体服务的实现从web服务中剥离出来单独发布为RPC服务,实现对服务细节的封装,而使用端只需要拿到服务的代理就可以完全实现该服务LoginServiceInterface proxy=RPC.getProxy(LoginServiceInterface.class, 1L, new InetSocketAddress("sempplsl-01",1600), new Configuration());//调用远程服务(方法的具体实现在远程服务中)String result = proxy.login("lsljiayou", "111");System.out.println(result);        RPC.stopProxy(proxy);}}

----------End----------

需要注意一点,本地接口和远端接口所属包名需要保持一致,否则会报错,具体错误信息为:

Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.RpcServerException): Unknown protocol: sempp.lsl.hadoop.rpc1.LoginServiceInterface

可以看出错误原因是找不到这个包下的接口服务。



0 0