Zinx源代碼
github
https://github.com/aceld/zinx
gitee碼云
https://gitee.com/Aceld/zinx
在線開發(fā)教程
【B站】
zinx視頻教程-Golang輕量級(jí)TCP服務(wù)器框架-適合自學(xué)者
【YouTube】
zinx開發(fā)YouTube中國(guó)版
【Zinx教程目錄】
完整教程電子版(在線高清)-下載
Zinx框架視頻教程(框架篇)(完整版下載)鏈接在下面正文
Zinx框架視頻教程(應(yīng)用篇)(完整版下載)鏈接在下面正文
Zinx開發(fā)API文檔
Zinx第一章-引言
Zinx第二章-初識(shí)Zinx框架
Zinx第三章-基礎(chǔ)路由模塊
Zinx第四章-全局配置
Zinx第五章-消息封裝
Zinx第六章-多路由模式
Zinx第七章-讀寫分離模型
Zinx第八章-消息隊(duì)列及多任務(wù)
Zinx第九章-鏈接管理
Zinx第十章-連接屬性設(shè)置
【Zinx應(yīng)用案例-MMO多人在線游戲】
(1)案例介紹
(2)AOI興趣點(diǎn)算法
(3)數(shù)據(jù)傳輸協(xié)議protocol buffer
(4)Proto3協(xié)議定義
(5)構(gòu)建項(xiàng)目及用戶上線
(6)世界聊天
(7)上線位置信息同步
(8)移動(dòng)位置與AOI廣播
(9)玩家下線
(10)模擬客戶端AI模塊
四、Zinx的全局配置
? 隨著架構(gòu)逐步的變大辽慕,參數(shù)就會(huì)越來(lái)越多濒持,為了省去我們后續(xù)大頻率修改參數(shù)的麻煩缘挽,接下來(lái)Zinx需要做一個(gè)加載配置的模塊甩苛,和一個(gè)全局獲取Zinx參數(shù)的對(duì)象厅目。
4.1 Zinx-V0.4增添全局配置代碼實(shí)現(xiàn)
? 我們先做一個(gè)簡(jiǎn)單的加載配置模塊椰弊,要加載的配置文件的文本格式咆瘟,就選擇比較通用的json
格式棒口,配置信息暫時(shí)如下:
zinx.json
{
"Name":"demo server",
"Host":"127.0.0.1",
"TcpPort":7777,
"MaxConn":3
}
? 現(xiàn)在我們需要建立一個(gè)全局配置信息的對(duì)象
A) 創(chuàng)建全局參數(shù)文件
創(chuàng)建zinx/utils
文件夾寄月,在下面創(chuàng)建globalobj.go
文件,暫時(shí)編寫如下。
zinx/utils/globalobj.go
package utils
import (
"encoding/json"
"io/ioutil"
"zinx/ziface"
)
/*
存儲(chǔ)一切有關(guān)Zinx框架的全局參數(shù)无牵,供其他模塊使用
一些參數(shù)也可以通過(guò) 用戶根據(jù) zinx.json來(lái)配置
*/
type GlobalObj struct {
TcpServer ziface.IServer //當(dāng)前Zinx的全局Server對(duì)象
Host string //當(dāng)前服務(wù)器主機(jī)IP
TcpPort int //當(dāng)前服務(wù)器主機(jī)監(jiān)聽端口號(hào)
Name string //當(dāng)前服務(wù)器名稱
Version string //當(dāng)前Zinx版本號(hào)
MaxPacketSize uint32 //都需數(shù)據(jù)包的最大值
MaxConn int //當(dāng)前服務(wù)器主機(jī)允許的最大鏈接個(gè)數(shù)
}
/*
定義一個(gè)全局的對(duì)象
*/
var GlobalObject *GlobalObj
? 我們?cè)谌侄x了一個(gè)GlobalObject
對(duì)象漾肮,目的就是讓其他模塊都能訪問(wèn)到里面的參數(shù)。
B) 提供init初始化方法
然后我們提供一個(gè)init()
方法茎毁,目的是初始化GlobalObject
對(duì)象克懊,和加載服務(wù)端應(yīng)用配置文件conf/zinx.json
zinx/utils/globalobj.go
//讀取用戶的配置文件
func (g *GlobalObj) Reload() {
data, err := ioutil.ReadFile("conf/zinx.json")
if err != nil {
panic(err)
}
//將json數(shù)據(jù)解析到struct中
//fmt.Printf("json :%s\n", data)
err = json.Unmarshal(data, &GlobalObject)
if err != nil {
panic(err)
}
}
/*
提供init方法,默認(rèn)加載
*/
func init() {
//初始化GlobalObject變量七蜘,設(shè)置一些默認(rèn)值
GlobalObject = &GlobalObj{
Name: "ZinxServerApp",
Version: "V0.4",
TcpPort: 7777,
Host: "0.0.0.0",
MaxConn: 12000,
MaxPacketSize:4096,
}
//從配置文件中加載一些用戶配置的參數(shù)
GlobalObject.Reload()
}
C) 硬參數(shù)替換與Server初始化參數(shù)配置
zinx/znet/server.go
/*
創(chuàng)建一個(gè)服務(wù)器句柄
*/
func NewServer () ziface.IServer {
//先初始化全局配置文件
utils.GlobalObject.Reload()
s:= &Server {
Name :utils.GlobalObject.Name,//從全局參數(shù)獲取
IPVersion:"tcp4",
IP:utils.GlobalObject.Host,//從全局參數(shù)獲取
Port:utils.GlobalObject.TcpPort,//從全局參數(shù)獲取
Router: nil,
}
return s
}
我們未來(lái)方便驗(yàn)證我們的參數(shù)已經(jīng)成功被價(jià)值谭溉,在Server.Start()
方法中加入幾行調(diào)試信息
zinx/znet/server.go
//開啟網(wǎng)絡(luò)服務(wù)
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)
//...
//...
}
當(dāng)然還有一些其他的之前寫死的數(shù)值,均可以在配置文件配置橡卤,用全局參數(shù)替換扮念,這里不一一列舉。
當(dāng)前zinx框架目錄結(jié)構(gòu)
├── 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完成應(yīng)用程序
? 我們這回再基于Zinx完成服務(wù)器就必須要提前先寫好一個(gè)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() {
//創(chuàng)建一個(gè)server句柄
s := znet.NewServer()
//配置路由
s.AddRouter(&PingRouter{})
//開啟服務(wù)
s.Serve()
}
$go run Server.go
結(jié)果:
$ 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...
現(xiàn)在配置已經(jīng)加載成功了柜与。
關(guān)于作者:
作者:Aceld(劉丹冰)
mail: danbing.at@gmail.com
github: https://github.com/aceld
原創(chuàng)書籍: https://www.kancloud.cn/@aceld
原創(chuàng)聲明:未經(jīng)作者允許請(qǐng)勿轉(zhuǎn)載, 如果轉(zhuǎn)載請(qǐng)注明出處