原文:https://www.oschina.net/p/t-io
注意:還是盡量去看原文,因為原文下面的評論也很有意思,可以參考大牛的討論學習到新的東西
t-io: 讓天下沒有難開發的網絡編程
舊時王謝堂前燕,飛入尋常百姓家----當年那些王謝貴族們才擁有的"百萬級即時通訊"應用,將因為t-io的誕生,紛紛飛入普通人家的屋檐下。
t-io是啥
-
大家口中的t-io一般是指tio-core,它是基於java aio的網絡編程框架,和netty屬於同類
-
基於tio-core來開發IM、TCP私有協議、RPC、游戲服務器端、推送服務、實時監控、物聯網將會變得空前的簡單。
-
t-io家族除了tio-core外,還有tio-websocket-server、tio-http-server、tio-webpack-core、tio-flash-policy-server等,后面所列都是基於tio-core開發的應用層組件
-
列一下t-io家族成員:
-
tio-core:基於java aio的網絡編程框架。使用示例:tio-showcase
-
tio-websocket-server:基於tio-core開發的websocket服務器。使用示例:tio-websocket-showcase
-
tio-http-server:基於tio-core開發的http服務器。使用示例:tio-http-server-showcase
-
tio-webpack-core:基於tio-core開發的js/css/html編譯壓縮工具,代碼已經開源,但尚無使用文檔和示例,暫時屬於內用階段,使用案例:http://www.nb350.com
-
tio-flash-policy-server:基於tio-core開發的flash-policy-server,代碼已經開源,但尚無使用文檔和示例
-
列一下tio-core應用場景的一些案例
-
IM:j-im
-
游戲服務器端:貝密游戲
-
推送服務:牛吧雲播
-
物聯網:氦氪雲
-
TCP私有協議:這個太多了,直接看案例列表吧
tio-core提供了哪些功能
-
內置對半包和粘包的處理:源碼分析見:https://my.oschina.net/talenttan/blog/1610690
-
ChannelContext資源維護:會話資源維護是個工程量大,復雜度高的活,尤其是涉及到各種資源綁定、解綁、遍歷時,極易出錯和OOM,不過這些復雜的事件tio-core全部給你做好了,除非你要自己額外去綁定資源
-
心跳檢測(防止不良客戶端占着TCP連接無所事事)
-
心跳發送(client)
-
斷鏈重連(client)
-
流量監控統計,既提供單條ChannelContext流量統計,又提供所有ChannelContext流量統計,下面所列為部分監控數據,詳情請見:ChannelStat.java和GroupStat.java
-
已接收的字節數
-
已接收了多少次TCP數據包
-
已接收的packet數
-
已處理的字節數
-
已處理的packet數
-
處理消息包耗時,單位:毫秒。拿這個值除以handledPackets,就是處理每個消息包的平均耗時
-
已發送的字節數
-
已發送的packet數
-
最近一次收到業務消息包的時間(一個完整的業務消息包,一部分消息不算)
-
最近一次發送業務消息包的時間(一個完整的業務消息包,一部分消息不算)
-
最近一次收到業務消息包的時間:收到字節就算
-
最近一次發送業務消息包的時間:發送字節就算
-
第一次連接成功的時間
-
進入重連隊列時間
-
userid綁定(將ChannelContext和業務中的userid綁定,並提供查詢、發送、解綁等API供業務端使用,一個userid可以綁定多個ChannelContext)
-
org.tio.core.Tio.bindUser(ChannelContext channelContext, String userid):將ChannelContext和userid綁定
-
org.tio.core.Tio.sendToUser(GroupContext groupContext, String userid, Packet packet):基於userid異步發送消息
-
org.tio.core.Tio.bSendToUser(GroupContext groupContext, String userid, Packet packet):基於userid阻塞發送消息
-
org.tio.core.Tio.getChannelContextsByUserid(GroupContext groupContext, String userid):通過userid獲取ChannelContext
-
org.tio.core.Tio.unbindUser(GroupContext groupContext, String userid):解綁指定的userid
-
org.tio.core.Tio.unbindUser(ChannelContext channelContext):解綁所有的userid
-
token綁定(將ChannelContext和業務中的token綁定,並提供查詢、發送、解綁等API供業務端使用,一個token可以綁定多個ChannelContext)
-
方法基本同userid綁定,不一一列舉
-
group綁定(將ChannelContext和群組綁定,並提供查詢、發送、解綁等API供業務端使用,一個group可以綁定多個ChannelContext,如果你有IM群聊場景,這個功能會大大減少你的業務端代碼)
-
方法基本同userid綁定,不一一列舉
-
bsId綁定(將ChannelContext和業務id綁定,並提供查詢、發送、解綁等API供業務端使用,一個bsId只能綁定一個ChannelContext)
-
方法基本同userid綁定,不一一列舉
-
框架內置自動和ip綁定(將ChannelContext和對端ip綁定,並提供查詢、發送等API供業務端使用)
-
org.tio.core.Tio.sendToIp(GroupContext groupContext, String ip, Packet packet, ChannelContextFilter channelContextFilter)
-
org.tio.core.Tio.sendToIp(GroupContext groupContext, String ip, Packet packet)
-
org.tio.core.Tio.bSendToIp(GroupContext groupContext, String ip, Packet packet, ChannelContextFilter channelContextFilter)
-
org.tio.core.Tio.bSendToIp(GroupContext groupContext, String ip, Packet packet)
-
框架內置自動和ip:port綁定(將ChannelContext和對端ip:port綁定,並提供查詢、發送等API供業務端使用)
-
org.tio.core.Tio.send(GroupContext groupContext, String ip, int port, Packet packet)
-
org.tio.core.Tio.bSend(GroupContext groupContext, String ip, int port, Packet packet)
-
框架內置自動和唯一uuid綁定(將ChannelContext和對端uuid綁定,並提供查詢、發送等API供業務端使用)
-
org.tio.core.Tio.sendToId(GroupContext groupContext, String channelId, Packet packet)
-
org.tio.core.Tio.bSendToId(GroupContext groupContext, String channelId, Packet packet)
-
提供IP拉黑功能
-
org.tio.core.Tio.IpBlacklist.add(GroupContext groupContext, String ip):把指定ip拉黑
-
org.tio.core.Tio.IpBlacklist.remove(GroupContext groupContext, String ip):從黑名單中移除
-
org.tio.core.Tio.IpBlacklist.isInBlacklist(GroupContext groupContext, String ip):是否在黑名單中
-
org.tio.core.Tio.IpBlacklist.clear(GroupContext groupContext):清除黑名單
-
提供了分頁查詢會話功能
-
Page org.tio.core.Tio.getPageOfAll(GroupContext groupContext, Integer pageIndex, Integer pageSize)
-
Page org.tio.core.Tio.getPageOfAll(GroupContext groupContext, Integer pageIndex, Integer pageSize, Converter converter)
-
Page org.tio.core.Tio.getPageOfGroup(GroupContext groupContext, String group, Integer pageIndex, Integer pageSize
-
Page org.tio.core.Tio.getPageOfGroup(GroupContext groupContext, String group, Integer pageIndex, Integer pageSize, Converter converter)
-
異步發送能力(把packet丟到隊列即返回)
-
Tio.java中以send開頭的方法,譬如sendToAll()、sendToUser()、sendToGroup()等
-
阻塞發送能力(確認把packet發送到對端后再返回)
-
Tio.java中以bSend開頭的方法,譬如bSendToAll()、bSendToUser()、bSendToGroup()等
-
同步發送能力(相當於act機制,需要業務端配合設置synSeq才能完成此功能)
-
org.tio.core.Tio.synSend(ChannelContext channelContext, Packet packet, long timeout)
-
基於t-io已經實現了tio-http-server
-
基於t-io已經實現了tio-websocket-server
-
基於t-io已經實現了IM能力
-
提供UDP能力
-
內置SSL能力,業務層只需要添加一行:https://my.oschina.net/talenttan/blog/1587197
-
groupContext.useSsl("/cert/xxx.jks", "/cert/xxx.jks", "******");
-
內置集群能力,這里也有一篇關於tio集群的文章,可以參考:https://my.oschina.net/zyw205/blog/1827495
-
org.tio.core.GroupContext.setTioClusterConfig(TioClusterConfig tioClusterConfig)
-
內置群組成員排序能力,一般用在直播間成員排序顯示、IM群組排序顯示等需要排序的場景
-
groupContext.groups.setChannelContextComparator(Comparator channelContextComparator)
t-io性能
-
t-io 30萬TCP長連接測試報告,見:https://my.oschina.net/u/2369298/blog/915435
-
tio官網不間斷運行88天,各項監控數據良好,見:https://gitee.com/uploads/images/2018/0607/150205_de698afe_351037.png
t-io生態
-
在冊案例(更多的案例是不在冊的):https://t-io.org/case/index.html
-
t-io相關博客:https://www.oschina.net/search?q=t-io&scope=blog&sort_by_time=1
-
t-io相關討論:https://www.oschina.net/search?q=t-io&scope=bbs&catalog=1&sort_by_time=1
引入t-io
-
如果你只是想用tio-core,只需引入
dependency>groupId>org.t-iogroupId>artifactId>tio-coreartifactId>version>3.0.6.v20180626-RELEASEversion>dependency>
-
如果你想用tio-websocket-server,只需引入
dependency>groupId>org.t-iogroupId>artifactId>tio-websocket-serverartifactId>version>3.0.6.v20180626-RELEASEversion>dependency>
-
如果你想用tio-http-server,只需引入
dependency>groupId>org.t-iogroupId>artifactId>tio-http-serverartifactId>version>3.0.6.v20180626-RELEASEversion>dependency>
-
查看t-io最新版本
用於學習t-io各組件的showcase工程
-
tio-showcase (學習tio-core的最好示例)
-
tio-websocket-showcase (學習tio-websocket-server的最好示例,這里有篇文章可以看一下:https://my.oschina.net/talenttan/blog/1806324)
-
tio-udp-showcase (學習tio-udp-server的最好示例,這篇博客可以參考:https://my.oschina.net/talenttan/blog/1823774)
-
tio-http-server-showcase (用於學習tio-http-server,可以關注里面的TestController)
t-io番外
學習tio-core的步驟
-
熟練掌握ByteBuffer的使用,這是所有基於aio/nio編程的必修課程,這個懶沒人躲得掉
-
下載tio-core示范程序:tio-showcase
-
導入到eclipse或其它ide中
-
對照helloworld例子和t-io的hello world走一遍
-
下載t-io源代碼:t-io
-
簡單地掃一下:org.tio.core.ChannelContext.java
-
簡單地掃一下:org.tio.core.GroupContext.java
-
簡單地掃一下:org.tio.core.Tio.java
-
最好要掌握org.tio.utils.lock.ObjWithLock及其子類(因為多線程環境下,對集合的遍歷、元素刪除、元素添加等操作必須是線程安全的)
-
我的個人博客可以關注一下,上面有不少t-io的文章:三流程序員的博客
-
忠告:tio-core已經封裝了大量網絡開發細節,如果你連上面的步驟都不願意走一遍,建議你還是繼續你的CRUD編程。
t-io推薦
-
智能客服系統 + 呼叫中心
-
服務了上萬家的優質客服系統:優客服 - 開源的智能客服系統 + 呼叫中心
-
更專業的通用后台管理模板----layuiAdmin,layui作者親自傾力打造