distributed-golang-game-server

command module
v0.0.0-...-620f6c9 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 25, 2022 License: MIT Imports: 10 Imported by: 0

README

Golang Distributed Game Server

Go Report Card CircleCI Gitter

Motivation

At first, I just want to learn Golang.I started to think about which is the best way? Because the concurrency mechanisms of Golang is very powerful, I choose online game to verify if I can use Golang to make a efficient game server.For me, this is the first time I make this such hard project. I have to learn Unity, Golang, C# At a time. I am glad that I still have full passion to this project and I never give up.

Tech/framework used

  • golang
  • gRPC
  • Kubernetes
  • Protobuf

Features

  • CrossPlatform - Message packet use protobuf which is light, fast, crossplatform.
  • Autoscaling - controller is written with go-client ,you can wirte the strategy to autoscale dedicated game server by your own.
  • Lightweight - The image of dedicated game server is less than 40MB.

Architecture

Agent server :
  • match players to join other player's room or create own room
  • control the amount of gameplay server and load balancing. when the amountof a gameplay server's connections exceed maxium connections it should have, agent will create a new pod run gameplay server.
Gameplay Server :
  • After players are matched successfully ,these players will get the gameplay server's ip and token,and player can start to play.
Packet Validating

In the branch master, I use ODE to simulate the physics on server.It is the most safe way to keep game fair.However, I found the memory server use is too much for me, Because I don't have money to maintance the server. So I started to design a way to let client validate packet and simulate physics separatly to reduce the heavy load on the server. I just complete the entities can attack each others so far. I will start to design aftewards:

  • The validation part preventing form players cheating
  • The interface connecting a physics simulator

Installation

  • Server : Two Way to run server:

    • Run distributed server using Kubernete cluster
      1. Use Kops to install kubernete on AWS
      2. Create cluster
      3. Install Mongodb
      4. edit setupEnv.sh with your setting and bash setupEnv.sh
      5. go run main.go --type=agent on your local machine (Must on Where you install Kops)
    • Run Standalone Server on local machine
      1. Install Mongodb
      2. edit setupEnv.sh( DONT_USE_KUBE = true )with your setting and bash setupEnv.sh
      3. go run main.go --type=standalone on your local machine
  • Client :

    • Download this project
    • You can run in Unity Editor by open the Prestart.scene as first scene.
    • If you want to test with mutliplayer you can try build Andorid apk because it is likely to be builded successfully.

    DEMO

How to use?

If you want to make your own game by modifying this project, I am pleasured. You can throught these step to make it work.

Modify The msg/message.proto
  1. Change the GameFrame message in proto buff.
  2. Run './update.sh' in 'msg/'
  3. unzip message.zip under 'Asset/gameServer/proto' in the Unity Project.
Create Your Game Logic
  1. add your handler to "gameServer/game/session/room.go": func (r *Room) Run()
  2. modify the UpdateFrame fuction to handle packets design by yourself. then,Data Flow to Entity to render the change of entity's properties.

The file structure:

  • agent
    • session
      • room.go
      • session.go
      • kubernetes.go
  • game
    • room.go
    • session.go
    • kubernetes.go
  • msg Use Protobuf to define package and RPC service interface
  • uuid generate different IDs of objects that can be call with reflection
  • user
    • UserManager
    • User
  • storage Use mongoDB to storage user infomation

Support me

Buy Me A Coffee

Documentation

The Go Gopher

There is no documentation for this package.

Directories

Path Synopsis
hmap
Command go-heightmap provides a basic Square Diamond heightmap / terrain generator.
Command go-heightmap provides a basic Square Diamond heightmap / terrain generator.
msg
Package msg is a generated protocol buffer package.
Package msg is a generated protocol buffer package.
github.com/golang/protobuf/ptypes/any
Package any is a generated protocol buffer package.
Package any is a generated protocol buffer package.
rpctest

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL