Go游戏服务器开发的一些思考(二十四):命令行库封装技巧

来源:互联网 发布:monit windows agent 编辑:程序博客网 时间:2024/06/01 10:38

为什么使用命令行

通常,游戏开发时,服务器端会使用配置文件,如json文件来配置启动时的程序参数。

这样做有一个问题,配置文件会导致 Docker Swarm编排脚本变的复杂,难写。相反Docker Swarm编排脚本对命令行参数支持的非常好。

道理很简单,若是配置文件,则需要做进镜像中,使得镜像做好后,镜像内的配置文件,已经没办法修改了!如果是命令行参数,则可以在编排脚本中,自由更改启动时的命令行参数!

虽然没用过其他容器类工具,如k8s。但是按此思路推测,配置文件都会遇到这个问题!

因此如果打算后期使用Docker Swarm来部署自己的服务器的话,推荐将启动配置文件全部转化为命令行参数的方式提供。

go flag库

go语言通过官方自带的flag库,可以方便的定义、解析、以及获取命令行参数。

网上教程很多,这里不在详细介绍了。

封装原则

这里要讲的是,编码时需要注意的问题。还是要强调2点:

  1. 引擎和应用程序的界限要分明
  2. 功能编码时要注意内敛

按照这个思路,通常会编码2个文件
- common/args.go
- server(s)/args.go

一个用来定义所有server公共的命令行参数;一个用来定义具体服务的命令行参数

common/args.go 示例

package commonimport "flag"type IArgs interface {    Init()    Parse()    GetBase() *ArgsBase}type ArgsBase struct {    EtcdHosts          string    EtcdNodeType       int64    EtcdWatchNodeTypes string    EtcdPutInterval    int64}func (this *ArgsBase) Init() {    // 下面是个例子,所有服务节点都有的配置,用于服务发现时的参数    // etcd     flag.StringVar(&this.EtcdHosts, "etcdHosts", "192.168.1.4:12379,192.168.1.4:22379,192.168.1.4:32379", "etcd hosts")    flag.Int64Var(&this.EtcdNodeType, "etcdNodeType", 1, "etcd node type")    flag.StringVar(&this.EtcdWatchNodeTypes, "etcdWatchNodeTypes", "1,2,3,4", "etcd watch node type")    flag.Int64Var(&this.EtcdPutInterval, "etcdPutInterval", 1, "etcd put interval")}func (this *ArgsBase) Parse() {    // 这里同理}func (this *ArgsBase) GetBase() *ArgsBase {    return this}

server(s)/args.go

package mainimport (    "github.com/fananchong/go-x/common"    "github.com/fananchong/go-x/def")var (    xargs *Args = NewArgs())type Args struct {    common.ArgsBase}func NewArgs() *Args {    return &Args{}}func (this *Args) Init() {    this.ArgsBase.Init()    // 登录服务,私有启动参数,可以填这里}func (this *Args) Parse() {    this.ArgsBase.Parse()    this.EtcdNodeType = int64(def.Login)}

总结

通过上述2个类的示例,可以清晰通过查找args.go文件,立刻知道有哪些公共命令行参数、及私有命令行参数。

详细可以参见github:

https://github.com/fananchong/go-x

会有更多惊喜等着你!

阅读全文
1 0
原创粉丝点击