RPC应用的java实现
一、RPC介绍
什么是RPC?Remote Procedure Call,远程过程调用。也就是说,调用过程代码并不是在调用者本地运行,而是要实现调用者与被调用者二地之间的连接与通信。比较严格的定义是:Remote procedure call (RPC) is a protocol that allows a computer program running on one computer to cause a subroutine on another computer to be executed without the programmer explicitly coding the details for this interaction. When the software in question is written using object-oriented principles, RPC may be referred to as remote invocation or remote method invocation. 这样一讲,容易联想到C/S模式的程序设计,我想是对的。RPC的基本通信模型是基于Client/Server进程间相互通信模型的一种同步通信形式;它对Client提供了远程服务的过程抽象,其底层消息传递操作对Client是透明的。在RPC中,Client即是请求服务的调用者(Caller),而Server则是执行Client的请求而被调用的程序 (Callee)。
下图是RPC调用协议图:
首先是建立RPC服务,约定底层的RPC传输通道(UDP或是TCP)。客户端的调用参数根据传输前所提供的目的地址及RPC 上层应用程序号,通过底层的RPC传输通道转至相应的服务器,即RPC Application Porgramme Server。客户端随即处于等待状态,以服务器等待应答或Time Out超时信号。当服务器端获得了请求消息,会根据注册RPC时告诉RPC系统的程序入口地址执行相应的操作,并将结果返回至客户端。当一次RPC调用结束后,相应线程发送相应的信号,客户端程序便继续运行。
二、基于xml-rpc的应用简单实现
下载xml-rpc jar包 http://ws.apache.org/xmlrpc/download.html 当前版本:3.1.3
1、业务处理接口
package com.flyoung.xmlrpc; public interface ServicesHandler {public String execute(String str);}
2、业务接口实现
package com.flyoung.xmlrpc; public class HelloHandler implements ServicesHandler { public String execute(String str) { return "hello "+str+"!"; } }
3、客户端
package com.flyoung.xmlrpc; import java.net.MalformedURLException;import java.net.URL;import java.util.Vector; import org.apache.xmlrpc.XmlRpcException;import org.apache.xmlrpc.client.XmlRpcClient;import org.apache.xmlrpc.client.XmlRpcClientConfigImpl; public class TestClient { /** * @param args*/public static void main(String[] args) {try {//配置客户端 XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();//设置服务器端地址 config.setServerURL(new URL("http://localhost:8080/Rpc/HelloHandler"));//创建XmlRpc客户端 XmlRpcClient client = new XmlRpcClient();//绑定以上设置 client.setConfig(config);//创建参数列表 Vector<String> params = new Vector<String>(); params.addElement("flyoung");//执行XML-RPC 请求 String result =(String) client.execute("HelloHandler.execute", params); System.out.println("result:"+result); } catch (MalformedURLException e) { e.printStackTrace(); } catch (XmlRpcException e) { e.printStackTrace(); } } }
4、服务器端
package com.flyoung.xmlrpc; import java.io.IOException; import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; import org.apache.xmlrpc.XmlRpcException;import org.apache.xmlrpc.server.PropertyHandlerMapping;import org.apache.xmlrpc.server.XmlRpcServerConfigImpl;import org.apache.xmlrpc.webserver.XmlRpcServletServer;import com.flyoung.xmlrpc.HelloHandler;public class XmlRpcServicesServlet extends HttpServlet {private XmlRpcServletServer server; @Overridepublic void init(ServletConfig config) throws ServletException {super.init(config);try {//创建XmlRpcServletServer对象 server = new XmlRpcServletServer(); //set up handler mapping of XmlRpcServletServer object PropertyHandlerMapping pmp = new PropertyHandlerMapping(); pmp.addHandler("HelloHandler", HelloHandler.class); server.setHandlerMapping(pmp); //more config of XmlRpcServletServer object XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl)server.getConfig(); serverConfig.setEnabledForExtensions(true); serverConfig.setContentLengthOptional(false); } catch (XmlRpcException e) {// TODO Auto-generated catch block e.printStackTrace(); } } @Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException { server.execute(req, resp); } @Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException { server.execute(req, resp); } }
5、xml配置
<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><display-name></display-name> <welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><servlet><servlet-name>XmlRpcServer</servlet-name><servlet-class>com.flyoung.xmlrpc.XmlRpcServicesServlet</servlet-class></servlet><servlet-mapping><servlet-name>XmlRpcServer</servlet-name><url-pattern>/HelloHandler</url-pattern></servlet-mapping></web-app>
6、测试结果
result:hello flyoung!
在RPC中,当一个请求到达RPC服务器时,这个请求就包含了一个参数集和一个文本值,通常形成“classname.methodname”的形式。这就向RPC服务器表明,被请求的方法在为“classname”的类中,名叫“methodname”。然后RPC服务器就去搜索与之相匹配的类和方法,并把它作为那种方法参数类型的输入。这里的参数类型是与RPC请求中的类型是匹配的。一旦匹配成功,这个方法就被调用了,其结果被编码后返回客户方。
缺点:
1)XML-RPC的消息系统过于简单,没有完整意义上的消息模型
2)XML-RPC调用服务的方式要求直接指定对象和方法,称不上完整的面向服务的体系
3)XML-RPC服务器端提供的服务实际上是特定对象的某个方法,限制了服务器端的开发
转载于:https://www.cnblogs.com/flyoung2008/archive/2011/11/12/2246282.html
RPC应用的java实现相关推荐
- com.xxl.rpc.util.XxlRpcException: java.lang.IllegalStateException: failed to create a child event lo
Caused by: java.io.IOException: 打开的文件过多 生产上已经调整了linux的最大句柄数为65535 但是运行时间长或是xxl-admin重启有什么变动的情况下我们就会出 ...
- 自定义 RPC框架3——JAVA实现Zookeeper节点增删改查
Zookeeper安装 zookeeper的安装在之前的文章中已经写过:https://blog.csdn.net/qq_45587153/article/details/123630361?spm= ...
- 简单的java rpc_Java 简单的rpc 一
一,简单rpc 是基于Java socket 编程 ServerSocket serverSocket = new ServerSocket(9999);System.out.println(&quo ...
- 大数据笔记(六)——HDFS的底层原理:JAVA动态代理和RPC
一.Java的动态代理对象 实现代码如下: 1.接口类MyService package hdfs.proxy;public interface MyService {public void meth ...
- Thrift中实现Java与Python的RPC互相调用
场景 Thrift介绍以及Java中使用Thrift实现RPC示例: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1086894 ...
- java面向服务架构_面向服务的体系架构 SOA(一) --- 基于TCP、HTTP协议的RPC
1.1 基于TCP协议的RPC 1.1.1 RPC名词解释 RPC的全称是Remote Process Call,即远程过程调用,RPC的实现包括客户端和服务端,即服务调用方和服务提供方.服务调用方发 ...
- 简单的RPC java实现
RPC的名声大噪之时是在2003年,那一个"冲击波"病毒(Blaster Worm virus)袭卷全球的一年.而"冲击波"正是用着RPC这把刀来敲开了远程电脑 ...
- Aria2 RPC接口协议和Java的本地调用实现
如果你还没有启动aria2 : 安装和配置 目录 Aria2 RPC接口协议 Java实现 依赖 核心类 调用 Aria2 RPC接口协议 官方文档 方法列表 下载参数 本文中我们使用默认的本地调用, ...
- Java中的远程过程调用(RPC)
文章目录 1. 背景 2. 远程过程调用的定义 3. 远程过程调用的优点 4. 远程过程调用的缺点 5. 实例 5.1. 客户端 5.1.1. 客户端实现 5.1.2. 动态代理类 5.1.3. 连接 ...
- 利用java实现简单的RPC服务调用
一.前言 RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输 ...
最新文章
- 【构造】CF12E Start of the season(神奇的构造)难度⭐⭐⭐
- 【javascript】javascript设计模式mixin模式
- ViewPager之引导界面---实现欢迎引导页面
- 大数据Java基础第十九天作业
- 第3章 Python的数据结构、函数和文件
- ImageGP新上几个小工具
- mybatis初学习
- Cisco IP Phone 功能亮相(4)
- 解决Ubuntu ssh 登录慢问题
- 华为路由器OSPF基础配置命令
- 【华为机试 Python实现】VLAN资源池
- R语言manova函数多元方差分析(MANOVA)、单因素多元方差分析的两个假设是多元正态性和方差-协方差矩阵的齐性、QQ图评估多元正态性、mvoutlier包中的aq.plot函数检验多变量异常值
- 魔兽世界 | 宏命令教程
- ie的js调试工具companion.js使用方法
- 【转】移动端地图技术分享
- 【计算机毕业设计】437物流管理系统设计与实现
- 2009-2019年亚马逊畅销书50强数据集可视化分析-基于Pandas-Seaborn
- 转 兵无常势 水无常形 贴
- Git的原理详解与使用-臧雪园-专题视频课程
- android 伪终端,伪终端(pty)机制祥解
热门文章
- Windows下安装和配置NodeJS
- JavaScript比较是否在某时间段内
- boost noncopyable实现禁止类拷贝
- pandas练习题二
- (秒杀项目) 4.9 削峰限流与防刷(核心)
- (day 32 - 位运算 )剑指 Offer 56 - I. 数组中数字出现的次数
- openwrt运行linux软件,使用OpenWrt开发嵌入式Linux(二):先让系统跑起来(使用initramfs)...
- 滑动平均_善杰告诉您初中物理学滑动变阻器的各种作用
- python3.7.2怎么用不了pillow_python怎么加载Pillow包
- php中is upload,PHP中,文件上传