You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
3.2 KiB
123 lines
3.2 KiB
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" |
|
"sig-pub/pkg/storage/kvrocks" |
|
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) |
|
} |
|
|
|
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) |
|
|
|
// kvrocks db |
|
kvdb := kvrocks.NewKVRocksDB(conf.Database.Kvrocks) |
|
if err := kvdb.Ping(); err != nil { |
|
panic(err) |
|
} |
|
|
|
// okx exchange |
|
okxSubscriber := okx.NewOkxSubscriber(conf.Exchange.Okx) |
|
if err := okxSubscriber.Init(); err != nil { |
|
panic(err) |
|
} |
|
okxFetcher := okx.NewOkxFetcher(conf.Exchange.Okx.HttpProxy) |
|
okxExchange := exchange.NewExchange(okxFetcher, okxSubscriber) |
|
|
|
// exhcange main service |
|
exchangeService := exchange.NewExchangeGrpcServer(tradeInstanceAside, tsdbService, kvdb, 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() |
|
}
|
|
|