這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
在寫遊戲伺服器中, 特別是卡牌一類的遊戲, 經常需要讓使用者手動輸入房間號加入一個房間, 為了方便使用, 這個房間號通常需要限定長度, 比如4位或者6位元字. 因此用資料庫的auto_increment對使用者不太友好, 其一是長度不固定, 其二是後期房間號會很長, 所以專門寫了一個房間號產生器伺服器, 其滿足以下需求:
- 指定產生的的房間號範圍: 比如
[100000, 1000000)
- 租借到期: 當一個房間號被產生後, 若逾時未續期, 則自動釋放(凍結)
- 房間號凍結: 當一個房間號被歸還後, 在指定時間範圍內不會被重新分配
安裝
項目地址: https://github.com/acrazing/uno
安裝:
go get -u github.com/acrazing/uno
使用
介面很簡單:
import "github.com/acrazing/uno"import "context"// 建立一個workerw := uno.NewWorker()// 配置w.Init(&uno.Options{ MinValue: 1e5, MaxValue: 1e6,})
// 啟動服務go w.Run(context.Background())
// 產生IDno := w.Rent()if no == 0 { // 如果返回0, 則表示產生房間號失敗 panic("")}
// 釋放IDw.Return(no)
// 續租IDok := w.Relet(no)if ok { // 如果返回false, 表示續租失敗}
gRPC
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)