閱讀本文約「5.5分鐘」git
最近又有粉絲加Q羣討論netty整合SSM項目的方式等,我在這裏抽了休息日的時候整理一下,一步一步的記錄,注意的是,本案例僅實現了用netty整合SSM後與單片機等類TCP應用通訊。github
SSM + Netty項目結合思路數據庫
對於Netty大體以爲是邁向中級開發的必備通訊框架,它是輕量級的,且其架構的演進也是至關的出色。對於更多的Netty基礎知識我也在去年開發中作了記錄,你們能夠閱歷公衆號歷史查看Netty相關技術知識,案例項目是我主導開發的上一個大型項目,相似共享充電寶的共享應用,一樣主體是小程序,而其中硬件中,嵌入式選用單片機做爲主體開發,我則在IOT與Netty中糾結,最後選用Netty也是大部分通訊架構都是基於Netty進行重構設計的,相似京東內部應用通訊架構也是Netty爲基礎。小程序
Netty與傳統的通訊架構不同,它採用了雙層概念,這是我本身身實現都的一種白話型理解,兩個工做流或容器(ChannelGroup)一個來處理鏈接實例,一個來處理正在鏈接通訊。segmentfault
使用Netty個人容器能夠僅開啓監聽一個端口,以後的鏈接通訊均交給Netty來實現,固然通訊的數據格式也要統一,幀頭、幀尾、加密(項目採用CRC16)等等。服務器
以上是真實項目的netty包下的目錄截圖,一些基本工具類是爲了解密與雙向通訊發送的實現,因爲單片機使用TCP,因此咱們要自定義一個TCP的Handler,加入Netty的handler鏈中,心跳機制就多說了,主要還有Db層,這是用於在接收到數據,當即進行數據庫的讀寫操做,因爲項目自己使用MyBatis做爲數據的持久層,可是在Handler中並不能很好的處理,因此我使用了原生的數據庫鏈接,並在數據通訊的不一樣類型中,使用線程來執行數據庫操做。mybatis
如上圖的示例,還有就是連接對象的惟一性,channelId與channel自己的對應要作好處理,我使用了全局的map來收集,並作了防禦機制,同一channel示例,若是連接成功後,出現不一致的channelId發送信息時,系統會自動斷開此危險連接。架構
對於netty的使用還不是很深刻,還須要更多的反覆推敲。app
項目以放置github,接下來的文檔代碼塊均用截圖表示,你們能夠去github查看具體的代碼資料框架
首先我用IDEA進行項目的初始化
接下初始化對應的pom文件還有配置文件
主要仍是版本問題,其餘版本我還沒試過,因此坑的話,你們還要繼續踩踩。
主要是netty中鏈接池對數據的處理,是在線程中執行的,Spring框架注入的Service組件存在失效的問題,我使用了大部分辦法仍是沒法處理,最後就直接用原生的mybatis方式進行數據操做,因此congif文檔是針對netty操做數據庫而特別準備的配置文件。mappers能夠時mybatis自動生成,也能夠是本身寫的xml文件。
本項目的mybatis集成Spring也是無缺的,靜靜netty的數據操做須要再定義一層數據持續化池。
項目經過引入netty5.0,經過監聽器形式,啓動netty線程(NettyServerThread),於後啓動對應的NettyServer,其中啓動永久監聽還有定義本身的TCPServerhandler,在數據讀取方法中,從新定義本身的業務處理。 在接收成功,數據格式正常的狀況下,執行對應的數據層操做,且每個實例鏈接進來時,系統內存會對其進行ID與實例的綁定與存儲,也所以方便Controller層對其連接實例進行查詢信息與下發指令。
相關目錄介紹均以放置Github上了喲。
沒錯就是 UncleCatMySelf ,本人地址下最新的項目。
接下來咱們來看看項目的實測調試效果吧,咱們須要運行CRC16跑出對應通訊格式的密文,而後再由TCPIPMyself去執行,固然首先是運行起咱們的項目。
服務器接收成功後也會執行相應的任務,這裏第一次執行錯誤,是由於業務上,這條ID是在數據庫裏面不存在的,因此更新失敗。
而咱們項目在實測時也是將項目發佈到測試服務器,經過TCP模擬工具進行測試鏈接,當數據格式正常,且業務數據正常,服務器就會對指令執行對應的操做。
咱們再看看API方面的問題,當實例鏈接正常時,暴露出來的nettyAPI應該就是沒問題的。不信?咱們來看看效果怎麼樣
確實是沒問題的,不過本項目仍是應該還有部分坑存在,再次將源碼分享給你們,但願你們一塊兒踩坑,且本人平時較忙因此相關項目的代碼維護也是有時間才弄的,畢竟最近在準備(軟考中級的設計師,且對機器學習也有了興趣),嗯,各位應該懂的!
本文已轉載我的技術公衆號:UncleCatMySelf
歡迎留言討論與點贊
上一篇推薦:【Java貓說】SSM+Netty實現軟硬件通訊,真實項目案例
下一篇推薦:【Java貓說】項目架構的演進史(大型電商系列)