package main import ( "context" clientv3 "go.etcd.io/etcd/client/v3" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "sonet/api/gen/auth" "sonet/api/gen/mahjong" "sonet/internal/mahjong/logic" "sonet/internal/mahjong/store" "sonet/pkg/config" "sonet/pkg/grpc/discovery" "sonet/pkg/grpc/discovery/etcd" "sonet/pkg/protocol/deliver" "sonet/pkg/utils/shutdown" ) func main() { conf := config.LoadConfig(nil, "cmd/mahjong") // registry and run... etcdClient, err := clientv3.New(conf.Etcd) if err != nil { panic(err) } registry := etcd.NewRegister(etcdClient) shutdown.AddHook(registry.Stop) // init deliver dis := discovery.NewEtcdDiscovery(etcdClient) resolver, err := dis.Resolver() if err != nil { panic(err) } deli := deliver.NewDeliver(mahjong.Mahjong_ServiceDesc.ServiceName) if err := deli.InitWithResolver(context.Background(), dis); err != nil { panic(err) } mjStore := store.NewStore(deli) // auth conn url := discovery.EtcdDialUrl(auth.Auth_ServiceDesc.ServiceName) authConn, err := grpc.DialContext(context.Background(), url, grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithResolvers(resolver), ) if err != nil { panic(err) } mahjongServer := logic.NewMahjongServer(mjStore, auth.NewAuthClient(authConn), deli) go func() { err = mahjongServer.Run(conf.Grpc, dis) if err != nil { panic(err) } }() shutdown.Await() }