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
- RPC调用远程服务
- 9.5远程服务调用框架-远程服务调用协议-RPC基本协议配置
- 如何调用他人的远程服务---RPC原理
- spring4学习记录07-调用远程服务RPC(同步)
- spring4学习记录08-调用远程服务RPC(异步,activeMQ)
- dubbo的应用场景 RPC远程服务调用
- java基于redis客户端redisson的RPC远程服务调用
- RPC远程调用问题
- xml-rpc远程调用
- 远程过程调用(RPC)
- Rpc远程过程调用
- RPC远程过程调用
- RPC远程调用编程
- 远程过程调用RPC
- RPC远程过程调用
- RPC 远程过程调用
- RPC远程过程调用
- 远程过程调用(RPC)
- CentOS服务器安全设置
- MapReduce-使用NLineInputFormat处理大文件-求文件奇偶数行之和
- mui 图标显示不出来解决方案
- 棋盘问题
- 冒泡排序
- RPC调用远程服务
- Android 编码规范指南
- 坐标系涂色问题
- String与StringBuffer的区别
- CombineTextInputFormat用法
- linux常用命令
- swift - 自定义Log
- iOS—application的生命周期
- 内网渗透收藏