English | 简体中文
Zinx is a lightweight concurrent server framework based on Golang.
Document
《Zinx Documentation》
ps:
Zinx has been developed and used in many enterprises: Service of message transfer, Persistent Connection TCP/IP Server, The middleware of Web Service and so on.
Zinx is positioned for code simplicity, Developers can use Zinx to redevelop a module suitable for their own enterprise scenarios.
Source of Zinx
Github
Git: https://github.com/Yeuoly/zinx
Gitee(China)
Git: https://gitee.com/Aceld/zinx
Website
http://zinx.me
Online Tutorial
YuQue - 《Zinx Framework tutorial-Lightweight server based on Golang》
Mobile terminal(WeChat)
I. One word that has been said before
Why are we doing Zinx? There are a lot of frameworks for servers in The Go Programing Language, but very few lightweight enterprise frameworks for games or other persistent connection TCP/IP Server domains.
Zinx is designed so that developers can use the Zinx framework to understand the overall outline of writing a TCP server based on Golang, Let more Gopher can learn and understand this field in a simple way.
The Zinx framework projects are done in parallel with the coding and learning tutorials, bringing all of the progressive and iterative thinking of development into the tutorials, rather than giving everyone a very complete framework to learn at once, leaving many people confused about how to learn.
The tutorial will iterate from release to release, with minor additions to each release, giving a small, curvewise approach to the domain of the server framework.
Of course, I hope that more people will join Zinx and give us valuable suggestions, so that Zinx can become a real solution server framework for enterprises! Thank you for your attention!
Reply from chatGPT(AI)
The honor of zinx
GVP Most Valuable Open Source Project of the Year at OSCHINA
Stargazers over time
II. Zinx architecture
III. Zinx development API documentation
The Document of Zinx
YuQue - 《Zinx Documentation》
(1) QuickStart
<Zinx's TCP Debugging Tool>
DownLoad zinx Source
$go get github.com/Yeuoly/zinx
note: Golang Version 1.16+
Zinx-Server
package main
import (
"fmt"
"github.com/Yeuoly/zinx/ziface"
"github.com/Yeuoly/zinx/znet"
)
// PingRouter MsgId=1
type PingRouter struct {
znet.BaseRouter
}
//Ping Handle MsgId=1
func (r *PingRouter) Handle(request ziface.IRequest) {
//read client data
fmt.Println("recv from client : msgId=", request.GetMsgID(), ", data=", string(request.GetData()))
}
func main() {
//1 Create a server service
s := znet.NewServer()
//2 configure routing
s.AddRouter(1, &PingRouter{})
//3 start service
s.Serve()
}
Run Server
$ go run server.go
██
▀▀
████████ ████ ██▄████▄ ▀██ ██▀
▄█▀ ██ ██▀ ██ ████
▄█▀ ██ ██ ██ ▄██▄
▄██▄▄▄▄▄ ▄▄▄██▄▄▄ ██ ██ ▄█▀▀█▄
▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀ ▀▀ ▀▀ ▀▀▀ ▀▀▀
┌──────────────────────────────────────────────────────┐
│ [Github] https://github.com/aceld │
│ [tutorial] https://www.yuque.com/aceld/npyr8s/bgftov │
└──────────────────────────────────────────────────────┘
[Zinx] Version: V1.0, MaxConn: 12000, MaxPacketSize: 4096
===== Zinx Global Config =====
TCPServer: <nil>
Host: 0.0.0.0
TCPPort: 8999
Name: ZinxServerApp
Version: V1.0
MaxPacketSize: 4096
MaxConn: 12000
WorkerPoolSize: 10
MaxWorkerTaskLen: 1024
MaxMsgChanLen: 1024
ConfFilePath: /Users/Aceld/go/src/zinx-usage/quick_start/conf/zinx.json
LogDir: /Users/Aceld/go/src/zinx-usage/quick_start/log
LogFile:
LogIsolationLevel: 0
HeartbeatMax: 10
==============================
2023/03/09 18:39:49 [INFO]msghandler.go:61: Add api msgID = 1
2023/03/09 18:39:49 [INFO]server.go:112: [START] Server name: ZinxServerApp,listenner at IP: 0.0.0.0, Port 8999 is starting
2023/03/09 18:39:49 [INFO]msghandler.go:66: Worker ID = 0 is started.
2023/03/09 18:39:49 [INFO]msghandler.go:66: Worker ID = 1 is started.
2023/03/09 18:39:49 [INFO]msghandler.go:66: Worker ID = 3 is started.
2023/03/09 18:39:49 [INFO]msghandler.go:66: Worker ID = 2 is started.
2023/03/09 18:39:49 [INFO]msghandler.go:66: Worker ID = 4 is started.
2023/03/09 18:39:49 [INFO]msghandler.go:66: Worker ID = 6 is started.
2023/03/09 18:39:49 [INFO]msghandler.go:66: Worker ID = 7 is started.
2023/03/09 18:39:49 [INFO]msghandler.go:66: Worker ID = 8 is started.
2023/03/09 18:39:49 [INFO]msghandler.go:66: Worker ID = 9 is started.
2023/03/09 18:39:49 [INFO]msghandler.go:66: Worker ID = 5 is started.
2023/03/09 18:39:49 [INFO]server.go:134: [START] start Zinx server ZinxServerApp succ, now listenning...
Zinx-Client
package main
import (
"fmt"
"github.com/Yeuoly/zinx/ziface"
"github.com/Yeuoly/zinx/znet"
"time"
)
//Client custom business
func pingLoop(conn ziface.IConnection) {
for {
err := conn.SendMsg(1, []byte("Ping...Ping...Ping...[FromClient]"))
if err != nil {
fmt.Println(err)
break
}
time.Sleep(1 * time.Second)
}
}
//Executed when a connection is created
func onClientStart(conn ziface.IConnection) {
fmt.Println("onClientStart is Called ... ")
go pingLoop(conn)
}
func main() {
//Create a client client
client := znet.NewClient("127.0.0.1", 8999)
//Set the hook function after the link is successfully established
client.SetOnConnStart(onClientStart)
//start the client
client.Start()
//Prevent the process from exiting, waiting for an interrupt signal
select {}
}
Run Client
$ go run client.go
2023/03/09 19:04:54 [INFO]client.go:73: [START] Zinx Client LocalAddr: 127.0.0.1:55294, RemoteAddr: 127.0.0.1:8999
2023/03/09 19:04:54 [INFO]connection.go:354: ZINX CallOnConnStart....
Terminal of Zinx Print:
recv from client : msgId= 1 , data= Ping...Ping...Ping...[FromClient]
recv from client : msgId= 1 , data= Ping...Ping...Ping...[FromClient]
recv from client : msgId= 1 , data= Ping...Ping...Ping...[FromClient]
recv from client : msgId= 1 , data= Ping...Ping...Ping...[FromClient]
recv from client : msgId= 1 , data= Ping...Ping...Ping...[FromClient]
recv from client : msgId= 1 , data= Ping...Ping...Ping...[FromClient]
...
(2) Zinx configuration file
{
"Name":"zinx v-0.10 demoApp",
"Host":"127.0.0.1",
"TCPPort":7777,
"MaxConn":3,
"WorkerPoolSize":10,
"LogDir": "./mylog",
"LogFile":"zinx.log",
"LogIsolationLevel":0
}
Name
:Server Application Name
Host
:Server IP
TcpPort
:Server listening port
MaxConn
:Maximum number of client links allowed
WorkerPoolSize
:Maximum number of working Goroutines in the work task pool
LogDir
: Log folder
LogFile
: Log file name (if not provided, log information is printed to Stderr)
LogIsolationLevel
: Log Isolation Level -0: Full On 1: Off debug 2: Off debug/info 3: Off debug/info/warn
Developers
Thanks to all the developers who contributed to Zinx!
About the author
name
:Aceld(刘丹冰)
mail
:
danbing.at@gmail.com
github
:
https://github.com/aceld
original work
:
https://www.yuque.com/aceld
WeChat |
WeChat Public Account |
QQ Group |
|
|
|