前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >了解t-io基本知识以及概念

了解t-io基本知识以及概念

作者头像
Blue_007
修改2023-11-17 16:05:57
1.3K0
修改2023-11-17 16:05:57
举报
文章被收录于专栏:代码生涯代码生涯

注:本文不会讲解网络编程中的一些基础知识(如半粘包,七层协议等),默认你学习使用过Netty或了解过网络编程

一、Tio 和 Netty 🎨

众所周知 Netty 作为 NIO 网络应用框架,可以帮助我们 快速开发高性能、高稳定的网络通信服务,它的强大已经在各种知名技术(如Dubbo、RocketMQ)中体现。网上也一直有流传 想成为一位高级工程师,Netty将是你必须要掌握的技术栈。

Tio 一般是指 Tio-core,它是基于AIO 的网络编程框架,和Netty 属于同类。

Netty 已经很强大了,那如何要去使用 Tio 呢?

  1. 基于 Tio-core 来开发IM、TCP私有协议、RPC、游戏服务器端、推送服务、实时监控、物联网、UDP、Socket将会变得空前的简单;
  2. t-io家族除了tio-core外,还有tio-websocket-server、tio-http-server、tio-webpack-core、tio-flash-policy-server等(都基于tio-core开发的应用层组件);
  3. 使用它,你甚至可以不用了解什么叫BIO、NIO、AIO,便可以上手网络编程,它在 GTIEE 官网有一句话:网络编程很苦,用t-io后会很甜

Tio 是从项目抽象出来的框架,所以 Tio 提供了更多的和业务相关的API,大体上具有如下特点和能力:

  • 内置IP拉黑
  • 极其稳定的表现
  • 内置慢攻击防御
  • 内置半包粘包处理
  • 一骑绝尘的资源管理能力
  • 内置完备的监控和流控能力
  • 唯一内置集群分发消息的能力
  • 内置心跳检查和心跳发送能力
  • 唯一一个内置异步发送、阻塞发送、同步发送的网络框架
  • 一流性能和稳定性(第三方权威平台TFB提供性能测试和稳定性服务)
  • 独创协议适配转换能力(让基于websocket和基于socket的应用看起来像是同一个协议)
  • 独一档的资源和业务绑定能力:绑定group、绑定userid、绑定token、绑定bsId,这些绑定几乎囊括了所有业务需求
  • 独创的多端口资源共享能力(譬如一个端口是websocket协议,一个端口是私有的im协议,这两个端口的资源可以共享,这对协议适配极其有用)

二、介绍 ⚽

我们使用 Tio 其实就是大量使用Tio这个类提供的各种方法,我们先来了解一些方法和基础类

2.1 业务数据绑定 🎍

资源绑定是指把业务相关的数据和 Tcp连接(即ChannelContext)关联起来,譬如ChannelContext-A代表了用户张三,张三的userid是 1

(什么是ChannelContext在 2.3 中讲解)

代码语言:javascript
复制
// t-io目前内置了4种资源绑定
// 绑定用户
Tio.bindUser(ChannelContext-A, "1");
// 绑定token
Tio.bindToken(ChannelContext-A, "fdsafd1513f1dasf15");
// 绑定群组 如 pc-用户id
Tio.bindGroup(ChannelContext-A, "pc-1");
// 绑定业务id
Tio.bindBsId(ChannelContext-A, "30001");

2.2 业务数据解绑 🎃

既然有绑定,就肯定会有解绑,这是个和绑定相反的操作

代码语言:javascript
复制
 /**
   * 解绑业务id
   * @param channelContext
   */
  public static void unbindBsId(ChannelContext channelContext) {
      channelContext.tioConfig.bsIds.unbind(channelContext);
  }
  /**
   * 与所有组解除解绑关系
   * @param channelContext
   */
  public static void unbindGroup(ChannelContext channelContext) {
      channelContext.tioConfig.groups.unbind(channelContext);
  }
  /**
   * 与指定组解除绑定关系
   * @param group
   * @param channelContext
   */
  public static void unbindGroup(String group, ChannelContext channelContext) {
      channelContext.tioConfig.groups.unbind(group, channelContext);
  }
  /**
   * 解除channelContext绑定的token
   * @param channelContext
   */
  public static void unbindToken(ChannelContext channelContext) {
      channelContext.tioConfig.tokens.unbind(channelContext);
  }
  //    org.tio.core.TioConfig.ipBlacklist
  /**
   * 解除channelContext绑定的userid
   * @param channelContext
   */
  public static void unbindUser(ChannelContext channelContext) {
      channelContext.tioConfig.users.unbind(channelContext);
  }
  /**
   * 解除userid的绑定。一般用于多地登录,踢掉前面登录的场景
   * @param tioConfig
   * @param userid
   */
  public static void unbindUser(TioConfig tioConfig, String userid) {
      tioConfig.users.unbind(tioConfig, userid);
  }

2.3 ChannelContext 对象 🎃

Tio 中每一个tcp连接的建立都会产生一个ChannelContext对象,这是个抽象类,如果你是用t-io作tcp客户端,那么就是ClientChannelContext,如果你是用tio作tcp服务器,那么就是ServerChannelContext。

ChannelContext是 Tio 中非常重要的类,它是业务和连接的沟通桥梁。

2.4 发送数据 🎎

2.4.1 异步发送 🧵
  • 异步发送,指的是业务层把Packet丢给Tio 后立即返回,返回时Packet并没有被发送,而只是提交到了待发送队列
  • 异步发送都是以send开头的
  • Packet在 2.6 中讲解
  • TioConfig在 2.5 中讲解
2.4.2 阻塞发送 🦺
  • 阻塞发送:Tio 把Packet送给对方后才返回
  • 阻塞发送都是以bSend开头的
  • Packet在 2.6 中讲解
  • TioConfig在 2.5 中讲解

2.5 TioConfig 🧦

可以看到上面的发送方法,不管是异步、阻塞,参数列表都需要一个TioConfig对象,那它是什么呢?

场景:我们在写TCP Server时,都会先选好一个端口以监听客户端连接,再创建N组线程池来执行相关的任务,譬如发送消息、解码数据包、处理数据包等任务。还要维护客户端连接的各种数据,为了和业务互动,还要把这些客户端连接和各种业务数据绑定起来,譬如把某个客户端绑定到一个群组,绑定到一个userid,绑定到一个token等。

TioConfig 就是解决以上场景的:配置线程池、监听端口,维护客户端各种数据等的。

  • TioConfig是个抽象类
    • 一个监听端口对应一个ServerTioConfig ,一个jvm可以监听多个端口,所以一个jvm可以有多个ServerTioConfig对象
    • 服务器端对应一个ClientTioConfig对象
    • 如果你是用tio做tcp客户端,那么你需要创建ClientTioConfig对象
    • 如果你是用tio做tcp服务器,那么你需要创建ServerTioConfig

上面有讲到,一个tcp连接就是一个ChannelContext对象,而每一个而ChannelContext对象又拥有对应TioConfig对象,我们调用发送消息方法,传递的 TioConfig 就是 这个用户(tcp连接)对应的各种数据和配置。

2.6 Packet 👒

Packet是用于表述业务数据结构的,我们通过继承Packet来实现自己的业务数据结构,对于各位而言,把Packet看作是一个普通的VO对象即可。

注意:不建议直接使用Packet对象,而是要继承Packet

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-10-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 代码生涯 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二、介绍 ⚽
    • 2.1 业务数据绑定 🎍
      • 2.2 业务数据解绑 🎃
        • 2.3 ChannelContext 对象 🎃
          • 2.4 发送数据 🎎
            • 2.4.1 异步发送 🧵
            • 2.4.2 阻塞发送 🦺
          • 2.5 TioConfig 🧦
            • 2.6 Packet 👒
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档