GitHub - lonnng/nano: Lightweight, facility, high performance golang based game...
source link: https://github.com/lonnng/nano
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
README.md
Nano
Nano is an easy to use, fast, lightweight game server networking library for Go. It provides a core network architecture and a series of tools and libraries that can help developers eliminate boring duplicate work for common underlying logic. The goal of nano is to improve development efficiency by eliminating the need to spend time on repetitious network related programming.
Nano was designed for server-side applications like real-time games, social games, mobile games, etc of all sizes.
How to build a system with Nano
What does a Nano
application look like?
The simplest "nano" application as shown in the following figure, you can make powerful applications by combining different components.
In fact, the nano
application is a collection of Component , and a component is a bundle of Handler, once you register a component to nano, nano will register all methods that can be converted to Handler
to nano service container. Service was accessed by Component.Handler
, and the handler will be called while client request. The handler will receive two parameters while handling a message:
*session.Session
: corresponding a client that apply this request or notify.*protocol.FooBar
: the payload of the request.
While you had processed your logic, you can response or push message to the client by session.Response(payload)
and session.Push('eventName', payload)
, or returns error when some unexpected data received.
How to build distributed system with Nano
Nano has no built-in distributed system components, but you can easily implement it with gRPC
and smux
. Here we take grpc as an example.
- First of all, you need to define a remote component
type RemoteComponent struct { rpcClients []*grpc.ClientConn }
- Second, fetch all grpc servers infomation from services like
etcd
orconsul
innano
lifetime hooks
type ServerInfo struct { Host string `json:"host"` Port int `json:"port"` } // lifetime callback func (r *RemoteComponent) Init() { // fetch server list from etcd resp, err := http.Get("http://your_etcd_server/backend/server_list/area/10023") if err != nil { panic(err) } servers := []ServerInfo{} if err := json.NewDecoder(resp.Body).Decode(&servers); err != nil { panic(err) } for i := range servers { server := servers[i] client, err := grpc.Dial(fmt.Sprintf("%s:%d", server.Host, server.Post), options) if err != nil { panic(err) } r.rpcClients = append(r.rpcClients, client) } } func (r *RemoteComponent) client(s *session.Session) *grpc.ClientConn { // load balance return r.rpcClients[s.UID() % len(s.rpcClients)] } // Your handler, accessed by: // nanoClient.Request("RemoteComponent.DemoHandler", &pb.DemoMsg{/*...*/}) func (r *RemoteComponent) DemoHandler(s *session.Session, msg *pb.DemoMsg) error { client := r.client(s) // do something with client // .... // ... return nil }
The Nano will remain simple, but you can perform any operations in the component and get the desired goals. You can startup a group of Nano
application as agent to dispatch message to backend servers.
Documents
-
English
-
简体中文
Resources
-
Javascript
-
Demo
Community
Successful cases
Installation
go get github.com/lonnng/nano
# dependencies
go get -u github.com/golang/protobuf
go get -u github.com/gorilla/websocket
Benchmark
# Case: PingPong # OS: Windows 10 # Device: i5-6500 3.2GHz 4 Core/1000-Concurrent => IOPS 11W(Average) # Other: ... cd $GOPATH/src/github.com/lonnng/nano/benchmark/io go test -v -tags "benchmark"
License
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK