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.
130 lines
3.6 KiB
130 lines
3.6 KiB
package main |
|
|
|
import ( |
|
"github.com/nats-io/nats.go" |
|
"github.com/redis/go-redis/v9" |
|
clientv3 "go.etcd.io/etcd/client/v3" |
|
"go.etcd.io/etcd/client/v3/naming/resolver" |
|
"google.golang.org/grpc" |
|
"google.golang.org/grpc/credentials/insecure" |
|
"sonet/internal/gateway_ws/gws_server" |
|
"sonet/internal/postal/logic" |
|
"sonet/pkg/config" |
|
"sonet/pkg/grpc/client" |
|
"sonet/pkg/grpc/discovery" |
|
"sonet/pkg/grpc/generic" |
|
"sonet/pkg/plugins/cache" |
|
"sonet/pkg/plugins/mq" |
|
"sonet/pkg/protocol/session" |
|
"sonet/pkg/utils/conver" |
|
"sonet/pkg/utils/logger" |
|
"sonet/pkg/utils/shutdown" |
|
) |
|
|
|
type GatewayWsConfig struct { |
|
HttpPort int |
|
EndpointAddress string |
|
|
|
SubjectCacheTopic string |
|
SubjectLrcExpiration string |
|
SubjectLrcCleanupInterval string |
|
} |
|
|
|
// websocket server with postalService |
|
func main() { |
|
appConf := &GatewayWsConfig{} |
|
conf := config.LoadConfig(appConf, "cmd/gateway_ws") |
|
|
|
// registry and run |
|
etcdClient, err := clientv3.New(conf.Etcd) |
|
if err != nil { |
|
panic(err) |
|
} |
|
subjectStore, err := getSubjectMultiCache(appConf, conf.Redis, conf.Nats) |
|
if err != nil { |
|
panic(err) |
|
} |
|
|
|
etcdResolver, err := resolver.NewBuilder(etcdClient) |
|
if err != nil { |
|
panic(err) |
|
} |
|
grpcFactory := generic.NewGpcGenericClientFactory("etcd", |
|
grpc.WithTransportCredentials(insecure.NewCredentials()), |
|
grpc.WithResolvers(etcdResolver), |
|
) |
|
grpcFactory.Init() |
|
|
|
sessionStore := session.NewMapStore() |
|
|
|
postalAddr := discovery.MustRegisterAddress(conf.Grpc.Address) |
|
//connHandler := server.NewConnHandler(postalAddr, grpcFactory, sessionStore, subjectStore) |
|
//httpServer := server.NewHttpServer(connHandler) |
|
gwsHandler := gws_server.NewGwsHandler(postalAddr, grpcFactory, sessionStore, subjectStore) |
|
httpServer := gws_server.NewGwsServer(gwsHandler) |
|
httpServer.Init() |
|
|
|
go func() { |
|
err = httpServer.Run(appConf.HttpPort) |
|
if err != nil { |
|
panic(err) |
|
} |
|
}() |
|
|
|
// run postal server |
|
shutdown.AddShutdownHook(func() { |
|
if err := etcdClient.Close(); err != nil { |
|
logger.Error("etcd close error: ", err) |
|
} |
|
}) |
|
clientFactory := client.NewGrpcDirectClientFactory(grpc.WithTransportCredentials(insecure.NewCredentials())) |
|
postalServer := logic.NewPostalServer(appConf.EndpointAddress, sessionStore, subjectStore, clientFactory) |
|
go func() { |
|
err = postalServer.Run(conf.Grpc, etcdClient) |
|
if err != nil { |
|
panic(err) |
|
} |
|
}() |
|
|
|
// run postal cluster server |
|
postalClusterServer := logic.NewPostalClusterServer(postalServer) |
|
go func() { |
|
err := postalClusterServer.Run(conf.Grpc.Address, config.GetGrpcOptions(conf.Grpc)...) |
|
if err != nil { |
|
panic(err) |
|
} |
|
}() |
|
|
|
shutdown.Await() |
|
} |
|
|
|
func getSubjectMultiCache(appConf *GatewayWsConfig, redisOptions redis.Options, natsOptions nats.Options) (*cache.LocalRemoteCache, error) { |
|
// initial cache... |
|
rdb := redis.NewClient(&redisOptions) |
|
subjectRedisCache := cache.NewRedisCache(appConf.SubjectCacheTopic, rdb) |
|
shutdown.AddShutdownHook(func() { _ = rdb.Close() }) |
|
|
|
// nats mq |
|
producer, err := mq.NewNatsProducer(natsOptions) |
|
if err != nil { |
|
return nil, err |
|
} |
|
shutdown.AddShutdownHook(func() { producer.Stop() }) |
|
consumer, err := mq.NewNatsConsumer(natsOptions) |
|
if err != nil { |
|
return nil, err |
|
} |
|
shutdown.AddShutdownHook(func() { consumer.Stop() }) |
|
|
|
// 多级缓存 |
|
subjectLrcOpts := cache.LocalRemoteCacheOptions{ |
|
Topic: appConf.SubjectCacheTopic, |
|
LocalExpiration: conver.MustParseDuration(appConf.SubjectLrcExpiration), |
|
CleanupInterval: conver.MustParseDuration(appConf.SubjectLrcCleanupInterval), |
|
Remote: subjectRedisCache, |
|
Producer: producer, |
|
Consumer: consumer, |
|
} |
|
subjectLrc, err := cache.NewLocalRemoteCache(subjectLrcOpts) |
|
return subjectLrc, err |
|
}
|
|
|