From 3ea6da4189369c8f9f122cfe96d072884a908c1a Mon Sep 17 00:00:00 2001 From: Ricky-chen1 Date: Mon, 12 Feb 2024 21:31:19 +0800 Subject: [PATCH] fix: utils.Option usage --- README.md | 54 +++++++++++++++++++---------------------- README_CN.md | 55 ++++++++++++++++++++---------------------- client/suite.go | 13 ++-------- example/client/main.go | 10 +------- example/server/main.go | 10 +------- monitor/monitor.go | 16 +++++++++--- server/suite.go | 12 ++------- utils/utils.go | 6 +++-- 8 files changed, 74 insertions(+), 102 deletions(-) diff --git a/README.md b/README.md index efd9c42..521ddbf 100644 --- a/README.md +++ b/README.md @@ -32,15 +32,6 @@ import ( "github.com/kitex-contrib/config-file/filewatcher" "github.com/kitex-contrib/config-file/parser" fileserver "github.com/kitex-contrib/config-file/server" - "github.com/kitex-contrib/config-file/utils" -) - -var _ api.Echo = &EchoImpl{} - -const ( - filepath = "kitex_server.json" - key = "ServiceName" - serviceName = "ServiceName" ) var _ api.Echo = &EchoImpl{} @@ -83,17 +74,10 @@ func main() { } defer fw.StopWatching() - // customed by user - params := &parser.ConfigParam{} - opts := &utils.Options{ - CustomParser: &MyParser{}, - CustomParams: params, - } - svr := echo.NewServer( new(EchoImpl), kitexserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serviceName}), - kitexserver.WithSuite(fileserver.NewSuite(key, fw, opts)), // add watcher + kitexserver.WithSuite(fileserver.NewSuite(key, fw)), // add watcher ) if err := svr.Run(); err != nil { log.Println("server stopped with error:", err) @@ -123,14 +107,13 @@ import ( fileclient "github.com/kitex-contrib/config-file/client" "github.com/kitex-contrib/config-file/filewatcher" "github.com/kitex-contrib/config-file/parser" - "github.com/kitex-contrib/config-file/utils" ) const ( filepath = "kitex_client.json" key = "ClientName/ServiceName" serviceName = "ServiceName" - clientName = "ClientName" + clientName = "echo" ) // customed by user @@ -163,17 +146,10 @@ func main() { os.Exit(1) }() - // customed by user - params := &parser.ConfigParam{} - opts := &utils.Options{ - CustomParser: &MyParser{}, - CustomParams: params, - } - client, err := echo.NewClient( serviceName, kitexclient.WithHostPorts("0.0.0.0:8888"), - kitexclient.WithSuite(fileclient.NewSuite(serviceName, key, fw, opts)), + kitexclient.WithSuite(fileclient.NewSuite(serviceName, key, fw)), ) if err != nil { log.Fatal(err) @@ -192,9 +168,29 @@ func main() { } ``` -#### File Configuration Format +#### File Configuration + +##### Custom Parser + +The configuration format supports `json` and `yaml` by default. You can implement a custom parser by implementing the `ConfigParser` interface and pass in a custom function in `NewSuite` -The configuration format supports `json` and `yaml` by default. You can implement a custom parser by implementing the `ConfigParser` interface, and pass in the custom parser and custom parameters through `utils.Options` when `NewSuite` +Interface definition: +```go +// ConfigParser the parser for config file. +type ConfigParser interface { + Decode(kind ConfigType, data []byte, config interface{}) error +} +``` + +Custom function example: +```go +func withParser(o *utils.Options) { + o.Parser = &MyParser{} + o.Params = &parser.ConfigParam{ + Type: parser.YAML, + } +} +``` #### Governance Policy > The service name is `ServiceName` and the client name is `ClientName`. diff --git a/README_CN.md b/README_CN.md index fe70cfa..efa16c0 100644 --- a/README_CN.md +++ b/README_CN.md @@ -32,15 +32,6 @@ import ( "github.com/kitex-contrib/config-file/filewatcher" "github.com/kitex-contrib/config-file/parser" fileserver "github.com/kitex-contrib/config-file/server" - "github.com/kitex-contrib/config-file/utils" -) - -var _ api.Echo = &EchoImpl{} - -const ( - filepath = "kitex_server.json" - key = "ServiceName" - serviceName = "ServiceName" ) var _ api.Echo = &EchoImpl{} @@ -83,17 +74,10 @@ func main() { } defer fw.StopWatching() - // customed by user - params := &parser.ConfigParam{} - opts := &utils.Options{ - CustomParser: &MyParser{}, - CustomParams: params, - } - svr := echo.NewServer( new(EchoImpl), kitexserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serviceName}), - kitexserver.WithSuite(fileserver.NewSuite(key, fw, opts)), // add watcher + kitexserver.WithSuite(fileserver.NewSuite(key, fw)), // add watcher ) if err := svr.Run(); err != nil { log.Println("server stopped with error:", err) @@ -123,14 +107,13 @@ import ( fileclient "github.com/kitex-contrib/config-file/client" "github.com/kitex-contrib/config-file/filewatcher" "github.com/kitex-contrib/config-file/parser" - "github.com/kitex-contrib/config-file/utils" ) const ( filepath = "kitex_client.json" key = "ClientName/ServiceName" serviceName = "ServiceName" - clientName = "ClientName" + clientName = "echo" ) // customed by user @@ -163,17 +146,10 @@ func main() { os.Exit(1) }() - // customed by user - params := &parser.ConfigParam{} - opts := &utils.Options{ - CustomParser: &MyParser{}, - CustomParams: params, - } - client, err := echo.NewClient( serviceName, kitexclient.WithHostPorts("0.0.0.0:8888"), - kitexclient.WithSuite(fileclient.NewSuite(serviceName, key, fw, opts)), + kitexclient.WithSuite(fileclient.NewSuite(serviceName, key, fw)), ) if err != nil { log.Fatal(err) @@ -192,8 +168,29 @@ func main() { } ``` -#### File配置格式 -配置格式默认支持`json`和`yaml`,可以通过实现`ConfigParser`接口实现自定义解析器,并在`NewSuite`的时候通过`utils.Options`传入自定义解析器以及自定义参数 +#### File配置 + +##### 自定义解析器 + +配置格式默认支持`json`和`yaml`,可以通过实现`ConfigParser`接口实现自定义解析器,并在`NewSuite`的时候传入自定义函数 + +接口定义: +```go +// ConfigParser the parser for config file. +type ConfigParser interface { + Decode(kind ConfigType, data []byte, config interface{}) error +} +``` + +自定义函数示例: +```go +func withParser(o *utils.Options) { + o.Parser = &MyParser{} + o.Params = &parser.ConfigParam{ + Type: parser.YAML, + } +} +``` #### 治理策略 > 服务名称为 ServiceName,客户端名称为 ClientName diff --git a/client/suite.go b/client/suite.go index 8b851b3..9878870 100644 --- a/client/suite.go +++ b/client/suite.go @@ -28,21 +28,12 @@ type FileConfigClientSuite struct { } // NewSuite service is the destination service. -func NewSuite(service, key string, watcher filewatcher.FileWatcher, opts *utils.Options) *FileConfigClientSuite { - cm, err := monitor.NewConfigMonitor(key, watcher) +func NewSuite(service, key string, watcher filewatcher.FileWatcher, opts ...utils.Option) *FileConfigClientSuite { + cm, err := monitor.NewConfigMonitor(key, watcher, opts...) if err != nil { panic(err) } - // use custom parser - if opts.CustomParser != nil { - cm.SetParser(opts.CustomParser) - } - - if opts.CustomParams != nil { - cm.SetParams(opts.CustomParams) - } - return &FileConfigClientSuite{ watcher: cm, service: service, diff --git a/example/client/main.go b/example/client/main.go index 1955789..a913cf5 100644 --- a/example/client/main.go +++ b/example/client/main.go @@ -29,7 +29,6 @@ import ( fileclient "github.com/kitex-contrib/config-file/client" "github.com/kitex-contrib/config-file/filewatcher" "github.com/kitex-contrib/config-file/parser" - "github.com/kitex-contrib/config-file/utils" ) const ( @@ -69,17 +68,10 @@ func main() { os.Exit(1) }() - // customed by user - params := &parser.ConfigParam{} - opts := &utils.Options{ - CustomParser: &MyParser{}, - CustomParams: params, - } - client, err := echo.NewClient( serviceName, kitexclient.WithHostPorts("0.0.0.0:8888"), - kitexclient.WithSuite(fileclient.NewSuite(serviceName, key, fw, opts)), + kitexclient.WithSuite(fileclient.NewSuite(serviceName, key, fw)), ) if err != nil { log.Fatal(err) diff --git a/example/server/main.go b/example/server/main.go index ee4f060..b7be1be 100644 --- a/example/server/main.go +++ b/example/server/main.go @@ -27,7 +27,6 @@ import ( "github.com/kitex-contrib/config-file/filewatcher" "github.com/kitex-contrib/config-file/parser" fileserver "github.com/kitex-contrib/config-file/server" - "github.com/kitex-contrib/config-file/utils" ) var _ api.Echo = &EchoImpl{} @@ -70,17 +69,10 @@ func main() { } defer fw.StopWatching() - // customed by user - params := &parser.ConfigParam{} - opts := &utils.Options{ - CustomParser: &MyParser{}, - CustomParams: params, - } - svr := echo.NewServer( new(EchoImpl), kitexserver.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serviceName}), - kitexserver.WithSuite(fileserver.NewSuite(key, fw, opts)), // add watcher + kitexserver.WithSuite(fileserver.NewSuite(key, fw)), // add watcher ) if err := svr.Run(); err != nil { log.Println("server stopped with error:", err) diff --git a/monitor/monitor.go b/monitor/monitor.go index 04c6c1c..5cdd11f 100644 --- a/monitor/monitor.go +++ b/monitor/monitor.go @@ -22,6 +22,7 @@ import ( "github.com/cloudwego/kitex/pkg/klog" "github.com/kitex-contrib/config-file/filewatcher" "github.com/kitex-contrib/config-file/parser" + "github.com/kitex-contrib/config-file/utils" ) type ConfigMonitor interface { @@ -54,7 +55,7 @@ type configMonitor struct { } // NewConfigMonitor init a monitor for the config file -func NewConfigMonitor(key string, watcher filewatcher.FileWatcher) (ConfigMonitor, error) { +func NewConfigMonitor(key string, watcher filewatcher.FileWatcher, opts ...utils.Option) (ConfigMonitor, error) { if key == "" { return nil, errors.New("empty config key") } @@ -62,12 +63,21 @@ func NewConfigMonitor(key string, watcher filewatcher.FileWatcher) (ConfigMonito return nil, errors.New("filewatcher is nil") } + option := &utils.Options{ + Parser: parser.DefaultConfigParser(), + Params: parser.DefaultConfigParam(), + } + + for _, opt := range opts { + opt(option) + } + return &configMonitor{ fileWatcher: watcher, key: key, callbacks: make(map[int64]func(), 0), - parser: parser.DefaultConfigParser(), - params: parser.DefaultConfigParam(), + parser: option.Parser, + params: option.Params, }, nil } diff --git a/server/suite.go b/server/suite.go index 4732dde..f3e68fb 100644 --- a/server/suite.go +++ b/server/suite.go @@ -27,20 +27,12 @@ type FileConfigServerSuite struct { } // NewSuite service is the destination service. -func NewSuite(key string, watcher filewatcher.FileWatcher, opts *utils.Options) *FileConfigServerSuite { - cm, err := monitor.NewConfigMonitor(key, watcher) +func NewSuite(key string, watcher filewatcher.FileWatcher, opts ...utils.Option) *FileConfigServerSuite { + cm, err := monitor.NewConfigMonitor(key, watcher, opts...) if err != nil { panic(err) } - // use custom parser - if opts.CustomParser != nil { - cm.SetParser(opts.CustomParser) - } - if opts.CustomParams != nil { - cm.SetParams(opts.CustomParams) - } - return &FileConfigServerSuite{ watcher: cm, } diff --git a/utils/utils.go b/utils/utils.go index 014c064..3be38e9 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -23,10 +23,12 @@ import ( ) type Options struct { - CustomParser parser.ConfigParser - CustomParams *parser.ConfigParam + Parser parser.ConfigParser + Params *parser.ConfigParam } +type Option func(o *Options) + // PathExists check whether the file or directory exists func PathExists(path string) (bool, error) { _, err := os.Stat(path)