概述
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/hprose-java
寫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/javaee/web-app_2_5.xsd"> -
<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服務的小例子就完成了。
