config

package
v0.0.0-...-7429660 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 29, 2023 License: Apache-2.0 Imports: 20 Imported by: 0

README

framework Config模块使用手册

framework Config模块主要用于解析配置文件,支持多数据源加载,多文件加载,动态监听等功能。 目前最常用的使用方式是加载本地配置文件和远程配置文件。

加载配置文件

1.本地配置文件

一般使用framework框架时,默认情况下会使用约定路径下的配置文件,即服务运行路径下的 config/config.toml。 手动启动服务命令示例:./app 或者 ./app --config ./config/config.toml

框架加载配置文件的代码示例,以下代码是通过代码模版工具生成的,无需使用者手动添加。

func init() {
	configS := flag.String("config", "config/config.toml", "Configuration file")
	flag.Parse()
	// 加载配置文件
	framework.Init(framework.ConfigPath(*configS))
}

如果需要手动加载其他配置文件内容,可以通过以下附加方式实现。加载后会将之前的配置和本次加载的配置合并。

  • 注意:如果两个文件中存在相同配置项,那么后加载的会覆盖前者。使用者应该避免这种情况。
err := framework.File("/abs/path/xxx.json")
if err!=nil{
	panic(err)
}
2.加载远程配置文件

框架在加载本地配置文件的同时也会默认加载远程路径下的配置。 假设某服务的服务发现名是aa.bb.cc,那么默认的远程路径是: /service_config/aa/aa.bb.cc/config.toml

  • 注意:由于远程方式是后加载的,当本地配置与远程配置有相同配置项时,那么将以远程配置为准。 如果需要手动加载远程配置,可以通过以下附加方式实现。加载后会将之前的配置和本次加载的配置合并。
// 短路径
err := framework.Remote("/xxx")
if err != nil {
	panic(err)
}
3.加载namespace配置文件

为了支持同一个服务可以根据不同的配置内容来调用不同的资源,框架支持了namespace配置加载方式。 同样,框架会自动加载配置,不同的是,需要加上额外的参数,以下代码也是通过代码模版工具生成。无需手动添加。

	configS := flag.String("config", "config/config.toml", "Configuration file")
	appS := flag.String("app", "", "App dir")
	flag.Parse()
	framework.Init(
		framework.ConfigPath(*configS),
	)
	if *appS != "" {
		framework.InitNamespace(*appS)
	}

使用多namespace方式启动服务:

./app --app ./config/app

使用namespace时,配置文件的目录结构如下:

├── app
│   ├── meetstar
│   │   └── config.toml
│   └── starstar
│       └── config.toml
└── config.toml
  • 注意:app目录下的子目录meetstar和starstar将会任务是namespace名,用于区分不同的配置域,不同的配置资源。

同样,在使用namespace时,也会自动加载一个默认的远程路径配置。 假设上面示例的服务名是aa.bb.cc, 那么默认远程路径为:/service_config/aa/aa.bb.cc/meetstar/config.toml 和 /service_config/aa/aa.bb.cc/starstar/config.toml 同样远程配置内容会优先生效。

获取配置文件内容

在配置文件加载成功后,可以通过以下方式获取一个Config实例,通过它我们可以做一些更为丰富的操作。 Config实例提供的接口如下:


type Config interface {
	reader.Values
	LoadFile(f ...string) error
	LoadPath(p string, isPrefix bool, format string) error
	Sync() error
	Listen(interface{}) loader.Refresher
}

type Values interface {
	Bytes() []byte
	String() string
	Get(keys ...string) Value
	Map() map[string]interface{}
	Range(f func(k string, v interface{}))
	Scan(v interface{}) error
}
1.通用使用方式

下面介绍一些通用的使用方式:

    // 获取之前加载配置文件后的Config实例
    c := framework.ConfigInstance()

    // 重新加载所有资源,获取最新配置
    err := c.Sync()
    if err != nil{
	    panic(err)
    }

    // 将配置内容转为byte
    c.Bytes()

    // 将配置内容转为string
    c.String()

    // 将配置内容转为map
    c.Map()

    // 以map方式遍历配置
    c.Range(func(k string, v interface{}) {
	    fmt.Println("key:", k, "value:",v)
    })

    // 获取某个配置项的值
    v := c.Get("a","b", "c")
    vBool := v.Bool(false) // 取bool值,默认false
    vInt := v.Int(0) // 取整型值,默认0
    vStr := v.String("unknown") // 取string值,默认unknown

    // 将配置内容解析到一个自定义的struct中, v需要是个指针
    type xxx struct {
	
    }
    v := &xxx{}
    err := c.Scan(v)
    if err != nil {
	    // todo sth
    }

    // 动态监听一个struct变动, v需要是个指针
    l := c.Listen(v)
    // todo sth

    newv := r.Load().(*xxx)

2.namespace使用方式

由于namespace方式在框架加载配置时候就将配置文件资源做了隔离,所以使用方式与通用的稍微有点不同。 首先需要通过ctx方式获取相应的Config实例,之后的使用方式与通用的就一样了。 ctx中需要设置上相应的namespace值,ConfigInstanceCtx会根据该值获取对应的Config实例。

以下是示例代码,此处只是演示使用,通常情况下无需手动设置appkey,appkey会从请求中自动提取到。

	ctx := framework.WithAPPKey(context.Background(),"meetstar")
    // 获取Config实例,使用方式见:通用使用方式
    c := framework.ConfigInstanceCtx(ctx)
监听指定path的远程配置

框架默认情况下会将加载进去的资源做数据合并处理,当其中某一个资源变动时,所有配置内容就会被重新加载和整合。 有些情况下,我们只关心某个远程路径下的资源是否有变动。所以我们提供了比较便捷的方式来监听这种更新。

以下是示例代码:


    // 监听远程绝对路径:/service_config/aa/aa.bb.cc/test,当test中内容有更新时返回数据
	go func() {
		p := "/test"
		w := framework.WatchKV(p)
		for {
			// will block
			value := w.Next()
			fmt.Println("watch kv>>>>>>>>", value[p])
		}
	}()

    // 远程资源:
    // 路径1:/service_config/aa/aa.bb.cc/test/a/a.toml
    // 路径2:/service_config/aa/aa.bb.cc/test/b/b.toml
    
    // 监听远程路径前缀:/service_config/aa/aa.bb.cc/test, 当a.toml或b.toml有更新时返回数据
    // Next返回值是个map, key为短路径:/a/a.toml, /b/b.toml, value为该路径对应的值
	go func() {
		p := "/test"
		w := framework.WatchPrefix(p)
		for {
			// will block
			value := w.Next()
			fmt.Println("watch prefix>>>>>>>>", value)
		}
	}()

    // 直接获取远程配置
    str, err := framework.RemoteKV(p)
    if err != nil {
    	panic(err)
    }
    

Documentation

Overview

Package config is an interface for dynamic configuration.

Index

Constants

This section is empty.

Variables

View Source
var ConsulAddr = "127.0.0.1:8500"
View Source
var Default = New()

Default is a default config instance

Functions

func Bytes

func Bytes() []byte

Bytes wrap Default's Bytes func

func Consul

func Consul(paths ...string) error

Consul wrap Default Load func, it's represents Default load multi consul config path

func DefaultRemotePath

func DefaultRemotePath(sdname, path string) string

DefaultRemotePath

func Files

func Files(files ...string) error

Files wrap Default Load func, it's represents Default load multi config files

func Get

func Get(keys ...string) reader.Value

Get wrap Default's Get func

func JSONEncoder

func JSONEncoder() encoder.Encoder

JSONEncoder represents a toml encoder

func Listen

func Listen(structPtr interface{}) loader.Refresher

Listen wrap Default's Listen func, use for watching a struct data which maybe change anytime

func Map

func Map() map[string]interface{}

Map wrap Default's Map func

func Parse

func Parse(data string, format string, structPtr interface{}) error

Parse parse value to a struct

func Range

func Range(f func(k string, v interface{}))

Range wrap Default's Range func

func RemoteKV

func RemoteKV(p string) (string, error)

RemoteKV wrap Default's RemoteKV func, get kv string by remote path

func Scan

func Scan(v interface{}) error

Scan wrap Default's Scan func

func String

func String() string

String wrap Default's String func

func Sync

func Sync() error

Sync wrap Default's Sync func, use for reloading config

func TomlEncoder

func TomlEncoder() encoder.Encoder

TomlEncoder represents a toml encoder

Types

type Config

type Config interface {
	reader.Values
	LoadFile(f ...string) error
	LoadPath(p string, isPrefix bool, format string) error
	Sync() error
	Listen(interface{}) loader.Refresher
}

Config represents a config instance

func New

func New(opts ...Option) Config

New make a new config

type Namespace

type Namespace struct {
	// contains filtered or unexported fields
}

func NewNamespace

func NewNamespace(namespace string) *Namespace

func NewNamespaceD

func NewNamespaceD() *Namespace

func (*Namespace) Get

func (m *Namespace) Get(resource string) Config

func (*Namespace) GetD

func (m *Namespace) GetD(resource, filename string, remoteFirst bool) Config

func (*Namespace) GetMemoryD

func (m *Namespace) GetMemoryD(mem []byte) Config

func (*Namespace) With

func (m *Namespace) With(resource string) *Namespace

type Option

type Option func(o *Options)

Option represents a func

func WithSource

func WithSource(s source.Source) Option

WithSource appends a source to list of sources

type Options

type Options struct {
	Source []source.Source
}

Options represents a option on the source

type Watcher

type Watcher interface {
	Next() map[string]string
}

func WatchKV

func WatchKV(p string, prefix ...string) Watcher

WatchPath wrap Default's WatchPath func, use for watching remote path data which maybe change anytime

func WatchPrefix

func WatchPrefix(p string) Watcher

WatchPrefix wrap Default's WatchPath func, use for watching remote path data which maybe change anytime

Directories

Path Synopsis
Package encoder handles source encoding formats
Package encoder handles source encoding formats
ini
xml
package loader manages loading from multiple sources
package loader manages loading from multiple sources
Package reader parses change sets and provides config values
Package reader parses change sets and provides config values
Package source is the interface for sources
Package source is the interface for sources
file
Package file is a file source.
Package file is a file source.
memory
Package memory is a memory source
Package memory is a memory source

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL