我正在尝试使用uber fx为 go 微服务项目进行依赖注入。
因为所有的微服务都需要构建一个基础服务器,并设置各种配置选项(常用中间件、缓冲区大小等)(我使用的是Fiber)。但是这些不同的微服务也有微服务独有的配置选项。也许是数据库连接字符串、jwt 键等。
我创建了一个接口,用于创建通用基础应用程序的共享函数,具有通用选项,但是任何需要依赖配置结构的函数都会失败,因为期望该微服务的配置的特定版本。
无法构建 *fiber.App:缺少函数“some-path/http”的依赖项。CreateServer(some-path/http/http.go:65):缺少类型:*http.Config 退出状态 1
最小的例子:
package http
import (
"time"
"github.com/gofiber/fiber/v2"
)
type BaseConfig interface {
GetPort() string
GetTimeout() int
}
type Config struct {
Port string `env:"LISTEN_ADDR" envDefault:":3000"`
Timeout uint64 `env:"TIMEOUT" envDefault:"10"`
}
func (c *Config) GetPort() string {
return c.Port
}
func (c *Config) GetTimeout() int {
return int(c.Timeout)
}
func CreateServer(config *Config) *fiber.App {
fiberConfig := fiber.Config{
ReadTimeout: time.Second * time.Duration(config.GetTimeout()),
WriteTimeout: time.Second * time.Duration(config.GetTimeout()),
}
app := fiber.New(fiberConfig)
// do setup and other stuff
return app
}
一些服务/配置/config.go
package config
import (
"github.com/caarlos0/env/v6"
"github.com/rs/zerolog/log"
)
type Config struct {
Port string `env:"LISTEN_ADDR" envDefault:":3000"`
Timeout uint64 `env:"TIMEOUT" envDefault:"10"`
// some service specific stuff as well
}
func Parse() (*Config, error) {
cfg := Config{}
if err := env.Parse(&cfg); err != nil {
return nil, err
}
return &cfg, nil
}
func (c *Config) GetPort() string {
return c.Port
}
func (c *Config) GetTimeout() int {
return int(c.Timeout)
}
凤凰求蛊
相关分类