概述
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服務的小例子就完成了。