Giter VIP home page Giter VIP logo

gonet's Introduction

A game server skeleton implemented with golang.

Architecture

注意(NOTICE)

欢迎加入QQ群: 459420581 (Gopher成都,讨论一切与go有关的话题)

gonet/2

gonet1已停止维护(I no longer maintain this, please move forward to http://github.com/gonet2 )

建议移步至新架构: http://gonet2.github.io

部署:

  • Game Server(GS):
    玩家直接连接GS, 处理玩家逻辑,并与 HUB/SS 通信,GS存在若干个。
    (Players connect directly to GS(s) and process, GS(s) will communication with HUB)

  • Hub Server(HUB):
    若干个GS 连接到一个HUB, 只存在一个HUB,维护基础的全局信息,以及 GS<--->GS 的消息转发.
    (packet forwarding)

  • Stats Server(SS):
    统计服务器,根据玩家的行为,记录策划需要的数据,以便于后期统计。
    统计属于事后分析,数据量较大,性能需求不同, 故单独列为一个服务器。

通信原则:

  1. GS到HUB/SS的通信,都是Call同步调用,即GS必须等待ACK。
  2. HUB到GS的通信,只有forward数据包。
  3. 单播消息在玩家离线时会存入db, 登录后的启动过程 GS 直接读取db,并forward给玩家goroutine。(持久化)
  4. 多播消息会发送给所有的在线玩家(非持久化)
  5. 广播消息会发送给所有的在线玩家(非持久化)

服务器状态一致性

  1. GS节点可以单独重启
  2. HUB 重启后,GS必须全部重启
  3. SS 可随意重启,不影响业务

安装先决条件:

  1. 确保安装好graphviz, gawk
  2. 确保安装好mongodb
  3. 确保config.ini中的mongo_xxxx配置正确
  4. export GOPATH='当前目录'

安装:

  • xtaci@ubuntu:~$ git clone https://github.com/xtaci/gonet
  • xtaci@ubuntu:~$ cd gonet
  • xtaci@ubuntu:/gonet$ export GOPATH=/gonet
  • xtaci@ubuntu:~/gonet$ go get gopkg.in/mgo.v2
  • xtaci@ubuntu:~/gonet$ make
  • xtaci@ubuntu:~/gonet$ ./start-test.sh

####支持此项目 ( Donations ) :
donate
欢迎使用支付宝扫描上面的二维码,对该项目进行捐赠。捐赠款项将用于持续优化补全及完善。

gonet's People

Contributors

xtaci avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gonet's Issues

请问 size := int(header[0])<<8 | int(header[1]) 怎么理解?

你好 最近学习golang 我也做游戏的
发现你的 框架不错 想学习下
却看不懂下面这段代码
能否有空帮我解惑下,谢谢

header := make([]byte, 2)
size := int(header[0])<<8 | int(header[1])
请问 size := int(header[0])<<8 | int(header[1]) 怎么理解?

我该如何才能联系到您?

你好,我是go初学者,也是webgame从业者,之前项目都是用php开发的,现在打算学习下go,请问可否提供一个email帐号,或者QQ帐号之类的通讯工具,以便于可以及时向您请教问题,谢谢。

gonet1 design document

Hi there, no idea if it's possible for you, but it would be awesome if someone (or you) could provide an english translation of the readme....

Sorry that I can't request this in chinese!

謝謝

能不能加个flash 安全策略的访问逻辑呢?

我查遍了网上的资料 都没查到as3 socket 链接 go 的 安全策略

我实现了出现一些问题

for {
// header
n, err := io.ReadFull(conn, header)
log.Println("header:", header)
if (string(header) == "<p") {
log.Println("string header:", string(header))
r := bufio.NewReader(conn)
otherHeader, err := r.ReadString('\x00')
if err != nil {
if err != io.EOF {
log.Println(err)
}
return
}
log.Printf("otherHeader", string(otherHeader))
data := []byte("")
ch <- data
} else {
if n == 0 && err == io.EOF {
break
} else if err != nil {
log.Println("error receiving header:", err)
break
}
size := binary.BigEndian.Uint16(header)
log.Println("Game Receive Size.", size)
data := make([]byte, size)
n, err = io.ReadFull(conn, data)
log.Println("Game Receive Data.", string(data))
if err != nil {
log.Println("error receiving msg:", err)
break
}
ch <- data
}
}

[GS]2013/07/08 22:43:32 header: [60 112]
[GS]2013/07/08 22:43:32 string header: <p
[GS]2013/07/08 22:43:32 otherHeader%!(EXTRA string=olicy-file-request/>)
[GS]2013/07/08 22:43:32 Sent policy file to xxxx.xx.xxx.xx:50149
[GS]2013/07/08 22:43:32 header: [60 112]
[GS]2013/07/08 22:43:32 string header: <p

不知道您有没有空 把flash安全策略 集成到你的这个gonet框架中哈
谢谢

调用逻辑处理的方式

//log.Printf("code:%v\n", b)
handle := protos.ProtoHandler[b]
ret := handle(sess, reader)

var ProtoHandler map[uint16]func(*Session, *packet.Packet) []byte = map[uint16]func(*Session, *packet.Packet) []byte{
0: P_heart_beat_req,
1: P_user_login_req,
}

没有办法做到

//log.Printf("code:%v\n", b)
no := "P_"+strconv.itoa(b)
ret := protos.no(sess, reader)

这种模式?

能不能解释下 len(buf.pending) < buf.max 这个含义?

type Buffer struct {
ctrl chan bool // receive exit signal
pending chan []byte // pending Packet
max int // max queue size
conn net.Conn // connection
}
我在看代码的时候 不明白
peding 是 []byte

const (
DEFAULT_QUEUE_SIZE = 5
)
max = DEFAULT_QUEUE_SIZE
len(buf.pending) 和 buf.max

是计算 如果超过5个 chan []byte 这种数据包 就丢弃?

NextVal并发问题

func NextVal(countername string) int32 会有bug,当开始同时有两个请求到达时就会插入两条记录
可以是用_id为countername这样可以避免

为什么HUB重启后,GS必须全部重启?已经数据持久化问题

1.服务器状态一致性 2.HUB重启后,GS必须全部重启 这里想问下为什么GServer也要重启是由于GServer和hub服务器之间的数据同步问题还是由于hub_client缺少断线重连(我见hub_client中做了连接失败5秒重连),go刚接触还比较陌生。
2.所有的玩家数据都是保存在内存中的?使用mgdb存储json文件(玩家数据等信息)来做数据的持久化?如果是全部保存在内存中是否担心机器故障导致玩家数据丢失,不知道在这方面怎么处理的,是否像leveldb的处理一样在数据写入到内存中时先以AOF文件的形式保存到磁盘上,这样即使突然的机器故障也可以中AOF文件中回复过来。
谢谢

架构请教

如果按照这个模型部署服务器,那么请问,GS1和GS2之间是不是只能是请求->应答机制?
一个hub对应一组服务器是吗?是通过TCP连接的吗?

安装过程misc/alg/dos报错

misc/alg/dos

src/misc/alg/dos/dos.go:147: n.id undefined (type *Node has no field or method id)
src/misc/alg/dos/dos.go:147: pred.id undefined (type *Node has no field or method id)

这个行看了下好像是不需要的

缺包

~/gonet/src/db/stats_tbl/status.go 中 import的 "types/stats" 没有这个包啊?

timer

今天看了下这个定时器的实现
1.精度为0.1s ?
2.这里设置16级的原因是不是当有超时事件发生时,将它们根据超时时间放入不同优先级的容器中,然后根据优先级进行处理。实际上就是按照到时时间依次处理?不知道我的理解对不对?如果是这样的话为什么不直接用一个队列先超时先压入?没搞懂这里分了16级的原因,请教下。

谢谢

关于用户护盾状态的疑问

看代码的用户状态机里有一个状态叫protect,请问这个状态具体是什么含义,一般用途有哪些?有空时麻烦给解释一下,谢谢

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.