Go游戏服务器开发的一些思考(二十四):命令行库封装技巧
来源:互联网 发布:monit windows agent 编辑:程序博客网 时间:2024/06/01 10:38
为什么使用命令行
通常,游戏开发时,服务器端会使用配置文件,如json文件来配置启动时的程序参数。
这样做有一个问题,配置文件会导致 Docker Swarm编排脚本变的复杂,难写。相反Docker Swarm编排脚本对命令行参数支持的非常好。
道理很简单,若是配置文件,则需要做进镜像中,使得镜像做好后,镜像内的配置文件,已经没办法修改了!如果是命令行参数,则可以在编排脚本中,自由更改启动时的命令行参数!
虽然没用过其他容器类工具,如k8s。但是按此思路推测,配置文件都会遇到这个问题!
因此如果打算后期使用Docker Swarm来部署自己的服务器的话,推荐将启动配置文件全部转化为命令行参数的方式提供。
go flag库
go语言通过官方自带的flag库,可以方便的定义、解析、以及获取命令行参数。
网上教程很多,这里不在详细介绍了。
封装原则
这里要讲的是,编码时需要注意的问题。还是要强调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
- Go游戏服务器开发的一些思考(二十四):命令行库封装技巧
- Go游戏服务器开发的一些思考(二十三):Go语言Log库封装技巧
- Go游戏服务器开发的一些思考(十四):IO游戏同步(二)
- Go游戏服务器开发的一些思考(二十一):Go语言的两处脑残设定
- Go游戏服务器开发的一些思考(二十六):Go Redis ORM库
- Go游戏服务器开发的一些思考(二十五):Redis的Docker Swarm部署
- Go游戏服务器开发的一些思考(二):综合考察(上)
- Go游戏服务器开发的一些思考(二十):Docker Swarm部署Etcd示例
- Go游戏服务器开发的一些思考(二十二):Godep包管理介绍
- Go游戏服务器开发的一些思考(七):Redis
- Go游戏服务器开发的一些思考(十六):IO游戏服务器架构
- Go游戏服务器开发的一些思考(九):Docker桥接网络及固定IP (二)
- Go游戏服务器开发的一些思考(十七):IO游戏同步(三)
- Go游戏服务器开发的一些思考(十一):IO游戏同步
- Go游戏服务器开发的一些思考(十三):behavior3go的一些坑(备忘)
- Go游戏服务器开发的一些思考(十九):服务器架构之服务发现
- Go游戏服务器开发的一些思考(五):goroutine看似美好的陷阱
- Go游戏服务器开发的一些思考(三):综合考察(中)
- 习题6.7
- Java2E中的路径问题
- Xampp Apache shutdown unexpectedly
- 【深度学习笔记】(一)Mac下TensorFlow安装及环境搭建
- android事件在不同级别view中的优先级问题
- Go游戏服务器开发的一些思考(二十四):命令行库封装技巧
- 黑马入学测试题错题记录
- 最后的总结?
- 题目54:小明的存钱计划
- Js中数组创建的两种方式和短路运算符
- photoview查看大图点击返回
- 如何使用百度统计监测网站流量
- Material Design控件之CollapsingToolbarLayout
- 什么是VPN及它和Socks5的区别?