package main import ( "context" "fmt" "github.com/gin-gonic/gin" clientv3 "go.etcd.io/etcd/client/v3" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/resolver" "net/http" config2 "sonet/internal/gateway_http/config" "sonet/internal/gateway_http/logic" "sonet/pkg/config" "sonet/pkg/grpc/discovery" "sonet/pkg/grpc/generic" "sonet/pkg/utils/shutdown" ) type GatewayHttpConfig struct { Port int IgnoreUrls []string AesTokenKey string } func main() { appConf := &GatewayHttpConfig{} conf := config.LoadConfig(appConf, "cmd/gateway_http") // grpc generic client factory etcdClient, err := clientv3.New(conf.Etcd) if err != nil { panic(err) } etcdResolver := discovery.NewResolver(etcdClient) shutdown.AddShutdownHook(etcdResolver.Close) resolver.Register(etcdResolver) // gin http server authFilter, err := config2.NewAuthFilter(appConf.AesTokenKey, appConf.IgnoreUrls) if err != nil { panic(err) } server := gin.Default() server.Use(authFilter.Filter) // postal loadBalancer handler postalBalancer := logic.NewPostalBalancer() postalBalancer.Init(context.Background()) server.GET("/api/lb/ws", postalBalancer.Endpoint) // grpc services grpcGroup := server.Group("/api/svc") grpcFactory := generic.NewGpcGenericClientFactory(etcdResolver, grpc.WithTransportCredentials(insecure.NewCredentials())) grpcFactory.Init() grpcGenericHandler := logic.NewGrpcGenericHandler(grpcFactory) grpcGenericHandler.Route(grpcGroup) go func() { err := server.Run(fmt.Sprintf(":%d", appConf.Port)) if err != nil { panic(err) } }() shutdown.Await() } var jsonContentType = []string{"application/json; charset=utf-8"} type RenderMarshaledJson struct { MarshaledJson []byte } func (r RenderMarshaledJson) Render(writer http.ResponseWriter) error { r.WriteContentType(writer) _, err := writer.Write(r.MarshaledJson) return err } func (r RenderMarshaledJson) WriteContentType(w http.ResponseWriter) { header := w.Header() header["Content-Type"] = jsonContentType }