package main import ( "context" "fmt" "net" "sig-pub/api/pb" "sig-pub/internal/exchange" "sig-pub/internal/exchange/okx" "sig-pub/pkg/aside" "sig-pub/pkg/config" "sig-pub/pkg/grpc/discovery" "sig-pub/pkg/grpc/interceptor" vmts "sig-pub/pkg/storage/tsdb/victoria_metrics" "sig-pub/pkg/utils/exit" "sig-pub/pkg/zlog" clientv3 "go.etcd.io/etcd/client/v3" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/reflection" ) type ExchangeConf struct { Register discovery.Server GrpcReflection bool } func main() { // load config conf := config.MustLoadConfig(new(config.Configuration), "config/config.toml") exchangeConf := config.MustLoadConfig(new(ExchangeConf), "config/exchange.toml") // tsdb VictoriaMetrics vmtsdb := vmts.NewVictoriaMetricsTSDB(conf.Tsdb.Victoriametrics) tsdbService := exchange.NewExchangeDataService(vmtsdb, nil) if err := tsdbService.Init(); err != nil { panic(err) } okxExchange := okx.NewOkxExchange(conf.Exchange.Okx) if err := okxExchange.Init(); err != nil { panic(err) } etcdClient, err := clientv3.New(conf.Etcd) if err != nil { panic(err) } exit.AddHook(func() { _ = etcdClient.Close() }, exit.WithOrderTail()) // get market grpc client dis := discovery.NewEtcdDiscovery(etcdClient) resolver, err := dis.Resolver() if err != nil { panic(err) } url := fmt.Sprintf("%s:///%s", discovery.EtcdSchema, pb.Market_ServiceDesc.ServiceName) conn, err := grpc.NewClient(url, grpc.WithResolvers(resolver), grpc.WithTransportCredentials(insecure.NewCredentials()), ) if err != nil { panic(err) } marketClient := pb.NewMarketClient(conn) tradeInstanceAside := aside.NewTradeInstanceAside(marketClient) exchangeService := exchange.NewExchangeGrpcServer(tradeInstanceAside, tsdbService, okxExchange) if err := exchangeService.Init(); err != nil { panic(err) } grpcServer := grpc.NewServer(config.GetGrpcOptions( conf.Grpc, grpc.UnaryInterceptor(interceptor.RecoverInterceptor))..., ) if exchangeConf.GrpcReflection { // 注册反射服务 reflection.Register(grpcServer) } pb.RegisterExchangeServiceServer(grpcServer, exchangeService) registry := discovery.NewEtcdDiscovery(etcdClient) register := exchangeConf.Register if register.Name == "" { register.Name = pb.Market_ServiceDesc.ServiceName } ctx, cancel := context.WithCancel(context.Background()) exit.AddHook(cancel, exit.WithOrderFront()) if err := registry.Registry(ctx, register); err != nil { panic(err) } exit.AddHook(grpcServer.GracefulStop, exit.WithOrderFront()) // run grpc server go func() { listen, err := net.Listen("tcp", exchangeConf.Register.Addr) if err != nil { panic(err) } zlog.Infof("%s grpc server running %s\n", register.Name, listen.Addr().String()) if err := grpcServer.Serve(listen); err != nil { panic(err) } }() exit.Await() }