Comments (6)
我刚刚又想了下。
如果在DefaultNamespace定义过的Namespace就会去加载配置。
导致需要加载的Namespace变成(DefaultNamespace + PreloadNamespaces)的并集.
这两个可选参数之间的部分功能是重合的。
Apollo的默认Namespace是application。默认情况下sdk也是将DefaultNamespace设置为application,如果不设置,导致DefaultNamespace变成一个必填参数, 否则在Get时无默认Namespace可用
而设置了默认Namespace而不去加载,又会导致行为不一致。
在实际使用过程中,application并不是总是存在。会有使用者不使用,不发布。导致一些意外的问题。issue
还是让配置项的功能,职责单纯比较好,哪怕可能会有少许啰嗦
from agollo.
1.你可以把sdk看作是一个map,在没有PreloadNamespaces或者AutoFetchOnCacheMiss选项去初始化时。
就是一个空的map,get任何值都会是空。
// 假如Apollo中有namespace: application 内容: timeout:100
// agollo.Init 前
cache := map[string]map[string]interface{}{}
// agollo.Init,添加PreloadNamespaces("application") 进行初始化
agollo.Init(
...,
agollo.PreloadNamespaces("application"),
)
// agollo.Init 后
cache := map[string]map[string]interface{}{
"application": map[string]interface{}{
"timeout": 100,
},
}
fmt.Println(agollo.Get("timeout") // print 100
- 这个map是有两层的,map[namespace]map[key]value。DefaultNamespace是设置Get时,如果没有传agollo.WithNamespace,设置默认使用什么namespace读取配置的配置选项。默认情况下使用application作为默认的namespace
// 假如Apollo中
// 有namespace: application 内容: timeout:100
// 有namespace: config2 内容: timeout:222
// 没使用DefaultNamespace
agollo.Init(
...,
agollo.PreloadNamespaces("application", "config2"),
)
// agollo.Get("timeout") == cache["application"]["timeout"]
fmt.Println(agollo.Get("timeout")) // print 100
// agollo.Get("timeout"), agollot.WithNamespace("config2") == cache["config2"]["timeout"]
fmt.Println(agollo.Get("timeout"), agollot.WithNamespace("config2")) // print 222
// 如果使用DefaultNamespace后
agollo.Init(
...,
agollo.DefaultNamespace("config2")
agollo.PreloadNamespaces("application", "config2"),
)
// agollo.Get("timeout") == cache["config2"]["timeout"]
fmt.Println(agollo.Get("timeout") ) // print 222
from agollo.
謝謝您的解說
已給 star
跟 viper 的結合很棒
只是預想 default 值
應該是 init 就會採用
結果居然得到 是一个空的map
感覺不太符合一般人思路?
還要另外設定 PreloadNamespaces 的數值, 且這個值 跟 default 一樣
才可正常連線到 apollo
謝謝你提供這個 lib
或許說明文件可以提一下
我自己嘗試, 依照你的文件
單獨設置 AutoFetchOnCacheMiss 雖然可以讀取
但沒有明顯的 namespace , 會怕連錯
所以 try 很久
from agollo.
感谢你的反馈和star。
确实有你说的一个问题,我在Default的时候设置了,且在Preload列表中不存在时,却没有去加载,Default设置的这个namespace应该是确切存在,使用者才会传入。
在增加DefaultNamespace这个option的时候,我只考虑到改变Get的行为,
它只是为了简化使用单一Namespace时,且默认使用的namespace不是application时,可以通过这个选项,重置Get默认读取的Namepsace行为。
不然默认读取的namespace不是application时,每次Get都需要传递agollo.WithNamespace("xxx")
PreloadNamespaces跟DefaultNamespace还是不同的,就像你最后说的,指明所需要用的namespace进行初始化
from agollo.
我想了一下, 初始值跟預設值, 或許應該分開來看
default 是沒給數值時, 才採用的
你現在的作法
似乎是 把 DefaultNamespace 初始值 定為 application?
換成這個作法, 您覺得如何呢?
將預設值的初始值 定為空字串
等到實際進行 GET 動作, 發現 DefaultNamespace 為空字串
這時候設置才為設置為 application
可能你之前就這樣做了
只是我太偷懶 沒認真看懂你回覆的東西
from agollo.
我觉得一定程度是,我取的这个Option的名字(DefaultNamespace)不太清晰,还有本身逻辑有一定交织
Apollo本身的DefaultNamespace 和 调用Get方法时的DefaultNamespace
可能设置为SetGetDefaultNamespace之类的,会更清晰。
所以在设置DefaultNamespace后还要再PreloadNamespaces中重复定义一次,感觉确实有点别扭
按照你说的逻辑优化了一下,DefaultNamespace初始值为空,實際進行 GET 動作时,DefaultNamespace为空再设置application
commit
release
from agollo.
Related Issues (20)
- agollo v1.2.8, 启用从备份文件加载时, 在调用GetNameSpace(key)正常时, 会将备份文件的其他namespace的数据删除 HOT 1
- 能否为ApolloClient提供自定义签名入口 HOT 8
- 我不想要备份文件, 可以去掉么, 它无论如何都会创建一个备份文件我关不掉 HOT 6
- go mod tidy 报错 HOT 4
- 此客户端是如何支持多环境配置的? HOT 1
- can't get value by Env? HOT 2
- 没有贡献值不开心啊 HOT 4
- apollo中使用yaml格式的配置文件,viper读取为空 HOT 3
- 与viper 一起用时候怎么切换或者说选择apollo的cluster呢 HOT 4
- 为什么app.properties文件下储存的是json格式而不是property格式? HOT 1
- 为什么除了properties类型的数据能拉到,其他Json,Yaml的都拉不出来呢? HOT 1
- 用golang 1.18构建后拉不到配置,1.17正常。 HOT 5
- 可否加一个关闭备份选项
- 使用viper时,是否能暴露一个配置变更的方法 HOT 2
- agollo.Start()和viper同用时,配置变更后的读取操作会存在并发问题 HOT 1
- viper说明文档 好像不全 HOT 1
- viper 支持 secretKey HOT 1
- 签名计算bug HOT 3
- 启动后提示函数time.UnixMilli()错误
- 依赖的github.com/bketelsen/crypt 版本太低,存在 CWE-285/CWE-770/CWE-125/CWE-863/CWE-79安全漏洞
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from agollo.