package main import ( "context" clientv3 "go.etcd.io/etcd/client/v3" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "sonet/api/gen/chat" "sonet/internal/chat/logic" "sonet/pkg/config" "sonet/pkg/grpc/discovery" "sonet/pkg/plugins/mq" "sonet/pkg/protocol/deliver" "sonet/pkg/utils/shutdown" ) func main() { conf := config.LoadConfig(nil, "cmd/chat") // registry and run... etcdClient, err := clientv3.New(conf.Etcd) if err != nil { panic(err) } shutdown.AddHook(func() { if err := etcdClient.Close(); err != nil { panic(err) } }, shutdown.WithOrderBack()) // etcd discovery dis := discovery.NewEtcdDiscovery(etcdClient) ctx, cancel := context.WithCancel(context.Background()) shutdown.AddHook(cancel) picker := deliver.NewPostalPicker(dis, grpc.WithTransportCredentials(insecure.NewCredentials())) if err = picker.Init(ctx); err != nil { panic(err) } deli := deliver.NewDeliver(chat.Chat_ServiceDesc.ServiceName, picker) consumer, err := mq.NewNatsConsumer(conf.Nats) if err != nil { panic(err) } groupDeli := deliver.NewGroupDeliver(chat.Chat_ServiceDesc.ServiceName, logic.NewRoomLoader(), consumer) chatServer := logic.NewChatServer(deli, groupDeli) go func() { err = chatServer.Run(conf.Grpc, dis) if err != nil { panic(err) } }() shutdown.Await() }