Zinx源代碼
github
https://github.com/aceld/zinx
gitee碼云
https://gitee.com/Aceld/zinx
在線開發教程
【B站】
zinx視頻教程-Golang輕量級TCP服務器框架-適合自學者
【YouTube】
zinx開發YouTube中國版
【Zinx教程目錄】
完整教程電子版(在線高清)-下載
Zinx框架視頻教程(框架篇)(完整版下載)鏈接在下面正文
Zinx框架視頻教程(應用篇)(完整版下載)鏈接在下面正文
Zinx開發API文檔
Zinx第一章-引言
Zinx第二章-初識Zinx框架
Zinx第三章-基礎路由模塊
Zinx第四章-全局配置
Zinx第五章-消息封裝
Zinx第六章-多路由模式
Zinx第七章-讀寫分離模型
Zinx第八章-消息隊列及多任務
Zinx第九章-鏈接管理
Zinx第十章-連接屬性設置
【Zinx應用案例-MMO多人在線游戲】
(1)案例介紹
(2)AOI興趣點算法
(3)數據傳輸協議protocol buffer
(4)Proto3協議定義
(5)構建項目及用戶上線
(6)世界聊天
(7)上線位置信息同步
(8)移動位置與AOI廣播
(9)玩家下線
(10)模擬客戶端AI模塊
四、Zinx的全局配置
? 隨著架構逐步的變大,參數就會越來越多,為了省去我們后續大頻率修改參數的麻煩,接下來Zinx需要做一個加載配置的模塊,和一個全局獲取Zinx參數的對象。
4.1 Zinx-V0.4增添全局配置代碼實現
? 我們先做一個簡單的加載配置模塊,要加載的配置文件的文本格式,就選擇比較通用的json
格式,配置信息暫時如下:
zinx.json
{
"Name":"demo server",
"Host":"127.0.0.1",
"TcpPort":7777,
"MaxConn":3
}
? 現在我們需要建立一個全局配置信息的對象
A) 創建全局參數文件
創建zinx/utils
文件夾,在下面創建globalobj.go
文件,暫時編寫如下。
zinx/utils/globalobj.go
package utils
import (
"encoding/json"
"io/ioutil"
"zinx/ziface"
)
/*
存儲一切有關Zinx框架的全局參數,供其他模塊使用
一些參數也可以通過 用戶根據 zinx.json來配置
*/
type GlobalObj struct {
TcpServer ziface.IServer //當前Zinx的全局Server對象
Host string //當前服務器主機IP
TcpPort int //當前服務器主機監聽端口號
Name string //當前服務器名稱
Version string //當前Zinx版本號
MaxPacketSize uint32 //都需數據包的最大值
MaxConn int //當前服務器主機允許的最大鏈接個數
}
/*
定義一個全局的對象
*/
var GlobalObject *GlobalObj
? 我們在全局定義了一個GlobalObject
對象,目的就是讓其他模塊都能訪問到里面的參數。
B) 提供init初始化方法
然后我們提供一個init()
方法,目的是初始化GlobalObject
對象,和加載服務端應用配置文件conf/zinx.json
zinx/utils/globalobj.go
//讀取用戶的配置文件
func (g *GlobalObj) Reload() {
data, err := ioutil.ReadFile("conf/zinx.json")
if err != nil {
panic(err)
}
//將json數據解析到struct中
//fmt.Printf("json :%s\n", data)
err = json.Unmarshal(data, &GlobalObject)
if err != nil {
panic(err)
}
}
/*
提供init方法,默認加載
*/
func init() {
//初始化GlobalObject變量,設置一些默認值
GlobalObject = &GlobalObj{
Name: "ZinxServerApp",
Version: "V0.4",
TcpPort: 7777,
Host: "0.0.0.0",
MaxConn: 12000,
MaxPacketSize:4096,
}
//從配置文件中加載一些用戶配置的參數
GlobalObject.Reload()
}
C) 硬參數替換與Server初始化參數配置
zinx/znet/server.go
/*
創建一個服務器句柄
*/
func NewServer () ziface.IServer {
//先初始化全局配置文件
utils.GlobalObject.Reload()
s:= &Server {
Name :utils.GlobalObject.Name,//從全局參數獲取
IPVersion:"tcp4",
IP:utils.GlobalObject.Host,//從全局參數獲取
Port:utils.GlobalObject.TcpPort,//從全局參數獲取
Router: nil,
}
return s
}
我們未來方便驗證我們的參數已經成功被價值,在Server.Start()
方法中加入幾行調試信息
zinx/znet/server.go
//開啟網絡服務
func (s *Server) Start() {
fmt.Printf("[START] Server name: %s,listenner at IP: %s, Port %d is starting\n", s.Name, s.IP, s.Port)
fmt.Printf("[Zinx] Version: %s, MaxConn: %d, MaxPacketSize: %d\n",
utils.GlobalObject.Version,
utils.GlobalObject.MaxConn,
utils.GlobalObject.MaxPacketSize)
//...
//...
}
當然還有一些其他的之前寫死的數值,均可以在配置文件配置,用全局參數替換,這里不一一列舉。
當前zinx框架目錄結構
├── README.md
├── utils
│ └── globalobj.go
├── ziface
│ ├── iconnnection.go
│ ├── irequest.go
│ ├── irouter.go
│ └── iserver.go
└── znet
├── connection.go
├── request.go
├── router.go
├── server.go
└── server_test.go
4.2 使用Zinx-V0.4完成應用程序
? 我們這回再基于Zinx完成服務器就必須要提前先寫好一個conf/zinx.json
配置文件了。
├── Client.go
├── conf
│ └── zinx.json
└── Server.go
Server.go
package main
import (
"fmt"
"zinx/ziface"
"zinx/znet"
)
//ping test 自定義路由
type PingRouter struct {
znet.BaseRouter
}
//Test Handle
func (this *PingRouter) Handle(request ziface.IRequest) {
fmt.Println("Call PingRouter Handle")
_, err := request.GetConnection().GetTCPConnection().Write([]byte("ping...ping...ping\n"))
if err != nil {
fmt.Println("call back ping ping ping error")
}
}
func main() {
//創建一個server句柄
s := znet.NewServer()
//配置路由
s.AddRouter(&PingRouter{})
//開啟服務
s.Serve()
}
$go run Server.go
結果:
$ go run Server.go
Add Router succ!
[START] Server name: demo server,listenner at IP: 127.0.0.1, Port 7777 is starting
[Zinx] Version: V0.4, MaxConn: 3, MaxPacketSize: 4096
start Zinx server demo server succ, now listenning...
現在配置已經加載成功了。
關于作者:
作者:Aceld(劉丹冰)
mail: danbing.at@gmail.com
github: https://github.com/aceld
原創書籍: https://www.kancloud.cn/@aceld
原創聲明:未經作者允許請勿轉載, 如果轉載請注明出處