rpc协议之hprose接口测试

一、什么是RPC协议?

RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

有多种 RPC模式和执行。最初由 Sun 公司提出。IETF ONC 宪章重新修订了 Sun 版本,使得 ONC RPC 协议成为 IETF 标准协议。现在使用最普遍的模式和执行是开放式软件基础的分布式计算环境(DCE)。(^-^  我只是搬运工哦,了解更具体的戳:https://baike.baidu.com/item/%E8%BF%9C%E7%A8%8B%E8%BF%87%E7%A8%8B%E8%B0%83%E7%94%A8%E5%8D%8F%E8%AE%AE/6893245?fromtitle=RPC%E5%8D%8F%E8%AE%AE&fromid=5019569&fr=aladdin

二、RPC与HTTP区别是什么?

OSI网络结构的七层模型

各层的具体描述如下:

  第七层:应用层     定义了用于在网络中进行通信和数据传输的接口 - 用户程式;提供标准服务,比如虚拟终端、文件以及任务的传输 和处理; 
  第六层:表示层     掩盖不同系统间的数据格式的不同性; 指定独立结构的数据传输格式; 数据的编码和解码;加密和解密;压缩和 解压缩 
  第五层:会话层     管理用户会话和对话; 控制用户间逻辑连接的建立和挂断;报告上一层发生的错误 
  第四层:传输层     管理网络中端到端的信息传送; 通过错误纠正和流控制机制提供可靠且有序的数据包传送; 提供面向无连接的数 据包的传送; 
  第三层:网络层     定义网络设备间如何传输数据; 根据唯一的网络设备地址路由数据包;提供流和拥塞控制以防止网络资源的损耗 
  第二层:数据链路层 定义操作通信连接的程序; 封装数据包为数据帧; 监测和纠正数据包传输错误 
  第一层:物理层      定义通过网络设备发送数据的物理方式; 作为网络媒介和设备间的接口;定义光学、电气以及机械特性。

 在上述7层中,http协议是应用层协议。HTTP协议是超文本传送协议(HyperText Transfer Protocol)的缩写,它是万维网(World Wide Web,www,也简称为Web)的基础。HTTP协议设计之初就是为了实现Web的想法。HTTP协议位于TCP/IP协议栈的应用层。基于HTTP协议的客户/服务器模式的信息交换过程,分四个过程:建立连接、发送请求信息、发送响应信息、关闭连接。

而关于RPC的基本概念介绍如下:


英文原义:Remote Procedure Call Protocol
中文释义:(RFC-1831)远过程调用协议
   注解:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加轻易。
   RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用过程接收答复信息,获得进程结果,然后调用执行继续进行。
RPC信息协议由两个不同结构组成:调用信息和答复信息。

二者的联系是:


RPC OVER HTTP

Microsoft RPC-over-HTTP 部署(RPC over HTTP)允许RPC 客户端安全和有效地通过Internet 连接到RPC 服务器程序并执行远程过程调用。这是在一个名称为RPC-over-HTTP 代理,或简称为RPC 代理的中间件的帮助下完成的。

  RPC 代理运行在IIS 计算机上。它接受来自Internet 的RPC 请求,在这些请求上执行认证,检验和访问检查,如果请求通过所有的测试,RPC 代理将请求转发给执行真正处理的RPC 服务器。通过RPC over HTTP,RPC 客户端不和服务器直接通信,它们使用RPC 代理作为中间件。

RPC 的全称是 Remote Procedure Call 是一种进程间通信方式。
它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即无论是调用本地接口/服务的还是远程的接口/服务,本质上编写的调用代码基本相同。
比如两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数或者方法,由于不在一个内存空间,不能直接调用,这时候需要通过就可以应用RPC框架的实现来解决。


关于xml-rpc

1.xml rpc是什么 
1.1. xml rpc简介 
xml rpc是使用http协议做为传输协议的rpc机制,使用xml文本的方式传输命令和数据。 
一个rpc系统,必然包括2个部分:1.rpc client,用来向rpc server调用方法,并接收方法的返回数据;2.rpc server,用于响应rpc client的请求,执行方法,并回送方法执行结果。 
1.2. xml rpc的可用版本 
xml rpc client和xml rpc server都有很多版本的实现。一般而言,一个实现版本都会同时实现client/server。但由于都满足xml rpc规范,从理论上讲,任何一个版本的rpc client实现与任何一个版本的rpc server都能配套使用。 
更进一步,由于xml rpc以xml文本的方式,使用http协议传输,所以与编程语言无关。例如:rpc client的已实现版本包括了:perl,php,python,c/c++,java,等等;rpc server的实现语言包括perl,java,等。 
同一种编程语言所实现的版本也不止一个。例如java版的实现有:Marque的xmlrpc实现(http://xmlrpc.sourceforge.net/),apache的xmlrpc 实现(http://ws.apache.org/xmlrpc/)

1.3.xmlrpc的工作原理 
完整的需要参考xmlrpc规范(http://www.xmlrpc.com/spec
简单描述: 
rpcclient的工作原理:rpcclient根据URL找到rpcserver -> 构造命令包,调用rpcserver上的某个服务的某个方法 -> 接收到rpcserver的返回,解析响应包,拿出调用的返回结果。 
rpcserver的工作原理:启动一个webserver(在使用内置的webserver的情况下) -> 注册每个能提供的服务,每个服务对应一个Handler类 ->进入服务监听状态。(^-^ 以上内容转自本文详情戳:https://blog.csdn.net/xiaohubeiplus/article/details/78201249

三、怎样编写脚本测试RPC接口

本文使用工具eclipse,JDK版本1.8  具体环境配置小伙伴自行查阅文档哦

1、有参数请求

首先:新建一个java项目,构建如下目录结构,导入hprose_client_for_java_8.jar 包(注意这里jar包版本要与你的JDK版本一致哦)

接着:新建Test类(纯java方式实现接口测试)、ApiserviceRPCInterface类(基于jmeter实现接口测试),两者选择其一就可以

php接口文档如下:

$host = "http://apiservice.test.com/order/OrderCenter";
$this->_client = new Client($host, false);
$order_id = '1111169873';
$fields = 'order_id,order_num,order_price';
$ret = $this->_client->getOrderInfoById($order_id,$fields);

具体代Test类代码如下:

package com.apiservicerpc.test;


import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import hprose.client.HproseHttpClient;

public class Test {
	static int order_id= 1111170144;
	static String fields = "order_id,order_num,order_price";
	static String result = null;
	public static void executeQueryOrder() {
//实例化一个对象
		HproseHttpClient client = new HproseHttpClient();

		try {

//创建一个连接
			client.useService("http://apiservice.test.com/order/OrderCenter");
//执行请求 getOrderInfoById为服务端方法名 , {}内都为接口需要参数,可以参考上步骤中PHP接口说明
			result = client.invoke("getOrderInfoById",new Object[]{order_id,fields}).toString();
			System.out.println("服务器响应信息:" + result);
			
		} catch (Throwable e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	}
//主方法	
	public static void main(String[] args) {
		// TODO Auto-generated method stub	
		executeQueryOrder();
	}
}

2、无参数请求

PHP无参数接口文档如下:

$host = "http://apiservice.test.com/getOrder/OrderCenter";
$this->_client = new Client($host, false);
$ret = $this->_client->getOrderInfoById();

具体代Test测试类代码如下:

package com.apiservicerpc.test;


import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import hprose.client.HproseHttpClient;

public class Test {
	static String result = null;
	public static void executeQueryOrder() {
//实例化一个对象
		HproseHttpClient client = new HproseHttpClient();

		try {

//创建一个连接
			client.useService("http://apiservice.test.com/getOrder/OrderCenter");
//执行请求 getOrderInfoById为服务端方法名 , {}内都为接口需要参数,可以参考上步骤中PHP接口说明
			result = client.invoke("getOrderInfoById").toString();
			System.out.println("服务器响应信息:" + result);
			
		} catch (Throwable e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	}
//主方法	
	public static void main(String[] args) {
		// TODO Auto-generated method stub	
		executeQueryOrder();
	}
}

这样整个编码就完成了,直接运行就可以看到结果了。

四、总结

不会的就看hprose帮助文档,可以帮忙理解具体操作方法实现

猜你喜欢

转载自blog.csdn.net/qq_19594755/article/details/81304003