IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 基于Zinx框架实现轻量级TCP服务器 -> 正文阅读

[系统运维]基于Zinx框架实现轻量级TCP服务器

一、框架部分

?包括一个sever,两个读、写模块、一个API管理,一个消息队列管理,一个读写池

?建目录一个抽样层,一个实体层

二、基于zinx服务器的应用

对于一个框架,越简单来说越好

V0.1:简单的服务器客户端

1、对于开始:完成简单的服务器搭建

获取addr(net.……addr(版本号,地址))、监听地址、阻塞等待客户端连接/

2、对于start来说:可能会在listen出阻塞,为了避免用一个go来承载

用户启动的时候用serve来启动,尽量避免把start和stop等接口暴露给用户

将 start和serve分离:start只进行监听和处理功能,serve进行阻塞

3、实验Client: 为了看得更清晰使沉睡一秒:time.sleep(1 time.Second)

//建立连接:net.Dail → 读/写,用一个buf接受服务端读写的数据并进行显示

V0.2:简单的连接封装和业务绑定

?1、

	// GetTCPConnection 获取当前链接所绑定的socket conn
	GetTCPConnection() *net.TCPConn

?此处的?*net.TCPConn为返回类型:

//定义一个处理链接业务的方法
type HandleFunc func(*net.TCPConn, []byte, int) error
//handlefunc表示绑定的方法,是一个函数类型,有三个形参,返回值是error的类型
//三个形参:既然是处理连接一定从对端客户端的连接句柄,从这里回写数据,处理的数据内容,处理的数据长度

绑定api连接句柄这里没太听明白

?3、连接和server集成:

三、基础路由模块:(v0.3版本智能完成一个路由模块)

1、request消息封装:将连接和数据绑定在一起,以request为一个单位请求包

router是针对request进行消息处理

?疑问:

为什么是*

?2、router模块:抽象

路由不需要方法,只是提供方法的接口,

对接口的实现应该是用户自定义而不是事先接好的,两种方法:

可以直接继承重写irouter,或者先嵌入baserouter作为基类,然后根据需求对基类方法进行重写

但是对方法不需要写死,?可以让人继承后自己重写

一个抽象的类想做一个实体类,需要把抽象层所有的方法都给实现,但实际开发中可能不需要全部,这样继承这个base后只要对需要的重写即可

3、router集成到zinx中

4、测试:

3、Vconnection路由处理请求的时候:

在定义方法的时候,pre函数里传递的是抽象的request指针,但是req为实例是request,所以

?用go func:不明白为什么用go,也不明白为什么三个都要写,这不乱了

四、v4.0:全局配置:对ip、端口号让用户可配:用json

?1、加载配置模块,建立一个配置信息

zinx.json是用户进行配置的,对于框架来说不应该存在

"Name" : " demo server" ,"Host" : "127.0.0.1"," TcpPort" :7777,
"MaxConn" : 3
创建全局参数文件→ 提供init初始化方法(读取、提取、填充)→ 硬参数替换与sever初始化参数的配置

初始化中,0.0.0.0 表示本地的全IP,127.1.1.1只适用于有回路网卡的IP,多个网卡不好用

//读取json数据并提取部分,

?用panic因为如果配置参数如果失败也没必要进行下去了

// 将之前硬代码进行替换

测试阶段:json里的属性名称要和global里的一致?

五、消息封装

1、解决粘包问题:用tlv的序列化消息

自定义的应用层协议:拆包序列化,把内容分成head和body,head中两部分一个序列号一个内容长度

Q1:为啥没有属性,封装以后不应该有个结构体吗

Q2:什么时候需要初始化方法(这里有,gloab也有)如何理解这俩地方

(2)创建一个空字节的方法(不固定)

?二进制写法:binary.Write

创建二进制阅读器:dataBuff := bytes.NewReader(binaryData)

定义输出新错误提醒的方法:errors.New("? ")

?(3)单元测试 Test (测试时要把reload关闭) :? func TestDataPack(t *testing.T)

io :读取容器

断言:

将interface换成指针用断言

Q1:第二次应该是接着后面的内容的继续读,readful不知道是续读还是重头读

Q2:客户端阻塞:select

2、将消息封装集成到zinx框架中

(1)修改request结构体,把data换成message

(2)在connection的read方法中,在处理业务时加入拆包解包过程

Q1:这里重复的用复制直接报错一大段

(3)提供封包方法(不能单纯的再给客户端写信息,回写一个二进制流的封装包)

3、zinx0.5开发

Q1:

[]byte("ping...ping...ping")和[]byte{"ping...ping...ping"}的区别

Q2:切片转换

六、多路由:根据不同的Id进行不同的业务处理

消息管理模块:支持多路由业务api调度管理

?

七、读写分离

?

八、消息队列和多任务

reader和writer是阻塞状态不占用cpu

client请求数量和goroutine一样,尽量降低,越多则切换频率越高资源消耗越大

改成固定的数值,使用消息队列,则cpu调度只在go之前切换就可以了,在极大并发量时提升效率

?每个worker都是一个go,每个go都有一个管道,构造一个简单的轮询分配

?

?

九、管理连接的模块

1、创建连接管理模块

Q:定义一个锁

?

?写锁:

2、将连接管理模块集成到zinx中

为了完成将conn加入的manager中,对一系列属性进行增加,包括server和connection,现在脑子里一团屎都等明天顺一下

3、提供给zinx创建后、销毁连接前所要处理的业务,提供给用户能够注册的hook函数

?

?实现:给开发者提供接口,唯一的接口在server

??

Q: hook函数是什么: 注册和使用

4、0.9开发

十、连接属性配置:给客户的留白

?

?

?

?

问题:

1、调用不同项目下的包:(1调2)

则1的go.mod中用replace,require

go mod 导入不同项目内的本地包_不好意思海底捞月的博客-CSDN博客

拓:Go语言go mod包依赖管理工具使用详解 (biancheng.net)

2、fmt.sprintf可以用于拼接字符串

3、在v0.2的时候,希望出现callbacktotcp

却遇到服务端报错 :

read err: read tcp4 127.0.0.1:8999->127.0.0.1:29816: wsarecv: An existing connection was forcibly closed by the remote host.
解决:http://www.suoniao.com/topic/5ffea5abce957766a2555040

?把这一部分改掉了就成了正常的,这里不太懂???

4、v0.4在全局配置信息后,服务器名称和改的过来但是IP和名称没有修改:

?且客户端报错:go: no packages loaded from .\Client.

5、v0.6: 运行报错两个信息:

read json error:, open conf/zinx.json: The system cannot find the path specified.

fatal error: all goroutines are asleep - deadlock!

改了改json没报错了,但是第二个还在,发现是客户端在listen监听的时候出现问题报错nil,

两个小时,两个小时!!!!!!我知道了因为之前有运行的进程没关闭占用端口了,刚开始不太理解这个报错信息,通过比对网上另一位同学的代码运行了他的报错是下面的,虽然不知道为啥报错信息不一样。杀掉进程就好了具体参考下面这个哥的

他的报错:

Only one usage of each socket address (protocol/network address/port) is normally permitted.

listen tcp :8080: bind: Only one usage of each socket address (protocol/network address/port) is nor_匿名用户123的博客-CSDN博客

6、delete函数(map,key)

7、v10:Q? ??panic: assignment to entry in nil map

没有对map进行初始化,只进行了定义并没有用指针开辟空间,则在connection中需要开辟内存空间

优化:1、日志模块:对日志进行存留

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-09-24 21:30:38  更:2022-09-24 21:32:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 9:18:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码