概述
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特点
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客户端要做的事就两件:
压测示例
此处我们使用官方自带的HellWorld示例
源代码:https://github.com/hprose/hprose-java
写Hprose服务端
首先创建一个maven web项目,并引入hprose Stub JAR包
1. <dependencies>2. <!--引入hprose Stub-->
3. <dependency>
4. <groupId>org.hprose</groupId>
5. <artifactId>hprose-java</artifactId>
6. <version>2.0.38</version>
7. </dependency>
8. </dependencies>
在WebRoot/WEB-INFO/Lib目录下引入servlet和websocket的JAR包
创建hello服务类,可以写两个很简单的sayHello方法和add方法
1. /***2. * 服务类
3. */
4.
5. public class Hello {
6.
7. /***
8. * 返回hello+客户端传参
9. * @param name
10. * @return
11. */
12. public String sayHello(String name) {
13. return "Hello " + name + "!";
14. }
15.
16. /**
17. * 返回两个数字的和
18. * @param a
19. * @param b
20. * @return
21. */
22. public String add(int a,int b)
23. {
24. int c=a+b;
25. return "结果是:"+c;
26. }
27. }
编写一个服务发布类WebSocketServer绑定WebSocketServer
1. /***2. * 服务发布类
3. * WebSocket 绑定
4. * Hprose RPC也可以工作于WebSocket之上,数据以二进制数据的方式在WebSocket上发送和接收。
5. * Hprose RPC添加了4个字节的头作为请求唯一标识(id),服务器端不需要关心请求唯一标识(id)如何编码,只需要在应答中重复它就可以了。
6. */
7.
8. @ServerEndpoint("/wshello")
9. public class WebSocketServer {
10. private HproseWebSocketService service = new HproseWebSocketService();
11. public WebSocketServer() {
12. //new出服务对象,发布类里面所有的公共方法
13. service.add(new Hello());
14. }
15. @OnOpen
16. public void onOpen(Session session, EndpointConfig config) {
17. service.setConfig(config);
18. }
19. @OnMessage
20. public void onMessage(ByteBuffer buf, Session session) throws IOException {
21. service.handle(buf, session);
22. }
23. @OnError
24. public void onError(Session session, Throwable error) {
25. service.handleError(session, error);
26. }
27. }
主要工作都完成了,接着需要在web.xml里注册一下
1. <?xml version="1.0" encoding="UTF-8"?>2. <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">
3. <servlet>
4. <!--注册服务-->
5. <servlet-name>HelloServlet</servlet-name>
6. <servlet-class>hprose.server.HproseServlet</servlet-class>
7. <init-param>
8. <param-name>class</param-name>
9. <param-value>hprose.hello.server.Hello</param-value>
10. </init-param>
11. <init-param>
12. <param-name>crossDomain</param-name>
13. <param-value>true</param-value>
14. </init-param>
15. </servlet>
16. <!--绑定URL-->
17. <servlet-mapping>
18. <servlet-name>HelloServlet</servlet-name>
19. <url-pattern>/Hello</url-pattern>
20. </servlet-mapping>
21. <session-config>
22. <session-timeout>
23. 30
24. </session-timeout>
25. </session-config>
26. <welcome-file-list>
27. <welcome-file>index.html</welcome-file>
28. </welcome-file-list>
29. </web-app>
完成后运行tomcat,浏览器自动打开http://localhost:8888/Hello,我们可以看到这个服务已经成功发布了。
写Hprose客户端
接下我们写HelloClient类测试下服务是否ok
1. /**2. * Hprose客户端
3. */
4. public class HelloClient {
5. public static void main(String[] args) throws IOException {
6. //new一个HproseHttpClient对象
7. HproseHttpClient client = new HproseHttpClient();
8. //使用无参构造器创建的客户端,在进行调用前,需要先调用useService方法初始化服务器地址
9. client.useService("http://localhost:8080/Hello");
10. //使用invoke方法来动态调用服务。
11. String result = (String) client.invoke("sayHello", new Object[] { "Hprose" });
12. System.out.println(result);
13. result = (String) client.invoke("sayHello", new Object[] { "7DGroup" });
14. System.out.println(result);
15. System.out.println(client.invoke("add",new Object[]{1,6}));
16. }
17. }
测试成功后,我们把hprose jar包拷贝到apache-jmeter-4.0\lib\ext下
Jmeter压测
打开Jmeter,设置线程组为5个
新建一个BeanShell Sampler及察看结果树,拷贝HelloClient代码到BeanShell script内,使用随机数函数对请求的数字进行参数化
运行并查看Jmeter控制台输出结果
至此,我们的一个压测Hprose RPC服务的小例子就完成了。
大家可以关注公众号:7Group