共计 3939 个字符,预计需要花费 10 分钟才能阅读完成。
图片
概述
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 服务的小例子就实现了。