Zinx — это легковесный параллельный серверный фреймворк, основанный на Golang.
Примечание: Zinx широко используется во многих компаниях для разработки, включая переадресацию сообщений для бэкенд-модулей, серверов с длинными связями и обработки сообщений в веб-фреймворках. Zinx позиционируется как фреймворк с лаконичным кодом, который позволяет разработчикам быстро понять внутренние детали фреймворка и легко настроить его под свои корпоративные сценарии.
Git: https://github.com/aceld/zinx
Git: https://gitee.com/Aceld/zinx
Платформа | Вступление |
---|---|
Фреймворк Zinx: Лёгкий сервер на основе Golang | |
«Golang: лёгкий параллельный фреймворк сервера Zinx» |
Платформа | Онлайн-видео |
---|---|
![]() |
|
![]() |
|
![]() |
Почему мы создали Zinx? Хотя существует множество серверных фреймворков на Golang, есть несколько лёгких корпоративных фреймворков, применяемых в играх или других областях с длинными связями.
Цель создания Zinx — предоставить полное описание того, как написать TCP-сервер на основе Golang, чтобы больше энтузиастов Golang могли изучить и понять эту область простым способом.
Разработка проекта фреймворка Zinx синхронизирована с созданием обучающих руководств, и всё инкрементальное и итеративное мышление, задействованное в процессе разработки, включено в руководства. Этот подход позволяет избежать перегрузки новичков полным фреймворком, который им может быть трудно сразу понять.
Руководства будут обновляться версия за версией, каждая версия будет добавлять небольшие функциональные дополнения, позволяя новичку постепенно и всесторонне изучать область серверных фреймворков.
Конечно, мы надеемся, что больше людей присоединятся к Zinx и предоставят нам ценную обратную связь, что позволит Zinx стать действительно корпоративным серверным фреймворком. Спасибо за внимание! ### Честь Zinx
Скачать исходный код zinx:
$go get github.com/aceld/zinx
Примечание: версия Golang 1.17+
package main
import (
"fmt"
"github.com/aceld/zinx/ziface"
"github.com/aceld/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()
}
Запустить сервер:
$ 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 =====
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...
package main
import (
"fmt"
"github.com/aceld/zinx/ziface"
"github.com/aceld/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 ... ")
``` **Перевод текста на русский язык:**
### (1) Клиент Zinx на языке Go
```go
package main
import (
"fmt"
"time"
znet "github.com/aceld/zinx/client"
)
func pingLoop(conn *znet.Conn) {
for {
_, err := conn.Write([]byte("Ping..."))
if err != nil {
fmt.Println("Ошибка при отправке данных:", err)
return
}
time.Sleep(time.Second)
}
}
func main() {
// Создаём клиента
client := znet.NewClient("127.0.0.1", 8999)
// Устанавливаем функцию-обработчик после успешного установления соединения
client.SetOnConnStart(onClientStart)
// Запускаем клиент
client.Start()
// Блокируем процесс до получения сигнала прерывания
select {}
}
Запуск клиента:
$ 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....
Терминал 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]
...
{
"Name": "zinx v-0.10 demoApp",
"Host": "0.0.0.0",
"TCPPort": 9090,
"MaxConn": 3,
"WorkerPoolSize": 10,
"LogDir": "./mylog",
"LogFile": "app.log",
"LogSaveDays": 15,
"LogCons": true,
"LogIsolationLevel": 0
}
Name: имя серверного приложения.
Host: IP-адрес сервера.
TcpPort: порт прослушивания сервера.
MaxConn: максимальное количество клиентских соединений.
WorkerPoolSize: максимальное число рабочих горутин в пуле задач.
LogDir: папка для логов.
LogFile: имя файла журнала (если не указано, информация о журнале выводится в Stderr).
LogIsolationLevel: уровень изоляции журнала — 0: полный, 1: выключен отладка, 2: выключена отладка/информация, 3: выключены отладка/информация/предупреждение.
Zinx | Авторы |
---|---|
zinx | Лю Даньбин (@aceld), Чжан Чао (@zhngcho), Роджер Гао Чжихуэй (@adsian), Ху Гуйцзянь (@huguijian), Цзи Цзыю (@kstwoak), Ся Сяоли (@xxl6097), Ли Чжичэн (@clukboy), Яо Чэнчжэ (@hcraM41), Ли Гоцзе (@LI-GUOJIE), Юй Яннин (@YanHeDoki) |
moke-kit (Microservices) | GStones (@GStones) |
zinx (C++) | Лю Ян (@marklion) |
zinx (Lua) | Ху Ци (@huqitt) |
ginx (Java) | ModuleCode (@ModuleCode) |
Спасибо всем разработчикам, которые внесли свой вклад в Zinx!
name
: Асельд (Лю Даньбин).
mail
: danbing.at@gmail.com.
github
: https://github.com/aceld.
оригинальная работа
: https://www.yuque.com/aceld.
платформа | Вход |
---|---|
![]() |
https://discord.gg/xQ8Xxfyfcz |
![]() |
Добавьте меня в WeChat: ace_ld или отсканируйте QR-код, отметьте zinx . |
![]() |
||
QQ Group
||
|
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )