【Zinx第四章-全局配置】Golang輕量級(jí)并發(fā)服務(wù)器框架

Zinx源代碼

github
https://github.com/aceld/zinx
gitee碼云
https://gitee.com/Aceld/zinx


在線開(kāi)發(fā)教程

【B站】
zinx視頻教程-Golang輕量級(jí)TCP服務(wù)器框架-適合自學(xué)者

【YouTube】
zinx開(kāi)發(fā)YouTube中國(guó)版


【Zinx教程目錄】
完整教程電子版(在線高清)-下載
Zinx框架視頻教程(框架篇)(完整版下載)鏈接在下面正文
Zinx框架視頻教程(應(yīng)用篇)(完整版下載)鏈接在下面正文
Zinx開(kāi)發(fā)API文檔
Zinx第一章-引言
Zinx第二章-初識(shí)Zinx框架
Zinx第三章-基礎(chǔ)路由模塊
Zinx第四章-全局配置
Zinx第五章-消息封裝
Zinx第六章-多路由模式
Zinx第七章-讀寫(xiě)分離模型
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í)編寫(xiě)如下。

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)聽(tīng)端口號(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

//開(kāi)啟網(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)然還有一些其他的之前寫(xiě)死的數(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ù)器就必須要提前先寫(xiě)好一個(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{})

    //開(kāi)啟服務(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)書(shū)籍: https://www.kancloud.cn/@aceld

原創(chuàng)聲明:未經(jīng)作者允許請(qǐng)勿轉(zhuǎn)載, 如果轉(zhuǎn)載請(qǐng)注明出處

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容