性能工具之Jmeter压测Hprose RPC服务

黑眼圈
• 阅读 1702

图片
概述

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/hpr...

写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包

性能工具之Jmeter压测Hprose RPC服务
创建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/ja...d"

<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,我们可以看到这个服务已经成功发布了。

性能工具之Jmeter压测Hprose RPC服务
写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压测Hprose RPC服务
Jmeter压测

打开Jmeter,设置线程组为5个

性能工具之Jmeter压测Hprose RPC服务
新建一个BeanShell Sampler及察看结果树,拷贝HelloClient代码到BeanShell script内,使用随机数函数对请求的数字进行参数化

性能工具之Jmeter压测Hprose RPC服务
运行并查看Jmeter控制台输出结果

性能工具之Jmeter压测Hprose RPC服务
至此,我们的一个压测Hprose RPC服务的小例子就完成了。

点赞
收藏
评论区
推荐文章
Stella981 Stella981
4年前
Apache Dubbo的爱奇艺之旅
ApacheDubbo 简单介绍ApacheDubbo是一款开源的RPC(RemoteProcedureCall,远程过程调用)框架,其提供了简单易用、高性能的RPC能力、灵活可控的扩展、强大的服务治理、完善的开源生态支持,目前已有Java、Go、JS、Python等多个语言支持。ApacheDubbo更
Wesley13 Wesley13
4年前
JAVA服务性能排查完整方案(含Jmeter,Dubbo)
前段时间,博主在做线上服务性能问题排查的工作;想到也有网上的小伙伴们跟博主需求相同,故此贴出方案;以备后用!一、jmeter远程调用dubbo接口   (1).jmeter安装jmeterpluginsforapachedubbo       参考地址:                https://git
Wesley13 Wesley13
4年前
Java系统和PHP系统相互调用
一、HTTPJSON方式的缺点1.JSON序列化效率低2.多语言服务治理功能低二、关于RPC框架RPC框架大致分为两类,一种是偏重服务治理,另一种侧重跨语言调用2.1服务治理型特点功能丰富,提供高性能的远程调用、服务发现及服务治理能力,适用于大型服
Stella981 Stella981
4年前
Dubbo 接口转化为gRPC服务
公司是多语言研发环境,目前Java项目居多,使用Dubbo进行服务间调用。目前公司Nodejs项目、Golang已经很多,平常也用阿里开源的eggjs框架进行开发。经过技术选型,gRPC(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fgrpc.io)支持跨语言、高性能、HTTP/2,使用
Easter79 Easter79
4年前
TarsGo支持Protocol Buffer
Tars是腾讯从2008年到今天一直在使用的后台逻辑层的统一应用框架TAF(TotalApplicationFramework),目前支持C,Java,PHP,Nodejs,Golang语言。该框架为用户提供了涉及到开发、运维、以及测试的一整套解决方案,帮助一个产品或者服务快速开发、部署、测试、上线。它集可扩展协议编解码、高性能RPC通信框架、名字路
Stella981 Stella981
4年前
Jmeter在windows上安装和环境配置
一、Jmeter简单介绍ApacheJMeter是Apache组织开发的基于Java的压力测试工具。它可以用于测试静态和动态资源,例如静态文件、Java小服务程序、CGI脚本、Java对象、数据库、FTP服务器,等等。JMeter可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能。另外,JMeter能够
Wesley13 Wesley13
4年前
DUBBO 详细介绍
摘要:主要核心部件:Remoting:网络通信框架,实现了syncoverasync和requestresponse消息机制.RPC:一个远程过程调用的抽象,支持负载均衡、容灾和集群功能Registry:服务目录框架用于服务的注册和服务事件发布和订阅Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能
Stella981 Stella981
4年前
Dubbo源码解析之SPI(1):扩展类的加载过程
!(https://oscimg.oschina.net/oscnet/22928b1118e3cec1496d7f176996c004dfc.png)Dubbo是一款开源的、高性能且轻量级的JavaRPC框架,它提供了三大核心能力:面向接口的远程方法调用、智能容错和负载均衡,以及服务自动注册和发现。Dubbo最早是阿里公司内部的RPC
Stella981 Stella981
4年前
Dubbo源码解析之SPI(一):扩展类的加载过程
Dubbo是一款开源的、高性能且轻量级的JavaRPC框架,它提供了三大核心能力:面向接口的远程方法调用、智能容错和负载均衡,以及服务自动注册和发现。Dubbo最早是阿里公司内部的RPC框架,于2011年开源,之后迅速成为国内该类开源项目的佼佼者,2018年2月,通过投票正式成为Apache基金会孵化项目。目前宜信公司内部也有不少项目在使用Dub
Wesley13 Wesley13
4年前
TarsGo支持Protocol Buffer
Tars是腾讯从2008年到今天一直在使用的后台逻辑层的统一应用框架TAF(TotalApplicationFramework),目前支持C,Java,PHP,Nodejs,Golang语言。该框架为用户提供了涉及到开发、运维、以及测试的一整套解决方案,帮助一个产品或者服务快速开发、部署、测试、上线。它集可扩展协议编解码、高性能RPC通信框架、名字路