Files
sponge/cmd/serverNameExample_grpcExample/main.go
2022-10-31 23:36:06 +08:00

240 lines
6.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"context"
"flag"
"fmt"
"strconv"
"time"
"github.com/zhufuyi/sponge/configs"
"github.com/zhufuyi/sponge/internal/config"
"github.com/zhufuyi/sponge/internal/model"
"github.com/zhufuyi/sponge/internal/server"
"github.com/zhufuyi/sponge/pkg/app"
"github.com/zhufuyi/sponge/pkg/logger"
"github.com/zhufuyi/sponge/pkg/nacoscli"
"github.com/zhufuyi/sponge/pkg/servicerd/registry"
"github.com/zhufuyi/sponge/pkg/servicerd/registry/consul"
"github.com/zhufuyi/sponge/pkg/servicerd/registry/etcd"
"github.com/zhufuyi/sponge/pkg/servicerd/registry/nacos"
"github.com/zhufuyi/sponge/pkg/tracer"
"github.com/jinzhu/copier"
)
var (
version string
configFile string
enableConfigCenter bool
)
// @title serverNameExample api docs
// @description http server api docs
// @schemes http https
// @version v0.0.0
// @host localhost:8080
func main() {
inits := registerInits()
servers := registerServers()
closes := registerCloses(servers)
s := app.New(inits, servers, closes)
s.Run()
}
// -------------------------------- 注册app初始化 ---------------------------------
func registerInits() []app.Init {
// 初始化配置
initConfig()
cfg := config.Get()
// 初始化日志
_, _ = logger.Init(
logger.WithLevel(cfg.Logger.Level),
logger.WithFormat(cfg.Logger.Format),
logger.WithSave(cfg.Logger.IsSave),
)
var inits []app.Init
// 初始化数据库
inits = append(inits, func() {
model.InitMysql()
model.InitCache(cfg.App.CacheType)
})
// 初始化链路跟踪
if cfg.App.EnableTracing {
inits = append(inits, func() {
tracer.InitWithConfig(
cfg.App.Name,
cfg.App.Env,
cfg.App.Version,
cfg.Jaeger.AgentHost,
strconv.Itoa(cfg.Jaeger.AgentPort),
cfg.App.TracingSamplingRate,
)
})
}
return inits
}
// 初始化配置
func initConfig() {
flag.StringVar(&version, "version", "", "service Version Number")
flag.BoolVar(&enableConfigCenter, "enable-cc", false, "whether to get from the configuration center, "+
"if true, the '-c' parameter indicates the configuration center")
flag.StringVar(&configFile, "c", "", "configuration file")
flag.Parse()
if enableConfigCenter {
// 从配置中心获取配置(先获取nacos配置再根据nacos配置中心读取服务配置)
if configFile == "" {
configFile = configs.Path("serverNameExample_cc.yml")
}
nacosConfig, err := config.NewCenter(configFile)
if err != nil {
panic(err)
}
appConfig := &config.Config{}
params := &nacoscli.Params{}
_ = copier.Copy(params, &nacosConfig.Nacos)
err = nacoscli.Init(appConfig, params)
if err != nil {
panic(fmt.Sprintf("connect to configuration center err, %v", err))
}
if appConfig.App.Name == "" {
panic("read the config from center error, config data is empty")
}
config.Set(appConfig)
} else {
// 从本地配置文件获取配置
if configFile == "" {
configFile = configs.Path("serverNameExample.yml")
}
err := config.Init(configFile)
if err != nil {
panic("init config error: " + err.Error())
}
}
if version != "" {
config.Get().App.Version = version
}
//fmt.Println(config.Show())
}
// -------------------------------- 注册app服务 ---------------------------------
func registerServers() []app.IServer {
var cfg = config.Get()
var servers []app.IServer
// todo generate the code to register http and grpc services here
// delete the templates code start
// 创建http服务
//httpAddr := ":" + strconv.Itoa(cfg.HTTP.Port)
//httpRegistry, httpInstance := registryService("http", cfg.App.Host, cfg.HTTP.Port)
//httpServer := server.NewHTTPServer(httpAddr,
// server.WithHTTPReadTimeout(time.Second*time.Duration(cfg.HTTP.ReadTimeout)),
// server.WithHTTPWriteTimeout(time.Second*time.Duration(cfg.HTTP.WriteTimeout)),
// server.WithHTTPRegistry(httpRegistry, httpInstance),
// server.WithHTTPIsProd(cfg.App.Env == "prod"),
//)
//servers = append(servers, httpServer)
// 创建grpc服务
grpcAddr := ":" + strconv.Itoa(cfg.Grpc.Port)
grpcRegistry, grpcInstance := registryService("grpc", cfg.App.Host, cfg.Grpc.Port)
grpcServer := server.NewGRPCServer(grpcAddr,
server.WithGrpcReadTimeout(time.Duration(cfg.Grpc.ReadTimeout)*time.Second),
server.WithGrpcWriteTimeout(time.Duration(cfg.Grpc.WriteTimeout)*time.Second),
server.WithGrpcRegistry(grpcRegistry, grpcInstance),
)
servers = append(servers, grpcServer)
// delete the templates code end
return servers
}
func registryService(scheme string, host string, port int) (registry.Registry, *registry.ServiceInstance) {
instanceEndpoint := fmt.Sprintf("%s://%s:%d", scheme, host, port)
cfg := config.Get()
switch cfg.App.RegistryDiscoveryType {
// 使用consul注册服务
case "consul":
iRegistry, instance, err := consul.NewRegistry(
cfg.Consul.Addr,
cfg.App.Name+"_"+scheme+"_"+host,
cfg.App.Name,
[]string{instanceEndpoint},
)
if err != nil {
panic(err)
}
return iRegistry, instance
// 使用etcd注册服务
case "etcd":
iRegistry, instance, err := etcd.NewRegistry(
cfg.Etcd.Addrs,
cfg.App.Name+"_"+scheme+"_"+host,
cfg.App.Name,
[]string{instanceEndpoint},
)
if err != nil {
panic(err)
}
return iRegistry, instance
// 使用nacos注册服务
case "nacos":
iRegistry, instance, err := nacos.NewRegistry(
cfg.NacosRd.IPAddr,
cfg.NacosRd.Port,
cfg.NacosRd.NamespaceID,
cfg.App.Name+"_"+scheme+"_"+host,
cfg.App.Name,
[]string{instanceEndpoint},
)
if err != nil {
panic(err)
}
return iRegistry, instance
}
return nil, nil
}
// -------------------------- 注册app需要释放的资源 -------------------------------------------
func registerCloses(servers []app.IServer) []app.Close {
var closes []app.Close
// 关闭服务
for _, s := range servers {
closes = append(closes, s.Stop)
}
// 关闭mysql
closes = append(closes, func() error {
return model.CloseMysql()
})
// 关闭redis
closes = append(closes, func() error {
return model.CloseRedis()
})
// 关闭trace
if config.Get().App.EnableTracing {
closes = append(closes, func() error {
ctx, _ := context.WithTimeout(context.Background(), 2*time.Second) //nolint
return tracer.Close(ctx)
})
}
return closes
}