在写游戏服务器中, 特别是卡牌一类的游戏, 常常须要让用户手动输入房间号加入一个房间, 为了用户友好, 这个房间号一般须要限定长度, 好比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)