在寫遊戲服務器中, 特別是卡牌一類的遊戲, 常常須要讓用戶手動輸入房間號加入一個房間, 爲了用戶友好, 這個房間號一般須要限定長度, 好比4位或者6位數字. 所以用數據庫的auto_increment對用戶不太友好, 其一是長度不固定, 其二是後期房間號會很長, 因此專門寫了一個房間號生成器服務器, 其知足如下需求:git
[100000, 1000000)
項目地址: https://github.com/acrazing/unogithub
安裝:數據庫
go get -u github.com/acrazing/uno
接口很簡單:bash
import "github.com/acrazing/uno" import "context" // 建立一個worker w := uno.NewWorker() // 配置 w.Init(&uno.Options{ MinValue: 1e5, MaxValue: 1e6, })
// 啓動服務 go w.Run(context.Background())
// 生成ID no := w.Rent() if no == 0 { // 若是返回0, 則表示生成房間號失敗 panic("") }
// 釋放ID w.Return(no)
// 續租ID ok := w.Relet(no) if ok { // 若是返回false, 表示續租失敗 }
gRPC的服務和消息都已經定義好, 能夠直接取用:服務器
addr := "127.0.0.1:1234" // server listener, err := net.Listen("tcp", addr) if err != nil { panic(err) } server := grpc.NewServer() uno.RegisterUnoServer(server, uno.Service) uno.Service.Init(&uno.Options{ MinValue: 2, MaxValue: 5, TTF: time.Second, TTL: time.Second, }) go uno.Service.Run(context.Background()) go server.Serve(listener) // client conn, _ := grpc.Dial(addr, grpc.WithInsecure()) client := uno.NewUnoClient(conn) no, err := client.Rent(context.Background(), &uno.Empty{}) log.Printf("rent: %v, err: %v", no, err)