grpc.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package grpc
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/go-nunu/nunu-layout-advanced/pkg/log"
  6. "google.golang.org/grpc"
  7. "net"
  8. "time"
  9. )
  10. type Server struct {
  11. *grpc.Server
  12. host string
  13. port int
  14. logger *log.Logger
  15. }
  16. type Option func(s *Server)
  17. func NewServer(logger *log.Logger, opts ...Option) *Server {
  18. s := &Server{
  19. Server: grpc.NewServer(),
  20. logger: logger,
  21. }
  22. for _, opt := range opts {
  23. opt(s)
  24. }
  25. return s
  26. }
  27. func WithServerHost(host string) Option {
  28. return func(s *Server) {
  29. s.host = host
  30. }
  31. }
  32. func WithServerPort(port int) Option {
  33. return func(s *Server) {
  34. s.port = port
  35. }
  36. }
  37. func (s *Server) Start(ctx context.Context) error {
  38. lis, err := net.Listen("tcp", fmt.Sprintf("%s:%d", s.host, s.port))
  39. if err != nil {
  40. s.logger.Sugar().Fatalf("Failed to listen: %v", err)
  41. }
  42. if err = s.Server.Serve(lis); err != nil {
  43. s.logger.Sugar().Fatalf("Failed to serve: %v", err)
  44. }
  45. return nil
  46. }
  47. func (s *Server) Stop(ctx context.Context) error {
  48. ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
  49. defer cancel()
  50. s.Server.GracefulStop()
  51. s.logger.Info("Server exiting")
  52. return nil
  53. }