國產開源網路程式設計框架t-io使用必備:極速開發器Tio.java

語言: CN / TW / HK

Tio.java簡介

  • 為了讓使用者減少查詢API的時間,t-io把常用API以靜態方法的形式彙集於一個類,這就是Tio.java
  • Tio.java本身並不實現過複雜的業務,各業務實現仍然分佈在其它類中,Tio.java只是把使用者關心的API集中起來,便於用IDE查詢而已

業務資料繫結

  • 資源繫結是指把業務相關的資料和Tcp連線(即ChannelContext)關聯起來,譬如ChannelContext-A代表了使用者張三,張三的userid是333,就用下面的程式碼進行繫結

  • Tio.bindUser(ChannelContext-A, "333")

  • t-io目前內建了4種資源繫結,當然使用者可以靈活使用這些繫結從而解決業務層所有的資源繫結問題,譬如可以給group加字首”ios-“,從而標記這個使用者使用的是ios,譬如

  • Tio.bindGroup(ChannelContext-A, "333");
  • Tio.bindGroup(ChannelContext-A, "ios-" + "333");
  • 內建的4種資源繫結方法中,一個ChannelContext是可以繫結到多個groupid的,其它三個繫結都是一對一或多對一的關係,也就是說一個ChannelContext可以同時屬於group-a,group-b… …group-n
  • 下面貼一下這4個資源繫結的原始碼
  • /**
  • * 繫結業務id
  • * @param channelContext
  • * @param bsId
  • * @author tanyaowu
  • */
  • public static void bindBsId(ChannelContext channelContext, String bsId) {
  • channelContext.tioConfig.bsIds.bind(channelContext, bsId);
  • }
  • ``
  • /**
  • * 繫結群組
  • * @param channelContext
  • * @param group
  • * @author tanyaowu
  • */
  • public static void bindGroup(ChannelContext channelContext, String group) {
  • channelContext.tioConfig.groups.bind(group, channelContext);
  • }
  • ``
  • /**
  • * 繫結token
  • * @param channelContext
  • * @param token
  • * @author tanyaowu
  • */
  • public static void bindToken(ChannelContext channelContext, String token) {
  • channelContext.tioConfig.tokens.bind(token, channelContext);
  • }
  • ``
  • /**
  • * 繫結使用者
  • * @param channelContext
  • * @param userid
  • * @author tanyaowu
  • */
  • public static void bindUser(ChannelContext channelContext, String userid) {
  • channelContext.tioConfig.users.bind(userid, channelContext);
  • }

業務資料解綁

  • 既然有繫結,就肯定會有解綁,這是個和繫結相反的操作,所以話不多說,直接貼出不長的原始碼
  • /**
  • * 解綁業務id
  • * @param channelContext
  • * @author tanyaowu
  • */
  • public static void unbindBsId(ChannelContext channelContext) {
  • channelContext.tioConfig.bsIds.unbind(channelContext);
  • }
  • ``
  • /**
  • * 與所有組解除解綁關係
  • * @param channelContext
  • * @author tanyaowu
  • */
  • public static void unbindGroup(ChannelContext channelContext) {
  • channelContext.tioConfig.groups.unbind(channelContext);
  • }
  • ``
  • /**
  • * 與指定組解除繫結關係
  • * @param group
  • * @param channelContext
  • * @author tanyaowu
  • */
  • public static void unbindGroup(String group, ChannelContext channelContext) {
  • channelContext.tioConfig.groups.unbind(group, channelContext);
  • }
  • ``
  • /**
  • * 解除channelContext繫結的token
  • * @param channelContext
  • * @author tanyaowu
  • */
  • public static void unbindToken(ChannelContext channelContext) {
  • channelContext.tioConfig.tokens.unbind(channelContext);
  • }
  • ``
  • // org.tio.core.TioConfig.ipBlacklist
  • ``
  • /**
  • * 解除channelContext繫結的userid
  • * @param channelContext
  • * @author tanyaowu
  • */
  • public static void unbindUser(ChannelContext channelContext) {
  • channelContext.tioConfig.users.unbind(channelContext);
  • }
  • ``
  • /**
  • * 解除userid的繫結。一般用於多地登入,踢掉前面登入的場景
  • * @param tioConfig
  • * @param userid
  • * @author: tanyaowu
  • */
  • public static void unbindUser(TioConfig tioConfig, String userid) {
  • tioConfig.users.unbind(tioConfig, userid);
  • }

非同步傳送

  • 非同步傳送,指的是業務層把Packet丟給t-io後立即返回,返回時Packet並沒有被髮送,而只是提交到了待發送佇列
  • 非同步傳送都是以send開頭的,這個API有點多,貼程式碼有點長,用圖片展示更舒適些

image.png

阻塞傳送

  • 阻塞傳送:t-io把Packet送給對方後才返回
  • 阻塞傳送都是以bSend開頭的,這個API有點多,貼程式碼有點長,用圖片展示更舒適些

image.png

如何獲取ChannelContext

  • 前面的業務資料繫結,一個重要的目的就是要根據那些業務標識來獲取ChannelContext,譬如你綁定了一個userid,那麼後面就可以通過這個userid來獲取ChannelContext

  • 獲取ChannelContext的API都是以get開頭的,這個API有點多,貼程式碼有點長,用圖片展示更舒適些

image.png

斷開連線和移除連線

  • 斷開連線都是以close開頭的方法,指的是把當前已經連上的TCP連線斷開掉

image.png - 移除連線都是以remove開頭的方法,指的是徹底拋棄這個連線

image.png

注意

  • 如果是用t-io做TCP伺服器端

    • 上面兩個方法是等價的,因為伺服器不存在重連一說
  • 如果是用t-io做TCP客戶端,並且沒有配置重連

    • 上面兩個方法也是等價的,因為不需要重連,tio斷開連線後就會釋放該連線全部資源
  • 如果是用t-io做TCP客戶端,並且配置了重連規則,上面兩個方法才是有區別的,區別如下

    • close(): 不釋放相關資源,並且會進行重連
    • remove():完全釋放相關資源,不再進行重連

    叢集通知

    • t-io是內建叢集功能的,作為與業務不相關的io框架,內建叢集功能是件費力卻不見得討好的事(為啥不討好?譬如會增加程式碼複雜度、會降低tio-mvc在TFB上的跑分排名),但t-io考慮到廣大使用者的呼聲,還是內建了叢集功能
    • 目前t-io提供的訊息傳送功能,都是支援叢集的,這個從Tio.java的原始碼中就能看出來
    • 叢集通知類API都是以notifyCluster開頭的,見圖

image.png

t-io拉黑IP

簡單到極致,只需要一行程式碼 1. Tio.IpBlacklist.add(tioConfig, channelContext.getClientNode().getIp());