Paladin SDK

配置模块化

进行配置的模块化是为了更好地管理配置,尽可能避免由修改配置带来的失误。
在配置种类里,可以看到其实 环境配置 和 应用配置 已经由平台进行管理化。
我们通常业务里只用配置 业务配置 和 在线配置 就可以了,之前我们大部分都是单个文件配置,而为了更好管理我们需要按类型进行拆分配置文件。

例如:

名称 说明
application.toml 在线配置
mysql.toml 业务db配置
hbase.toml 业务hbase配置
memcache.toml 业务mc配置
redis.toml 业务redis配置
http.toml 业务http client/server/auth配置
grpc.toml 业务grpc client/server配置

使用方式

paladin 是一个config SDK客户端,包括了remote、file、mock几个抽象功能,方便使用本地文件或者远程配置中心,并且集成了对象自动reload功能。

远程配置中心

可以通过环境变量注入,例如:APP_ID/DEPLOY_ENV/ZONE/HOSTNAME,然后通过paladin实现远程配置中心SDK进行配合使用。

指定本地文件:

  1. ./cmd -conf=/data/conf/app/demo.toml
  2. # or multi file
  3. ./cmd -conf=/data/conf/app/

mock配置文件

  1. func TestMain(t *testing.M) {
  2. mock := make(map[string]string])
  3. mock["application.toml"] = `
  4. demoSwitch = false
  5. demoNum = 100
  6. demoAPI = "xxx"
  7. `
  8. paladin.DefaultClient = paladin.NewMock(mock)
  9. }

example main

  1. // main.go
  2. func main() {
  3. flag.Parse()
  4. // 初始化paladin
  5. if err := paladin.Init(); err != nil {
  6. panic(err)
  7. }
  8. log.Init(nil) // debug flag: log.dir={path}
  9. defer log.Close()
  10. }

example HTTP/gRPC

  1. # http.toml
  2. [server]
  3. addr = "0.0.0.0:9000"
  4. timeout = "1s"
  1. // server.go
  2. func NewServer() {
  3. // 默认配置用nil,这时读取HTTP/gRPC构架中的flag或者环境变量(可能是docker注入的环境变量,默认端口:8000/9000)
  4. engine := bm.DefaultServer(nil)
  5. // 除非自己要替换了配置,用http.toml
  6. var bc struct {
  7. Server *bm.ServerConfig
  8. }
  9. if err := paladin.Get("http.toml").UnmarshalTOML(&bc); err != nil {
  10. // 不存在时,将会为nil使用默认配置
  11. if err != paladin.ErrNotExist {
  12. panic(err)
  13. }
  14. }
  15. engine := bm.DefaultServer(bc.Server)
  16. }

example Service(在线配置热加载配置)

  1. # service.go
  2. type Service struct {
  3. ac *paladin.Map
  4. }
  5. func New() *Service {
  6. // paladin.Map 通过atomic.Value支持自动热加载
  7. var ac = new(paladin.TOML)
  8. if err := paladin.Watch("application.toml", ac); err != nil {
  9. panic(err)
  10. }
  11. s := &Service{
  12. ac: ac,
  13. }
  14. return s
  15. }
  16. func (s *Service) Test() {
  17. sw, err := s.ac.Get("switch").Bool()
  18. if err != nil {
  19. // TODO
  20. }
  21. // or use default value
  22. sw := paladin.Bool(s.ac.Get("switch"), false)
  23. }