LollipopGo:代理服务器

代理服务器

游戏服务器开发过程中,整个服务器的架构设计对于项目的影响是至关重要的,其中包括登录流程,消息机制流程,消息加密流程 内部服务器消息跳转,定时任务等。 centos 系统为例,给大家梳理下游戏架构的基础设计思想。

如何设计

1. 在整体的架构中,正式上线会在反向代理服务器前加nginx作为负载均衡,通过nginx来提高玩家在线人数
2. 在游戏开发过程中,不同游戏有不同的架构设计,例如 H5小游戏或弱联网的游戏,可能服务器单服就搞定;
但是对于注册量可以达到少则百万动辄千万用户,游戏架构设计上就要有讲究了,服务器最好采用集中消息处理、
动态拓展等,同时部分服务,例如战斗服等不需暴漏给外网
3. 为了满足2步骤需求,先不考虑负载均衡,反向代理服务器主要可以做到:有效隔离内网服务器,消息统一处理
4. 反向代理服务器功能:消息精准转发给相应的内网服务器

流程分析

1. 反向代理服务器主要是作为所有消息的入口统一管理,流量上反向代理是最大的相对于内网服务器
2. 可以有效的隔离内网服务器及外网的通信,安全性上增加
3. 处理消息很简单,消息的解析、消息转发到相应的内网服务器

实例代码

// 主函数
type ProxyServer struct {
    Connection *websocket.Conn
    StrMD5     string
    MapSafe    *concurrent.ConcurrentMap
}

var (
    cache *cache2go.CacheTable
    M     *concurrent.ConcurrentMap
)

func main()  {
    conf.InitConfig()
    runtime.GOMAXPROCS(runtime.NumCPU())
    http.Handle("/"+conf.GetConfig().Server.URL, websocket.Handler(BuildConnection))
    if err := http.ListenAndServe(conf.GetConfig().Server.WSAddr, nil); err != nil {
        glog.Info("Entry nil", err.Error())
        glog.Flush()
        return
    }
}

func BuildConnection(ws *websocket.Conn) {
    data := ws.Request().URL.Query().Get("data")
    if data == "" {
        glog.Info("data is Nil")
        glog.Flush()
        return
    }
    impl.InitConnection(ws)
}

// 反向代理服务器的ServerId
const (
    SERVER = iota
    ProxyServerId   // ProxyServerId == 1
    GameServerId    // GameServerId   == 2
    BattleServerId  // BattleServerId == 3
    GMServerId      // GMServerId == 4
    DBServerId      // DBServerId == 5
    CenterServerId  // CenterServerId == 6
)

// 反向代理服务器的消息定义
const (
    INIYPROXY             = iota //  ==0
    C2Proxy_SendDataProto        //  C2Proxy_SendDataProto == 1  
    Proxy2C_SendDataProto        //  Proxy2C_SendDataProto == 2
    G2Proxy_ConnDataProto        //  G2Proxy_ConnDataProto == 3  
    Proxy2G_ConnDataProto        //  Proxy2G_ConnDataProto == 4
    G2Proxy_SendDataProto        //  G2Proxy_SendDataProto == 5  
    Proxy2G_SendDataProto        //  Proxy2G_SendDataProto == 6
    C2Proxy_ConnDataProto        //  C2Proxy_ConnDataProto == 7  
    Proxy2C_ConnDataProto        //  Proxy2C_ConnDataProto == 8
)

注意事项

  1. 反向代理服务器启动顺序
以LollipopGo分布式游戏架构为例:
1. 反向代理服务器需要在其他服务器启动前启动,原因是反向代理相当于内网服务器是服务器,而内网服务器角色是
“客户端”,所以需要先启动后内网服务器主动连接反向代理服务器
2. 游戏反向代理服务器是每组服务器的消息总入口,所以反向代理服务器的逻辑功能尽量简单
3. 反向代理服务器功能:客户端注册,内网服务器注册,消息转发到对应服务器,消息转发到指定玩家

你可能感兴趣的:(LollipopGo:代理服务器)