微信公眾號java sdk技術選型

Aurora Polaris發表於2016-12-14
微信公眾號java sdk技術選型
  • 發表於 2年前
  • 閱讀 4250
  • 收藏 34
  • 點贊 9
  • 評論 13
摘要: 微信公眾平臺由於沒有提供針對語言的開發包,只公佈了一個基於Http協議的介面和加解密的演算法sdk,這樣給微信公眾號的開發者帶來很多工作量,除了實現業務邏輯外,還需要自己處理底層的介面協議細節,因此選擇一個良好的sdk能夠節省這樣的工作量,而目前已經有不少的開源sdk可供使用,java語言的微信公眾號sdk也有不少,那麼作為java開發者我們應該如何選擇呢?本文將對java開源的一些微信公眾號的sdk進行各方面的對比分析,為讀者選擇適合自己的sdk包提供一些幫助。

背景介紹

微信公眾平臺由於沒有提供針對語言的開發包,只公佈了一個基於Http協議的介面和加解密的演算法sdk,這樣給微信公眾號的開發者帶來很多工作量,除了實現業務邏輯外,還需要自己處理底層的介面協議細節,因此選擇一個良好的sdk能夠節省這樣的工作量,而目前已經有不少的開源sdk可供使用,java語言的微信公眾號sdk也有不少,那麼作為java開發者我們應該如何選擇呢?本文將對java開源的一些微信公眾號的sdk進行各方面的對比分析,為讀者選擇適合自己的sdk包提供一些幫助。

初選篩選

面對技術選型,首先要找到可供選擇的這些sdk,再對它們進行對比分析,首先我們從中國最大最活躍的開源社群oschina上查詢可選的那些sdk。它們必須要滿足這樣一些基本條件。
  • 開源免費。不解釋。 
  • 良好的擴充套件性。微信的api也是不斷升級的,sdk必須能夠具有良好的擴充套件性以支援升級。 
  • 質量可靠。這是基本要求。 
  • 通用性強。依賴儘可能少,即使有也一定要非常通用才可以。 
基於上述基本要求,我們從可選的java sdk中挑選以下這些符合上述條件的。
A B C D
名稱  介紹  網址  選擇理由 
fastweixin  fastweixin —— 快速搭建微信公眾平臺伺服器

簡單封裝了所有與微信伺服器互動的訊息:文字訊息、圖片訊息、圖文訊息等等 1.0版本提供了一個基於springmvc的控制器,整合了微信伺服器繫結、監聽所有型別訊息的方法 使用時繼承,重寫即可,十分方便 
http://git.oschina.net/pyinjava/fastweixin  oschina活躍度排名第一,已經發布了16個版本。專案活躍度很高。 
wechat  微信公眾平臺是騰訊公司在微信的基礎上新增的功能模組,通過這一平臺,個人和企業都可以打造一個微信的公眾號,並實現和特定群體的文字、圖片、語音的全方位溝通、互動。 微信公共平臺開發模式(JAVA) SDK

實現MessageProcessingHandler介面,配置wechat.properties
在web.xml配置過濾器 
http://git.oschina.net/gson/wechat  oschina活躍度排名第三。 
weixin-java-tools  本專案特性:

不依賴任何mvc框架
也不依賴servlet,僅僅作為工具使用,可輕鬆嵌入到任何系統裡(可能會有gson,httpclient的版本衝突問題,但是要比依賴spring mvc、struts、或者其他第三方框架好很多)
同時支援企業號和公眾號
支援Session,實現了類似於HttpSession的WxSession。
weixin-java-tools

微信公眾號、企業號Java SDK(支援Session)。

從1.0.3開始,本專案拆分成3個部分:

weixin-java-common,公共lib
weixin-java-cp,企業號SDK
weixin-java-mp,公眾號(訂閱號、服務號)SDK 
https://github.com/chanjarster/weixin-java-tools  oschina活躍度排名第五,已經發布了11個版本。專案活躍度很高。 
       
       

靜態對比分析

根據專案的文件及介紹資訊進行初步對比。
A B C D E F G H I J
sdk元件名稱  功能特性  依賴  活躍度(資料來源於oschina)  釋出版本數  文件  通用性  單元測試  程式碼結構  專案收錄時間 
fastweixin  1.微信公眾號
2.處理文字、語音、圖片、視訊、圖文訊息以及關注、取消關注事件
3.實現token過期自動重新整理機制
4.支援微信訊息安全模式
5.js-sdk支援
6.微信資料統計介面API支援 
1.spring-context
2. spring-context-support
3.spring-web
4.spring-webmvc
5.fastjson
6.httpmime
7.slf4j-api
8.logback-classic 
249收藏,2使用,4回覆  16        一般  2014年09月16日 
wechat  1.現和特定群體的文字、圖片、語音的全方位溝通、互動。
(無更加詳細的描述) 
1.async-http-client
2.xpp3
3.log4j
4.xstream
5.fastjson
6.commons-lang
7.commons-codec 
130收藏,4使用,20回覆          一般  2013年08月06日 
weixin-java-tools  1.微信公眾號 
2.微信企業號
3.處理文字、語音、圖片、視訊、圖文訊息以及關注、取消關注事件
4.支援微信訊息安全模式
5.js-sdk支援
6.支援使用者、分組和多媒體資源管理
7.支援群發訊息。
8.支援自定義選單管理。
9.支援二維碼、短連線管理。
10.支援傳送模板訊息。 
1.slf4j-api
2.logback-classic
3.fluent-hc
4.httpmime
5.gson
6.commons-codec
7.commons-io 
179收藏,2使用,4回覆  11          2014年08月26日 
                   
                   


效能對比分析

通過上述靜態對比分析可以看出來wechat這個專案雖然做得時間早,但是功能較少,文件很少,活躍度低,因此這個專案就不作為效能對比分析的物件。接下來基於fastweixin和weixin-java-tools兩個專案開發一個具有相同功能的測試公眾號,對這個公眾號的服務進行效能測試,分析測試資料。

fastweixin

使用該技術元件實測過程中,發現了一個問題,暫時還沒有解決,我測試基於該框架接受微信訊息的時候,使用了微信官方的純文字訊息傳送給該框架的Servlet,竟然報空指標的異常,訊息內容如下:

 <xml>

 <ToUserName><![CDATA[toUser]]></ToUserName>

 <FromUserName><![CDATA[fromUser]]></FromUserName> 

 <CreateTime>1348831860</CreateTime>

 <MsgType><![CDATA[text]]></MsgType>

 <Content><![CDATA[this is a test]]></Content>

 <MsgId>1234567890123456</MsgId>

 </xml>
除錯基於fastweixin開發的服務端竟然報如下異常資訊:
java.lang.NullPointerException

    at com.github.sd4324530.fastweixin.servlet.WeixinServletSupport.processRequest(WeixinServletSupport.java:146)

    at com.github.sd4324530.fastweixin.servlet.WeixinServletSupport.doPost(WeixinServletSupport.java:125)

    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)

    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
因此還未解決該問題,暫時停止對於該元件的測試。說明該元件有一些基本的質量問題。

weixin-java-tools

集中精力只測試該元件的效能表現。

測試思路分析

  • 本次測試的目的僅僅是測試sdk本身程式碼的效能,因此訊息的傳送和接受的業務程式碼使用最簡單的處理方式; 
  • 傳送訊息和其它管理微信的功能的效能嚴重依賴於微信公眾平臺服務端,而且介面的呼叫測試有很多約束,因此本文只測試基於sdk開發的接受和處理各種訊息(純文字、圖文、事件等)的效能表現; 
  • 由於無法控制微信公眾號服務端的呼叫頻次和行為。因此藉助jmeter2.13模擬微信公眾平臺服務端傳送訊息給微信公眾號服務端。 

詳細測試案例描述

純文字明文訊息

URL:/weixin-java-mp-test/api.do?signature=7b80c3c8ba83dfcdead35ad821153b44a250cb3b&nonce=6CScsLACIIrDaNCj&timestamp=1429441884
訊息內容:
 <xml>

 <ToUserName><![CDATA[toUser]]></ToUserName>

 <FromUserName><![CDATA[fromUser]]></FromUserName> 

 <CreateTime>1348831860</CreateTime>

 <MsgType><![CDATA[text]]></MsgType>

 <Content><![CDATA[這是測試訊息內容,你能收到嗎?請查詢我的帳號資訊]]></Content>

 <MsgId>99999999999999</MsgId>

 </xml>

純文字加密訊息
URL:/weixin-java-mp-test/api.do?signature=7b80c3c8ba83dfcdead35ad821153b44a250cb3b&nonce=6CScsLACIIrDaNCj&timestamp=1429441884&encrypt_type=aes&msg_signature=8a108f7c79acbe6303c90698bc535f71fc350b0e
訊息內容:
<xml>

<ToUserName><![CDATA[toUser]]></ToUserName>

<Encrypt><![CDATA[xmuDW87hRd25CNoF+QE5Y3s7DeIpX2vP7yQEgEJU6Ze4yLqj4rvfSgMa/KeKD9fhQvMSSUERCHgMQEUaArh0OSDJ23IfYE1TQ+Cfc3ECYALES2BYA8xruHmTVkCG7GQBma/3Etn7bXntyXANelgUL+xGTTOTU62eGTK9cimaH5u+guKM4mm3j7rt5BrwqMnSR1NjRYY033aYiEm4PLpZjvxHylLVDgLCe0z8p313BXsXPdUDbRnxfAdReqHeA5S415KigVZOTvMg4tElqatnO5O1OGF1FW5T0Ze0X3HQXqmexMHAiU4+Y7QFJmHkfAXJa/M0GOSpu1+IJi++/97/8CFHbnHH1+n99gY+TUP4dh3fo+8x/REwXfV0Bd25a4cq5IX1wd3b4ttDdxX2Y0dQ7hMVmeZ3UNC5K/qnN/CHk1E6YR7qKHPO6HyXB3MPuy+8mJyGV1bjSyeMBWgN93w+nmBwAxjerwiszrUb2rf8gYMPAN++muMs/EBikffybrhM]]></Encrypt>

</xml>

按鈕點選訊息
URL:/weixin-java-mp-test/api.do?signature=7b80c3c8ba83dfcdead35ad821153b44a250cb3b&nonce=6CScsLACIIrDaNCj&timestamp=1429441884
訊息內容:
 <xml>

 <ToUserName><![CDATA[toUser]]></ToUserName>

 <FromUserName><![CDATA[fromUser]]></FromUserName> 

 <CreateTime>1348831860</CreateTime>

 <MsgType><![CDATA[event]]></MsgType>

<Event><![CDATA[CLICK]]></Event>

<EventKey><![CDATA[文章]]></EventKey>

 </xml>

效能測試結果

10執行緒迴圈100次兩次請求間隔0


30執行緒迴圈100次兩次請求間隔0

50執行緒迴圈100次兩次請求間隔0
100執行緒迴圈100次兩次請求間隔0.
200執行緒迴圈100次兩次請求間隔0.
jmeter執行過程中控制檯報警告,資訊是:2015/04/19 20:43:32 WARN - com.atlantbh.jmeter.plugins.rest.RestSampler: Address already in use: connect

測試結果對比分析

A B C D
執行緒數(迴圈100次)  吞吐量(請求數/秒)  平均響應時間  失敗率 
10  426 
30  535 
50  531 
100  434 
200  189  10.88% 
根據上述測試結果對比分析出以下結論:
  • 該測試在30-50個併發執行緒的時候吞吐量最高,200個執行緒的時候出現了大量的客戶端異常導致失敗,吞吐量開始下降。 
  • 使用AES對訊息解密和加密的安全措施對於效能的損耗較小。因此接收和傳送訊息使用加密的策略對於效能的損耗較小。 
  • 總體平均響應時間在6毫秒左右,基於weixin-java-mp元件開發的服務端效能不錯,在併發的情況下未見服務端異常。 

分析總結

經過靜態分析對比、使用測試和效能測試綜合分析,我認為在java平臺中開發微信公眾號服務端基於weixin-java-mp開源框架是最值得推薦的開源sdk.

它的優點有這些:

  • 功能強大;包括公眾號和企業號兩個元件,公眾號幾乎所有的api都支援,若不知的還可以呼叫高階介面。 
  • 擴充套件性強;weixin-java-mp的程式碼結構設計合理,預留了較多擴充套件點,很容易自行擴充套件。 
  • 程式碼質量高;看了一些weixin-java-mp的程式碼,感覺該元件的質量非常高,設計精良,而且有大量的單元測試更加對該元件質量信心; 
  • 效能良好;上述測試結果表明該元件自身程式碼在多執行緒併發測試的場景下並未發現效能和質量問題; 
  • 通用性強;weixin-java-mp元件的第三方依賴較小,不依賴任何IOC、MVC容器,也不依賴於servlet,只是一個基礎的微信api包裝服務,可以在任何java專案中整合。 
  • 有非常詳細的文件,見:https://github.com/chanjarster/weixin-java-tools/wiki
它的侷限性有這些:
  • 缺少與Servlet和Spring等同用框架的整合,給開發者增加了更高的學習和使用成本,應該基於weixin-java-mp開發一些快速上手的一些模組,以提高開發者使用效率; 
對於大多數的場景我都推薦使用weixin-java-mp作為基礎開發框架,它相對而言確實是一個更好的選擇。

相關資源

上述測試的原始碼及指令碼請參考如下地址:
https://git.oschina.net/ywbrj042/weixin-java-mp-test
https://git.oschina.net/ywbrj042/fastweixin-test


相關文章