性能工具之Jmeter压测Hprose RPC服务
概述
Hprose(High Performance Remote Object Service Engine),国人开发的一个远程方法调用的开源框架。它是一个先进的轻量级的跨语言跨平台面向对象的高性能远程动态通讯中间件,它支持众多语言,例如nodeJs, C++,.NET,Java,Delphi,Objective-C,ActionScript,JavaScript,ASP,PHP,Python, Ruby,Perl等。
什么是RPC?
RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。 其实简单的说,就是象调用本地的类的方法样来调用服务器端的方法实现。
具体参考以下文章:
Hprose特点
支持几乎所有常见语言的实现,包括浏览器中的javascript
成熟稳定,已经在很多项目中得到验证
一直在持续稳步更新
国人开发,有QQ群在线支持,回复比较快速(5分钟之内)
和实体能保持很好的兼容性,实体工作量较小
Hprose服务端
Hprose 2.0 for Java 支持多种底层网络协议绑定的服务器,比如:HTTP 服务器,TCP 服务器和 WebSocket 服务器。 HTTP 服务器支持在 HTTP、HTTPS 协议上通讯。 TCP 服务器支持在 TCP 协议上通讯,并且支持全双工和半双工两种模式。 WebSocket 服务器支持在 ws、wss 协议上通讯。
Hprose客户端
Hprose 2.0 for Java 支持两种底层网络协议绑定的客户端:HTTP 客户端 和 TCP 客户端。 其中 HTTP 客户端支持跟 HTTP、HTTPS 绑定的 Hprose 服务器通讯。 TCP 客户端支持跟 TCP 绑定的 Hprose 服务器通讯,并且支持全双工和半双工两种模式。 尽管支持这两种不同的底层网络协议,但除了在对涉及到底层网络协议的参数设置上有所不同以外,其它的用法都完全相同。
官网地址: http://hprose.com/
实现逻辑
Hprose应用大致就做三件事:
复制Hprose文件进项目
写Hprose服务端
写Hprose客户端
Hprose服务端要做的事就两件:
new一个HproseHttpServer对象
用这个对象发布服务,包括函数、方法、对象甚至类
Hprose客户端要做的事就两件:
new一个HproseHttpClient对象
用这个对象调用服务端发布的各种服务
压测示例
此处我们使用官方自带的HellWorld示例
源代码:https://github.com/hprose/hprose-java
写Hprose服务端
首先创建一个maven web项目,并引入hprose Stub JAR包
<dependencies>
<!--引入hprose Stub-->
<dependency>
<groupId>org.hprose</groupId>
<artifactId>hprose-java</artifactId>
<version>2.0.38</version>
</dependency>
</dependencies>
在WebRoot/WEB-INFO/Lib目录下引入servlet和websocket的JAR包
创建hello服务类,可以写两个很简单的sayHello方法和add方法
/***
* 服务类
*/
public class Hello {
/***
* 返回hello+客户端传参
* @param name
* @return
*/
public String sayHello(String name) {
return "Hello " + name + "!";
}
/**
* 返回两个数字的和
* @param a
* @param b
* @return
*/
public String add(int a,int b)
{
int c=a+b;
return "结果是:"+c;
}
}
编写一个服务发布类WebSocketServer绑定WebSocketServer
/***
* 服务发布类
* WebSocket 绑定
* Hprose RPC也可以工作于WebSocket之上,数据以二进制数据的方式在WebSocket上发送和接收。
* Hprose RPC添加了4个字节的头作为请求唯一标识(id),服务器端不需要关心请求唯一标识(id)如何编码,只需要在应答中重复它就可以了。
*/
@ServerEndpoint("/wshello")
public class WebSocketServer {
private HproseWebSocketService service = new HproseWebSocketService();
public WebSocketServer() {
//new出服务对象,发布类里面所有的公共方法
service.add(new Hello());
}
@OnOpen
public void onOpen(Session session, EndpointConfig config) {
service.setConfig(config);
}
@OnMessage
public void onMessage(ByteBuffer buf, Session session) throws IOException {
service.handle(buf, session);
}
@OnError
public void onError(Session session, Throwable error) {
service.handleError(session, error);
}
}
主要工作都完成了,接着需要在web.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">
<servlet>
<!--注册服务-->
<servlet-name>HelloServlet</servlet-name>
<servlet-class>hprose.server.HproseServlet</servlet-class>
<init-param>
<param-name>class</param-name>
<param-value>hprose.hello.server.Hello</param-value>
</init-param>
<init-param>
<param-name>crossDomain</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<!--绑定URL-->
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/Hello</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
完成后运行tomcat,浏览器自动打开http://localhost:8888/Hello,我们可以看到这个服务已经成功发布了。
写Hprose客户端
接下我们写HelloClient类测试下服务是否ok
/**
* Hprose客户端
*/
public class HelloClient {
public static void main(String[] args) throws IOException {
//new一个HproseHttpClient对象
HproseHttpClient client = new HproseHttpClient();
//使用无参构造器创建的客户端,在进行调用前,需要先调用useService方法初始化服务器地址
client.useService("http://localhost:8080/Hello");
//使用invoke方法来动态调用服务。
String result = (String) client.invoke("sayHello", new Object[] { "Hprose" });
System.out.println(result);
result = (String) client.invoke("sayHello", new Object[] { "7DGroup" });
System.out.println(result);
System.out.println(client.invoke("add",new Object[]{1,6}));
}
}
测试成功后,我们把hprose jar包拷贝到apache-jmeter-4.0\lib\ext下
Jmeter压测
打开Jmeter,设置线程组为5个
新建一个BeanShell Sampler及察看结果树,拷贝HelloClient代码到BeanShell script内,使用随机数函数对请求的数字进行参数化
运行并查看Jmeter控制台输出结果
至此,我们的一个压测Hprose RPC服务的小例子就完成了。
性能工具之Jmeter压测Hprose RPC服务的更多相关文章
- 性能工具之Jmeter压测Thrift RPC服务
概述 Thrift是一个可互操作和可伸缩服务的框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, ...
- 【Java分享客栈】未来迈向高级工程师绕不过的技能:JMeter压测
前言 因为工作需要,久违的从自己的有道云笔记中去寻找压测相关的内容,翻开之后发现还不错,温故一遍后顺便整理出来分享给大家. 题外话,工作8年多,有道云笔记不知不觉都6G多了,扫一眼下来尽是云烟过往,竟 ...
- JMeter接口压测——ServerAgent监控服务端性能指标
ServerAgent作为一个服务端性能监控插件,结合JMeter自身插件PerfMon可以实现JMeter压测的图形化实时监控,具有良好的实用性.下面讲解一个应用实例 思路: 1. 插件准备 2.打 ...
- windows下Jmeter压测端口占用问题(亲测有效)
windows下Jmeter压测端口占用问题 1 报错信息描述 压测的初期,在设置了 150qps/s 的并发数下压测几分钟后 Jmeter 就出现了如下报错. JAVA.NET.BINDEXCEPT ...
- jmeter压测、操作数据库、分布式、 linux下运行的简单介绍
一.jmeter压测 1.如何压测 常规性能压测:10-15分钟 稳定性测试:一周.2天等 如果想要压测10分钟,勾选永远,勾选调度器,填写600秒.也可以使用固定启动时间. 2.tps.响应时间 ( ...
- windows下Jmeter压测端口占用问题
https://blog.csdn.net/weixin_43757847/article/details/88188091 1 前情提要人脸识别项目中,云平台新增了人脸识别的校验接口.考虑到存在大量 ...
- 一文揭秘测试平台中是如何将测试用例一键转化Jmeter压测脚本
接上篇,一键转化将接口测试平台测试用例转化成Jmeter压测脚本思路,这里我首先在java 上面做了一个简单的实验,看看 转化的中间遇到的问题,这里呢,我只是给了一个简单的demo 版本, ...
- jmeter压测app
使用代理的方式,录制app端脚本,之后用jmeter压测就没啥好说的了 1.电脑端谷歌设置本地代理(端口号为8888) 2.jmeter设置HTTP代理服务器(端口号为8888) 3.手机端wifi设 ...
- JMeter压测基础(三)——Mysql数据库
JMeter压测基础(三)——Mysql数据库 环境准备 mysql驱动 JMeter jdbc配置 JMeter jdbc请求 1.下载mysql驱动:mysql-connector-java.ja ...
随机推荐
- MySQL查看及杀掉链接方法大全
前言: 在数据库运维过程中,我们时常会关注数据库的链接情况,比如总共有多少链接.有多少活跃链接.有没有执行时间过长的链接等.数据库的各种异常也能通过链接情况间接反应出来,特别是数据库出现死锁或严重卡顿 ...
- 2019c#将PDF转图片
两种方法: 第一种是用O2S.Components.PDFRender4NET 大家可以去网上查找无水印版本 但是有的时候带颜色的字就变空白了 不知道为什么 第二种是用PdfiumViewer 这种方 ...
- redis的数据结构、使用场景、持久化方式以及常见面试问题
一.redis中的数据结构 1.字符串(String) SET key value //存入字符串键值对 MSET key value[key value...] //批量存储字符串键值对 SETNX ...
- 使用小记:Zookeeper中动态改变节点的功能
Zookeeper 3.5+提供了reconfig功能实现动态配置节点,官方的说明是,"你再也不需要进行全部节点重启"就可以应用所有的修改: http://zookeeper.ap ...
- Java容器 | 基于源码分析Map集合体系
一.容器之Map集合 集合体系的源码中,Map中的HashMap的设计堪称最经典,涉及数据结构.编程思想.哈希计算等等,在日常开发中对于一些源码的思想进行参考借鉴还是很有必要的. 基础:元素增查删.容 ...
- 【Mysql】数据库索引,百万数据测试索引效果
Mysql官方对索引的定义是:索引(index)是帮助Mysql高效获取数据的数据结构.进而,我们可以知道索引的本质是数据结构. 一.索引的分类 主键索引:也就是我们常见的 PRIMARY KEY,只 ...
- jQ的隐式迭代和设置样式属性
jQ中的隐式迭代 意义:不需要原生迭代了,在jQ内部自动帮你实现了循环 代码实现: let arr = document.querySelectorAll('li') for(let i = 0;i ...
- Java集合详解(五):Hashtable原理解析
概述 本文是基于jdk8_271版本进行分析的. Hashtable与HashMap一样,是一个存储key-value的双列集合.底层是基于数组+链表实现的,没有红黑树结构.Hashtable默认初始 ...
- [bug] Error updating database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MyS
sql语句写错了,如图,where前多了个逗号
- [DB] 关系型数据库
名词 数据库(database):保存有组织的数据的容器,是通过DBMS创建的容器 表(table):某种特定类型数据的结构化清单 元组(tuple):行,一条数据库记录,对应一个事物 属性(prop ...