概述

什么是RPC?

具体参考以下文章:

性能基础之浅谈常见接口性能压测

Hprose特点

Hprose服务端

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包

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

创建hello服务类,可以写两个很简单的sayHello方法和add方法

  1. /***

  2. * 服务类

  3. */

  4. public class Hello {

  5.    /***

  6.     * 返回hello+客户端传参

  7.     * @param name

  8.     * @return

  9.     */

  10.    public String sayHello(String name) {

  11.        return "Hello " + name + "!";

  12.    }

  13.    /**

  14.     * 返回两个数字的和

  15.     * @param a

  16.     * @param b

  17.     * @return

  18.     */

  19.    public String add(int a,int b)

  20.    {

  21.        int c=a+b;

  22.        return "结果是:"+c;

  23.    }

  24. }

编写一个服务发布类WebSocketServer绑定WebSocketServer

  1. /***

  2. * 服务发布类

  3. * WebSocket 绑定

  4. * Hprose RPC也可以工作于WebSocket之上,数据以二进制数据的方式在WebSocket上发送和接收。

  5. * Hprose RPC添加了4个字节的头作为请求唯一标识(id),服务器端不需要关心请求唯一标识(id)如何编码,只需要在应答中重复它就可以了。

  6. */

  7. @ServerEndpoint("/wshello")

  8. public class WebSocketServer {

  9.    private HproseWebSocketService service = new HproseWebSocketService();

  10.    public WebSocketServer() {

  11.        //new出服务对象,发布类里面所有的公共方法

  12.        service.add(new Hello());

  13.    }

  14.    @OnOpen

  15.    public void onOpen(Session session, EndpointConfig config) {

  16.        service.setConfig(config);

  17.    }

  18.    @OnMessage

  19.    public void onMessage(ByteBuffer buf, Session session) throws IOException {

  20.        service.handle(buf, session);

  21.    }

  22.    @OnError

  23.    public void onError(Session session, Throwable error) {

  24.        service.handleError(session, error);

  25.    }

  26. }

主要工作都完成了,接着需要在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,我们可以看到这个服务已经成功发布了。

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

写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压测Hprose RPC服务-LMLPHP

Jmeter压测

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

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

新建一个BeanShell Sampler及察看结果树,拷贝HelloClient代码到BeanShell script内,使用随机数函数对请求的数字进行参数化

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

运行并查看Jmeter控制台输出结果

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

至此,我们的一个压测Hprose RPC服务的小例子就完成了。

06-25 08:26