package main import ( "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" "sig-pub/pkg/storage/kvrocks" vmts "sig-pub/pkg/storage/tsdb/victoria_metrics" "sig-pub/pkg/utils/exit" "sig-pub/pkg/zlog" "github.com/hashicorp/consul/api" _ "github.com/mostynb/go-grpc-compression/snappy" // 注册grpc snappy compress "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/reflection" ) type ExchangeConf struct { Register discovery.Server GrpcReflection bool Okx config.OkxExchange } func main() { // load config conf := config.MustLoadConfig(new(config.Configuration), "config/config.toml") exchangeConf := config.MustLoadConfig(new(ExchangeConf), "config/exchange.toml") // consul 配置 cc := api.DefaultConfig() cc.Address = conf.Consul.Address client, err := api.NewClient(cc) if err != nil { panic(fmt.Errorf("consul client error: %v", err)) } dis := discovery.NewConsulDiscovery(client) resolver := dis.Resolver() // new market grpc client marketUrl := discovery.ConsulDialUrl(pb.MarketService_ServiceDesc.ServiceName) marketConn, err := grpc.NewClient(marketUrl, grpc.WithResolvers(resolver), grpc.WithTransportCredentials(insecure.NewCredentials()), ) if err != nil { panic(err) } marketClient := pb.NewMarketServiceClient(marketConn) tradeInstanceAside := aside.NewTradeInstanceAside(marketClient) // kvrocks db kvdb := kvrocks.NewKVRocksDB(conf.Database.Kvrocks) if err := kvdb.Ping(); err != nil { panic(err) } // okx exchange okxSubscriber := okx.NewOkxSubscriber(exchangeConf.Okx) if err := okxSubscriber.Init(); err != nil { panic(err) } okxFetcher := okx.NewOkxFetcher(exchangeConf.Okx.HttpProxy) okxExchange := exchange.NewExchange(okxFetcher, okxSubscriber) // tsdb VictoriaMetrics vmtsdb := vmts.NewVictoriaMetricsTSDB(conf.Tsdb.Victoriametrics) tsdbService := exchange.NewExchangeDataService(vmtsdb, kvdb) if err := tsdbService.Init(); err != nil { panic(err) } // exchange main service exchangeService := exchange.NewExchangeService(tradeInstanceAside, tsdbService, okxExchange) if err := exchangeService.Init(); err != nil { panic(err) } exchangeGrpcServer := exchange.NewExchangeGrpcServer(exchangeService) if err := exchangeGrpcServer.Init(); err != nil { panic(err) } // grpc.WithDefaultCallOptions(grpc.UseCompressor("snappy")) grpcServer := grpc.NewServer(config.GetGrpcOptions( conf.Grpc, grpc.UnaryInterceptor(interceptor.RecoverInterceptor), )..., ) if exchangeConf.GrpcReflection { // 注册反射服务 reflection.Register(grpcServer) } pb.RegisterExchangeServiceServer(grpcServer, exchangeGrpcServer) exit.AddHook(grpcServer.GracefulStop, exit.WithOrderFront()) // consul 服务注册 register := exchangeConf.Register register.Name = pb.ExchangeService_ServiceDesc.ServiceName if err := dis.Registry(grpcServer, register); err != nil { panic(err) } // 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() }