图片
概述
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包
创立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,咱们能够看到这个服务曾经胜利公布了。
写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服务的小例子就实现了。