Skip to content

Instantly share code, notes, and snippets.

@amsokol
Created September 16, 2018 05:47
Show Gist options
  • Save amsokol/a655142929103438214e8d75c8766146 to your computer and use it in GitHub Desktop.
Save amsokol/a655142929103438214e8d75c8766146 to your computer and use it in GitHub Desktop.
package cmd
import (
"context"
"database/sql"
"flag"
"fmt"
// mysql driver
_ "github.com/go-sql-driver/mysql"
"github.com/amsokol/go-grpc-http-rest-microservice-tutorial/pkg/logger"
"github.com/amsokol/go-grpc-http-rest-microservice-tutorial/pkg/protocol/grpc"
"github.com/amsokol/go-grpc-http-rest-microservice-tutorial/pkg/protocol/rest"
"github.com/amsokol/go-grpc-http-rest-microservice-tutorial/pkg/service/v1"
)
// Config is configuration for Server
type Config struct {
// gRPC server start parameters section
// GRPCPort is TCP port to listen by gRPC server
GRPCPort string
// HTTP/REST gateway start parameters section
// HTTPPort is TCP port to listen by HTTP/REST gateway
HTTPPort string
// DB Datastore parameters section
// DatastoreDBHost is host of database
DatastoreDBHost string
// DatastoreDBUser is username to connect to database
DatastoreDBUser string
// DatastoreDBPassword password to connect to database
DatastoreDBPassword string
// DatastoreDBSchema is schema of database
DatastoreDBSchema string
// Log parameters section
// LogLevel is global log level: Debug(-1), Info(0), Warn(1), Error(2), DPanic(3), Panic(4), Fatal(5)
LogLevel int
// LogTimeFormat is print time format for logger e.g. 2006-01-02T15:04:05Z07:00
LogTimeFormat string
}
// RunServer runs gRPC server and HTTP gateway
func RunServer() error {
ctx := context.Background()
// get configuration
var cfg Config
flag.StringVar(&cfg.GRPCPort, "grpc-port", "", "gRPC port to bind")
flag.StringVar(&cfg.HTTPPort, "http-port", "", "HTTP port to bind")
flag.StringVar(&cfg.DatastoreDBHost, "db-host", "", "Database host")
flag.StringVar(&cfg.DatastoreDBUser, "db-user", "", "Database user")
flag.StringVar(&cfg.DatastoreDBPassword, "db-password", "", "Database password")
flag.StringVar(&cfg.DatastoreDBSchema, "db-schema", "", "Database schema")
flag.IntVar(&cfg.LogLevel, "log-level", 0, "Global log level")
flag.StringVar(&cfg.LogTimeFormat, "log-time-format", "",
"Print time format for logger e.g. 2006-01-02T15:04:05Z07:00")
flag.Parse()
if len(cfg.GRPCPort) == 0 {
return fmt.Errorf("invalid TCP port for gRPC server: '%s'", cfg.GRPCPort)
}
if len(cfg.HTTPPort) == 0 {
return fmt.Errorf("invalid TCP port for HTTP gateway: '%s'", cfg.HTTPPort)
}
// initialize logger
if err := logger.Init(cfg.LogLevel, cfg.LogTimeFormat); err != nil {
return fmt.Errorf("failed to initialize logger: %v", err)
}
// add MySQL driver specific parameter to parse date/time
// Drop it for another database
param := "parseTime=true"
dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?%s",
cfg.DatastoreDBUser,
cfg.DatastoreDBPassword,
cfg.DatastoreDBHost,
cfg.DatastoreDBSchema,
param)
db, err := sql.Open("mysql", dsn)
if err != nil {
return fmt.Errorf("failed to open database: %v", err)
}
defer db.Close()
v1API := v1.NewToDoServiceServer(db)
// run HTTP gateway
go func() {
_ = rest.RunServer(ctx, cfg.GRPCPort, cfg.HTTPPort)
}()
return grpc.RunServer(ctx, v1API, cfg.GRPCPort)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment