3

十年磨一剑,匠心打造中国人自己的网络编程架构t-io

 2 years ago
source link: https://segmentfault.com/a/1190000040712470
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

十年磨一剑,匠心打造中国人自己的网络编程架构t-io

发布于 今天 10:33

中国人拥有了完全自主的高性能网络编程框架t-io。
通过十多年对底层技术的潜心研究,终于打磨出中国人自己的完全自主的开源网络编程软件t-io。
1、什么是t-io
t-io是基于java开发的一个开源的网络编程架构,大家都知道现在手机上或者电脑上都装了很多APP,这些APP都不是一个个在手机上或电脑上孤立的使用,而是能访问其他的地方数据或者与其他节点进行实时聊天,故每个APP中都要有一个对外进行通信的模块,这块内容从编程的角度来看就能通过网络编程框架来实现,t-io就是完成这块的内容的最好的编程软件。
软件开发人员要开发一个新的应用,对于软件中的通信模块如果使用tio就不要专门开发新的通信模块,这样节省了开发时间,可以专注于打磨软件中的其他内容,而且即使自己开发类似的对外通信的网络架构,也不一定能达到使用t-io的通信效果,我们知道一个好的流行的APP可能同时访问的人非常多,几十万、几百万、甚至几千万上亿同时访问,这样对于网络架构的设计就非常关键,如果设计不好就可能满足不了这样大的用户同时访问APP,如果出现这么大的访问量,可能导致死机,通信中断,通信太慢等等情况。
t-io经过创始人谭先生的精心打磨,性能超强,已经达到运营的的级别,用t-io写的程序每秒能处理1000+万条消息,1.9G内存能够支撑30万TCP长连接。
每秒处理1051万条消息:
image.png
1.9G内存支撑30万TCP长连接:
image.png
测试现场一:https://www.tiocloud.com/41
测试现场二:https://www.tiocloud.com/61
基于tio开发的即时通讯软件谭聊,目前是业界性能最强的全开源销售即时通讯软件。
https://www.tiocloud.com/2/pr...
2、APP中的数据在网络中的传输
了解网络中的数据传输,能更好的理解t-io在软件中的作用,APP中的应用数据要在网络中传输,也必须要严格遵守OSI或者TCP/IP协议按照封装的要求进行分片打包,才能在IP网络中传输,所以先了解一下OSI和TCP/IP的相关数据包的封装和解封装过程。
image.png

                  OSI和TCP/IP的分层协议栈对应关系

image.png

                  OSI和TCP/IP协议栈每层对应的协议和应用

image.png

                  Socket位于TCP/IP协议栈中的位置

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
从以上图示可以知道tio完成的功能属于传输层和应用层之间的封装,以及和链接的建立。
下面说明tio在软件中的具体使用过程:
APP要完成设计的各项功能,必须在客户端和服务端之间先建立有连接或者无连接交互通信链路,然后再在这条链路上传输数据,t-io就能完成这个链路的建立。
image.png

                      APP应用交互节点部署

image.png

                      APP通信具体实现逻辑图

物理层,指的是电信号的传递方式,透明的传输比特流。 
链路层,在两个相邻结点间的线路上无差错地传送以帧为单位的数据。
网络层,负责为分组交换网上的不同主机提供通信,数据传送的单位是分组或包。
传输层,负责主机中两个进程之间的通信,数据传输的单位是报文段。
网络层负责点到点(point-to-point)的传输(这里的“点”指主机或路由器),而传输层负责端到端(end-to-end)的传输(这里的“端”指源主机和目的主机)。
数据传输到对方,必须先按照TCP/IP协议进行封装,封装成一个标准的链路层包后,然后通过物理层传输到对方后,对方再进行解封装,取出应用层数据。
image.png
image.png
从以上讲解的APP的通信过程中知道,如果各种应用在开发过程中调用t-io则,不用开发相关的网络通信方面的模块,更多的时间和精力专注于具体应用功能的开发,这样省时、省力,加速应用的上市。
3、t-io的核心模块
t-io包含框架实现的核心模块tio-core,还有tio-websocket-server、tio-http-server、tio-udp-server、tio-webpack-core、tio-flash-policy-server等,后面所列都是基于tio-core开发的应用层组件。
tio-core:基于java aio开发的网络编程框架。使用示例:tio-study。
tio-websocket-server:基于tio-core开发的websocket服务器。使用示例:tio-websocket-showcase。
tio-http-server:基于tio-core开发的http服务器。使用示例:tio-http-server-showcase。
tio-udp-server:基于tio-core开发的udp服务器。使用示例:tio-udp-showcase。
tio-websocket-client:基于tio-core开发的websocket客户端。
tio-webpack-core:基于tio-core开发的js/css/ht ml编译压缩工具。
4、t-io功能介绍
TCP Server&Client:
1)编解码处理:源文件为AioHandler.java
2)启动:源文件为TioServer.java/TioClient.java
3)各种事件处理:源文件为AioListener.java
4)TCP连接上下文:源文件为ChannelContext.java
5)实用方法:源文件为Tio.java
6)全局配置:源文件为TioConfig.java
HTTP Server:
完整的实现了HTTP 1.1,t-io内部也大量使用了tio-http,POM引入
image.png
Websocket Server:
完整的实现了Websocket协议,t-io内部也在大量使用tio-websocket,POM引入
image.png
UDP Server&Client:
UDP是一个非连接的协议,传输数据之前源端和终端不建立连接, 当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。 在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、 计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
tio-udp是包含在tio-core的一个功能子集,具体实现请学习:
把工程以maven的形式导入到eclipse后
运行org.tio.showcase.udp.server.ShowcaseUdpServerStarter启动udp服务器,启动成功后,日志如下
image.png
运行org.tio.showcase.udp.client.UdpClientStarter
观察服务器端的console,会看到如下日志
image.png
流量监控和统计:
目前唯一一个内置完整流量监控和统计的网络框架
image.png
同步消息:
指A给B发送一条消息后,A在原线程中等待B给出一条对应的响应消息,用其它网络框架实现这样的功能,需要开发人员精通多线程协作,极易产生死锁,而t-io已经内置了发送同步消息的能力,使用也非常简单。
心跳检查:
t-io内置了检测心跳超时的任务,当发现某连接在指定时间内没有发生任何数据收发,则断开该连接。
心跳发送:
t-io内置了发送心跳消息的任务,用于判断连接状态。
集群功能:
企业版t-io(集群版)内置了集群能力,用户只需要在启动的时候加几行配置代码,便能轻松拥有集群能力,这时可同时支撑1亿+长连接。
image.png
集群服务器路由:
集群架构中,各台服务器之间有完整的路由信息完成服务器之间的业务交互。
image.png
集群架构中的消息路由:
集群业务中有各种路由来指导业务消息发送相关的业务节点。
image.png
协议适配:
t-io内置了协议适配能力,让一套业务代码可同时支持多个协议,这样能避免重复开发,重复测试,重复BUG。
image.png
并发数据结构:
t-io自创了大量数据结构,将并发编程难度降到最低,主要包含:
ObjWithLock,ListWithLock,CollectionWithLock,SetWithLock,MapCollectionWithLock,MapListWithLock,MapSetWithLock,MapWithLock
半包粘包:
框架层已经做好半包和粘包的工作,业务层不需要考虑在传输过程中的数据包的结构,只需要按着业务协议解码即可。
image.png
image.png
自动重连:
用t-io作为TCP客户端时,内置了自动重连功能,用户只需要在启动时,配置ReconnConf 对象即可,如果业务自己实现自动重连,至少要浪费高级工程师5-10个工作日来完成该功能。
SSL功能:
SSL(Secure Sockets Layer 安全套接字协议)协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持,而t-io内置支持SSL,只需要一行代码:
serverTioConfig.useSsl("/cert/xxx.jks", "/cert/xxx.jks", "password");
IP拉黑:
拉黑某个IP的时候,t-io会自动把该IP下的连接全部断开,并且不再接受来自该IP的连接,直到业务把该IP从黑名单中解除。结合t-io的监控数据,可以很方便地实现自动拉黑能力。
锁工具:
为了更便捷地利用读写锁,t-io提供了一个被用户称为“出神入化”的锁工具类,将锁使用的出错率降至最低,锁用不好,对项目就是灾难,如果业务项目中大量使用这些t-io提供的锁工具,既高效又不易出错。
image.png
缓存工具:
t-io在第三方专业缓存的基础上,封装了两级缓存,同时提供了一个缓存工具类,用一套编程接口便可在多种缓存间自由切换,t-io内部大量使用了这些缓存工具,将性能发挥到极致。
image.png
image.png
群组管理:
将多个TCP连接关联到一个或者多个群组(多对多),这样就能很容易实现上层业务的群组管理功能,可以实现一对一或者一对多的群业务。
image.png
image.png
用户管理:
将一个TCP连接关联到一个用户(一对多)
image.png
image.png
Token管理:
将一个TCP连接关联到一个Token(一对多)
image.png
image.png
业务ID管理:
将一个TCP连接关联到一个业务ID(一对一)
image.png
image.png
IP管理:
一个TCP连接对应一个客户端IP(一对多)
image.png
image.png
ID管理:
一个TCP连接自动产生一个唯一ID(一对一)
image.png
image.png
5、t-io使用案例
保守估算,正在使用t-io的企业有10000+,并且还在不断增加中,以下仅展示部分使用过t-io或购买过t-io授权的公司。
更多案例,请参考:https://www.tiocloud.com/2/ca...
image.png


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK