Skip to content

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

@dahai-cui

Description

@dahai-cui

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. 如何保证自定义的初始化可靠的先被执行,或者我使用的姿势不对?

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions