一、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实现相关推荐

  1. com.xxl.rpc.util.XxlRpcException: java.lang.IllegalStateException: failed to create a child event lo

    Caused by: java.io.IOException: 打开的文件过多 生产上已经调整了linux的最大句柄数为65535 但是运行时间长或是xxl-admin重启有什么变动的情况下我们就会出 ...

  2. 自定义 RPC框架3——JAVA实现Zookeeper节点增删改查

    Zookeeper安装 zookeeper的安装在之前的文章中已经写过:https://blog.csdn.net/qq_45587153/article/details/123630361?spm= ...

  3. 简单的java rpc_Java 简单的rpc 一

    一,简单rpc 是基于Java socket 编程 ServerSocket serverSocket = new ServerSocket(9999);System.out.println(&quo ...

  4. 大数据笔记(六)——HDFS的底层原理:JAVA动态代理和RPC

    一.Java的动态代理对象 实现代码如下: 1.接口类MyService package hdfs.proxy;public interface MyService {public void meth ...

  5. Thrift中实现Java与Python的RPC互相调用

    场景 Thrift介绍以及Java中使用Thrift实现RPC示例: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1086894 ...

  6. java面向服务架构_面向服务的体系架构 SOA(一) --- 基于TCP、HTTP协议的RPC

    1.1 基于TCP协议的RPC 1.1.1 RPC名词解释 RPC的全称是Remote Process Call,即远程过程调用,RPC的实现包括客户端和服务端,即服务调用方和服务提供方.服务调用方发 ...

  7. 简单的RPC java实现

    RPC的名声大噪之时是在2003年,那一个"冲击波"病毒(Blaster Worm virus)袭卷全球的一年.而"冲击波"正是用着RPC这把刀来敲开了远程电脑 ...

  8. Aria2 RPC接口协议和Java的本地调用实现

    如果你还没有启动aria2 : 安装和配置 目录 Aria2 RPC接口协议 Java实现 依赖 核心类 调用 Aria2 RPC接口协议 官方文档 方法列表 下载参数 本文中我们使用默认的本地调用, ...

  9. Java中的远程过程调用(RPC)

    文章目录 1. 背景 2. 远程过程调用的定义 3. 远程过程调用的优点 4. 远程过程调用的缺点 5. 实例 5.1. 客户端 5.1.1. 客户端实现 5.1.2. 动态代理类 5.1.3. 连接 ...

  10. 利用java实现简单的RPC服务调用

    一.前言 RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输 ...

最新文章

  1. 【构造】CF12E Start of the season(神奇的构造)难度⭐⭐⭐
  2. 【javascript】javascript设计模式mixin模式
  3. ViewPager之引导界面---实现欢迎引导页面
  4. 大数据Java基础第十九天作业
  5. 第3章 Python的数据结构、函数和文件
  6. ImageGP新上几个小工具
  7. mybatis初学习
  8. Cisco IP Phone 功能亮相(4)
  9. 解决Ubuntu ssh 登录慢问题
  10. 华为路由器OSPF基础配置命令
  11. 【华为机试 Python实现】VLAN资源池
  12. R语言manova函数多元方差分析(MANOVA)、单因素多元方差分析的两个假设是多元正态性和方差-协方差矩阵的齐性、QQ图评估多元正态性、mvoutlier包中的aq.plot函数检验多变量异常值
  13. 魔兽世界 | 宏命令教程
  14. ie的js调试工具companion.js使用方法
  15. 【转】移动端地图技术分享
  16. 【计算机毕业设计】437物流管理系统设计与实现
  17. 2009-2019年亚马逊畅销书50强数据集可视化分析-基于Pandas-Seaborn
  18. 转 兵无常势 水无常形 贴
  19. Git的原理详解与使用-臧雪园-专题视频课程
  20. android 伪终端,伪终端(pty)机制祥解

热门文章

  1. Windows下安装和配置NodeJS
  2. JavaScript比较是否在某时间段内
  3. boost noncopyable实现禁止类拷贝
  4. pandas练习题二
  5. (秒杀项目) 4.9 削峰限流与防刷(核心)
  6. (day 32 - 位运算 )剑指 Offer 56 - I. 数组中数字出现的次数
  7. openwrt运行linux软件,使用OpenWrt开发嵌入式Linux(二):先让系统跑起来(使用initramfs)...
  8. 滑动平均_善杰告诉您初中物理学滑动变阻器的各种作用
  9. python3.7.2怎么用不了pillow_python怎么加载Pillow包
  10. php中is upload,PHP中,文件上传