gf icon indicating copy to clipboard operation
gf copied to clipboard

如何保证自定义的配置初始化先于 logic 执行

Open dahai-cui opened this issue 3 weeks ago • 1 comments

Go version go version go1.22.10 linux/amd64

GoFrame version v2.6.0

What do you want to ask?

  1. 我把链接到 nacos, 并获取指定 dataId 配置信息的 nacosClient, 通过 g.Cfg().SetAdapter(nacosClient) 设置为配置来源,并把这封装为独立项目之外的 pkg repo
  2. 然后 goframe 的项目在 main.go 中通过 import _ "gitlab.private.com/op/rubick/config/nacos" 来触发其初始化并执行 SetAdapter
  3. 同时在 main.go 中会有 import _ "xxxx/internal/logic" 来触发服务注册的逻辑,这是 goframe 框架的约定
  4. 而我在 logic 的 init() 中会有读取 g.Cfg() 中配置的逻辑,比如:

import (
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/os/gctx"
)

type sMeego struct {
	ProjectId            string
}
func init() {
	service.RegisterMeego(New())
}

func New() *sMeego {
	ctx := gctx.New()
	// appId := g.Cfg().MustGet(ctx, "meego.pluginId")
	// appSecret := g.Cfg().MustGet(ctx, "meego.pluginSecret")
	s := &sMeego{
		ProjectId:            g.Cfg().MustGet(ctx, "meego.projectId").String(),
	}
	return s
}
  1. 在 main.go 的 import 中, 我们的 import 顺序大概是

import (
	_ "gitlab.private.com/op/rubick/config/nacos"
	_ "gitlab.private.com/op/acd/internal/logic"
	"github.com/gogf/gf/v2/os/gctx"
	"gitlab.private.com/op/acd/internal/cmd"
)
  1. 遇到的问题:并不是所有的 logic 的 init 中都能够使用 nacosClient 来获取配置,实际验证下来,有部分 logic 执行 init 时,import "gitlab.private.com/op/rubick/config/nacos" 还未执行,导致其使用默认的 FileAdapter, 进而读取不到配置,比如前面举例中的 meego,而有些 logic 的 init 会在 nacos 之后,进而能正常获取配置

  2. 实际尝试下来的结论是:g.Cfg() 执行时,如果 nacos 的 SetAdapter 未执行,就看不到配置,而框架又不能可靠保证先 import nacos

  3. 如何保证自定义的初始化可靠的先被执行,或者我使用的姿势不对?

dahai-cui avatar Dec 04 '25 04:12 dahai-cui

虽然不知道你的项目具体情况,我按照goframe推荐的项目结果,一般的准备工作会放在/internal/boot中,按顺序初始化一些东西例如nacosAdapter然后在/internal/cmd中置顶import ( _ "xxxx/internal/boot" )然后再去import需要依赖上一阶段结果的下一阶段依赖

LanceAdd avatar Dec 05 '25 02:12 LanceAdd