云海的博客
首页
  • 接口
  • 数组
  • slice
  • map
  • 指针
  • 反射
  • Context
  • sync.map
  • 锁
  • 类型和类型指针分析
  • recover
  • 从零实现RPC框架
  • make和new区别
  • channel
  • sync.Once
  • sync.Pool
  • protobuf
  • MongoDB pkg源码-findone
  • MyBatis
  • Maven
  • 解析Laravel框架—路由处理
  • PHP(客户端)与 Golang(服务端)使用grpc+protobuf 通信
  • JAVA(客户端)与 Golang(服务端) 使用grpc+protobuf通信
  • Docker使用笔记-常用命令
  • Docker使用笔记-容器间通讯
  • Docker使用笔记-搭建Redis集群
  • Docker使用笔记-镜像多阶段构建
  • Kubernetes部署golang服务
  • Linux常用命令
  • Docker安装Prometheus与Grafana
  • Protobuf
  • TCP抓包
  • 概述-《TCP/IP详解》读书笔记
  • 索引
  • 事务隔离级别
  • 常识
  • 每日一题(1)
  • 每日一题(2)
  • 每日一题(3)
  • 每日一题(4)
关于
GitHub (opens new window)

云海

服务端研发
首页
  • 接口
  • 数组
  • slice
  • map
  • 指针
  • 反射
  • Context
  • sync.map
  • 锁
  • 类型和类型指针分析
  • recover
  • 从零实现RPC框架
  • make和new区别
  • channel
  • sync.Once
  • sync.Pool
  • protobuf
  • MongoDB pkg源码-findone
  • MyBatis
  • Maven
  • 解析Laravel框架—路由处理
  • PHP(客户端)与 Golang(服务端)使用grpc+protobuf 通信
  • JAVA(客户端)与 Golang(服务端) 使用grpc+protobuf通信
  • Docker使用笔记-常用命令
  • Docker使用笔记-容器间通讯
  • Docker使用笔记-搭建Redis集群
  • Docker使用笔记-镜像多阶段构建
  • Kubernetes部署golang服务
  • Linux常用命令
  • Docker安装Prometheus与Grafana
  • Protobuf
  • TCP抓包
  • 概述-《TCP/IP详解》读书笔记
  • 索引
  • 事务隔离级别
  • 常识
  • 每日一题(1)
  • 每日一题(2)
  • 每日一题(3)
  • 每日一题(4)
关于
GitHub (opens new window)
  • 接口
  • 数组
  • slice
  • map
  • 反射
  • sync.Pool
  • net包笔记
  • net-rpc分析
  • 指针
  • 数组排序
  • Context
  • sync.map
  • 锁
  • recover
  • 泛型
  • 类型和类型指针分析
  • make和new区别
  • channel
  • sync.Once
  • protobuf
  • GoLand debug(1)
  • 从零实现RPC框架
  • 从零开始学Go Origin框架
    • MongoDB pkg源码-findone
    • Golang
    云海
    2022-05-28
    目录

    从零开始学Go Origin框架

    # 概述

    origin 是一个由 Go 语言(golang)编写的分布式开源游戏服务器引擎。origin适用于各类游戏服务器的开发,包括 H5(HTML5)游戏服务器。

    origin 解决的问题:

    • origin总体设计如go语言设计一样,总是尽可能的提供简洁和易用的模式,快速开发。
    • 能够根据业务需求快速并灵活的制定服务器架构。
    • 利用多核优势,将不同的service配置到不同的node,并能高效的协同工作。
    • 将整个引擎抽象三大对象,node,service,module。通过统一的组合模型管理游戏中各功能模块的关系。
    • 有丰富并健壮的工具库。

    # 生命周期

    main.go main() 
    node.go Start()
    command.go Run() 解析命令行参数
    command.go execute()
    
    args  = ...[]byte //
    
    // 计算总长度
    var msgLen uint32
    for i := 0; i < len(args); i++ {
      msgLen += uint32(len(args[i]))
    }
    
    if msgLen > p.maxMsgLen {      //长度不能大于4096
      return errors.New("message too long")
    } else if msgLen < p.minMsgLen {   //长度不能小于1
      return errors.New("message too short")
    }
    
    //创建一个byte容器,长度 = 2 +(内容长度)
    // msg := make([]byte, uint32(p.lenMsgLen)+msgLen)
    
    if p.littleEndian {     //是否是小端
      binary.LittleEndian.PutUint16(msg, uint16(msgLen))
    } else {
      binary.BigEndian.PutUint16(msg, uint16(msgLen))
    }
    
    // write data
    l := p.lenMsgLen
    for i := 0; i < len(args); i++ {
      copy(msg[l:], args[i])
      l += len(args[i])
    }
    
    conn.Write(msg)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    上次更新: 2023/01/11
    从零实现RPC框架
    MongoDB pkg源码-findone

    ← 从零实现RPC框架 MongoDB pkg源码-findone→

    最近更新
    01
    函数
    04-11
    02
    面试题
    04-11
    03
    EFK日志收集系统单机版
    08-18
    更多文章>
    Theme by Vdoing | Copyright © 2022-2025 Evan Xu | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式