LollipopGo:代理服务器

作者: Golang语言社区 | 来源:发表于2020-10-04 16:22 被阅读0次

    代理服务器

    游戏服务器开发过程中,整个服务器的架构设计对于项目的影响是至关重要的,其中包括登录流程,消息机制流程,消息加密流程 内部服务器消息跳转,定时任务等。 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:代理服务器

        本文链接:https://www.haomeiwen.com/subject/leunuktx.html