【Zinx第四章-全域性配置】Golang輕量級併發伺服器框架
【Zinx 教程目錄】 Zinx 原始碼 https://github.com/aceld/zinx
完整教程電子版 (線上高清)-下載 Zinx 框架視訊教程 (框架篇)(完整版下載) 連結在下面正文
Zinx 框架視訊教程 (應用篇)(完整版下載) 連結在下面正文
Zinx 第十章-連線屬性設定
【Zinx 應用案例-MMO 多人線上遊戲】 (1) 案例介紹
(9) 玩家下線
四、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(劉丹冰)
簡書號:IT無崖子
mail: danbing.at@gmail.com github: https://github.com/aceld 原創書籍 gitbook: http://legacy.gitbook.com/@aceld
>原創宣告:未經作者允許請勿轉載, 如果轉載請註明出處
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- 【Zinx第一章-引言】Golang輕量級併發伺服器框架Golang伺服器框架
- 【Zinx第三章-基礎路由模組】Golang輕量級併發伺服器框架路由Golang伺服器框架
- Fastflow——基於golang的輕量級工作流框架ASTGolang框架
- [譯文]greenlet:輕量級併發程式
- 一個輕量級,0配置orm框架 sharkchili-feifeiORM框架
- Golang web filter 輕量級實現GolangWebFilter
- ColyseusJS 輕量級多人遊戲伺服器開發框架 - 中文手冊(上)JS遊戲伺服器框架
- ColyseusJS 輕量級多人遊戲伺服器開發框架 - 中文手冊(中)JS遊戲伺服器框架
- ColyseusJS 輕量級多人遊戲伺服器開發框架 - 中文手冊(下)JS遊戲伺服器框架
- Flutter路由輕量級框架FRouterFlutter路由框架
- 輕量級orm框架——gzero指南ORM框架
- 輕量級Web框架Flask(二)Web框架Flask
- spa-to-http:輕量級零配置SPA HTTP 伺服器HTTP伺服器
- 輕量級配置中心Nodejs版NodeJS
- apache伺服器全域性配置詳解(全)Apache伺服器
- Solon 1.6.25 釋出,輕量級應用開發框架框架
- Solon 1.6.18 釋出,輕量級應用開發框架框架
- looter——超輕量級爬蟲框架爬蟲框架
- Lite Actor:方舟Actor併發模型的輕量級優化模型優化
- 框架(frameset),全域性屬性框架
- ColyseusJS 輕量級多人遊戲伺服器開發框架 - 中文手冊(系統保障篇)JS遊戲伺服器框架
- 輕量級 Web 框架 Gin 結構分析Web框架
- 輕量級DI框架Guice使用詳解框架GUI
- 【django輕量級框架】django專案部署到阿里雲伺服器流程Django框架阿里伺服器
- 搭建基於springboot輕量級讀寫分離開發框架Spring Boot框架
- java併發筆記之synchronized 偏向鎖 輕量級鎖 重量級鎖證明Java筆記synchronized
- 【高併發】之分散式全域性唯一 ID分散式
- azeroth-event輕量級事件驅動框架事件框架
- 「造個輪子」——cicada(輕量級 WEB 框架)Web框架
- CherryPy :一個輕量級的 Python Web 框架PythonWeb框架
- Spring 5| 輕量級的開源JavaEE框架SpringJava框架
- 輕量級多級選單控制框架程式(C語言)框架C語言
- 輕量級 Java 基礎開發框架,Solon & Solon Cloud 1.5.48 釋出Java框架Cloud
- Solon & Solon Cloud 1.5.62 釋出,輕量級 Java 基礎開發框架CloudJava框架
- 輕量級 Java 基礎開發框架,Solon & Solon Cloud 1.5.40 釋出Java框架Cloud
- 輕鬆檢測Golang併發的資料競爭Golang
- golang併發Golang
- CQRS輕量級框架【CQRSlite】學習使用小記框架