性能工具之Jmeter壓測Hprose RPC服務

 

概述

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特點

  1. 支援幾乎所有常見語言的實現,包括瀏覽器中的javascript

  2. 成熟穩定,已經在很多項目中得到驗證

  3. 一直在持續穩步更新

  4. 國人開發,有QQ群在線支援,回複比較快速(5分鐘之內)

  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 伺服器通訊,並且支援全雙工和半雙工兩種模式。 儘管支援這兩種不同的底層網路協議,但除了在對涉及到底層網路協議的參數設置上有所不同以外,其它的用法都完全相同。

官網地址: //hprose.com/

實現邏輯

Hprose應用大致就做三件事:

  1. 複製Hprose文件進項目

  2. 寫Hprose服務端

  3. 寫Hprose客戶端

Hprose服務端要做的事就兩件:

  1. new一個HproseHttpServer對象

  2. 用這個對象發布服務,包括函數、方法、對象甚至類

Hprose客戶端要做的事就兩件:

  1. new一個HproseHttpClient對象

  2. 用這個對象調用服務端發布的各種服務

壓測示例

此處我們使用官方自帶的HellWorld示例

源程式碼://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="//java.sun.com/xml/ns/javaee" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="//java.sun.com/xml/ns/javaee //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,瀏覽器自動打開//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("//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服務的小例子就完成了。

Tags: