dragonfly/manager/server/server.go

129 lines
3.0 KiB
Go

/*
* Copyright 2020 The Dragonfly Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package server
import (
"context"
"net/http"
logger "d7y.io/dragonfly/v2/internal/dflog"
"d7y.io/dragonfly/v2/manager/cache"
"d7y.io/dragonfly/v2/manager/config"
"d7y.io/dragonfly/v2/manager/database"
"d7y.io/dragonfly/v2/manager/searcher"
"d7y.io/dragonfly/v2/manager/service"
"d7y.io/dragonfly/v2/pkg/rpc"
"d7y.io/dragonfly/v2/pkg/rpc/manager"
"golang.org/x/sync/errgroup"
"google.golang.org/grpc"
)
type Server struct {
// Server configuration
config *config.Config
// GRPC service
service *service.GRPC
// REST server
restServer *http.Server
}
func New(cfg *config.Config) (*Server, error) {
// Initialize database
db, err := database.New(cfg)
if err != nil {
return nil, err
}
// Initialize cache
cache := cache.New(cfg)
// Initialize searcher
searcher := searcher.New()
// Initialize REST service
restService := service.NewREST(
service.WithDatabase(db),
service.WithCache(cache),
)
// Initialize GRPC service
grpcService := service.NewGRPC(
service.GRPCWithDatabase(db),
service.GRPCWithCache(cache),
service.GRPCWithSearcher(searcher),
)
// Initialize router
router, err := initRouter(cfg.Verbose, restService)
if err != nil {
return nil, err
}
return &Server{
config: cfg,
service: grpcService,
restServer: &http.Server{
Addr: cfg.Server.REST.Addr,
Handler: router,
},
}, nil
}
func (s *Server) Serve() error {
g := errgroup.Group{}
// GRPC listener
lis, _, err := rpc.ListenWithPortRange(s.config.Server.GRPC.Listen, s.config.Server.GRPC.PortRange.Start, s.config.Server.GRPC.PortRange.End)
if err != nil {
logger.Errorf("failed to net listen: %+v", err)
return err
}
// Serve GRPC
g.Go(func() error {
defer lis.Close()
grpcServer := grpc.NewServer()
manager.RegisterManagerServer(grpcServer, s.service)
logger.Infof("serve grpc at %s://%s", lis.Addr().Network(), lis.Addr().String())
if err := grpcServer.Serve(lis); err != nil {
logger.Errorf("failed to start manager grpc server: %+v", err)
}
return nil
})
// Serve REST
g.Go(func() error {
if err := s.restServer.ListenAndServe(); err != nil {
logger.Errorf("failed to start manager rest server: %+v", err)
return err
}
return nil
})
return g.Wait()
}
func (s *Server) Stop() {
// Stop REST
err := s.restServer.Shutdown(context.TODO())
if err != nil {
logger.Errorf("failed to stop manager rest server: %+v", err)
}
}