内容简介: 随着架构逐步的变大,参数就会越来越多,为了省去我们后续大频率修改参数的麻烦,接下来Zinx需要做一个加载配置的模块,和一个全局获取Zinx参数的对象。 我们先做一个简单的加载配置模块,要加载的配置文件的文本格式,就选择比较通用的zinx.json
四、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
原创声明:未经作者允许请勿转载,或者转载请注明出处!
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Machine Learning in Action
Peter Harrington / Manning Publications / 2012-4-19 / GBP 29.99
It's been said that data is the new "dirt"—the raw material from which and on which you build the structures of the modern world. And like dirt, data can seem like a limitless, undifferentiated mass. ......一起来看看 《Machine Learning in Action》 这本书的介绍吧!