• Stars
    star
    165
  • Rank 228,906 (Top 5 %)
  • Language
    Go
  • License
    MIT License
  • Created over 6 years ago
  • Updated almost 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A distributed game server made with Golang

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